git autocompletar para * sucursales * en la línea de comando?

En mi máquina Linux tengo autocompletado para sucursales con Git.

[Tenga en cuenta que estamos hablando de la finalización de la rama de git, no de la finalización de bash (por ejemplo, comandos, archivos, etc.). Por lo tanto, NO es la respuesta de Lane en absoluto]

Por ejemplo, puedo escribir git checkout+ TABy obtener una lista de sucursales.

O puedo escribir git checkout feb*+ TABpara obtener todas las ramas que comienzan con "feb".

¿Cómo puedo obtener esta funcionalidad en una Mac?

Intenté descargar y ejecutar bash-completion/bash_completion, bash-completion/bash_completion.sh.inpero no me alegré. El primero dio mensajes de error sobre declare: -A invalid_option. El segundo no dio errores. Cuando hago git checkout+ TAB, sigo obteniendo una lista de archivos en el directorio, no ramas. Estoy en la raíz del proyecto.

La función de autocompletar para directorios y los comandos bash funcionan correctamente, por lo que es específico de Git.

Me acabo de unir a esta comunidad, así que todavía no puedo responder, pero encontré que "oh-my-zsh" es muy útil y me gusta mucho la interfaz de usuario: github.com/ohmyzsh/ohmyzsh Esto es, por supuesto, para las personas utilizando zsh. Supongo que no funciona para bash...
Ahora que la Mac usa zsh en lugar de bash , esta respuesta puede resultar útil.
para usuarios de zsh: echo 'autoload -Uz compinit && compinit' >> ~/.zshrc && . ~/.zshrc enlace

Respuestas (15)

Ok, entonces necesitaba el script de autocompletado de git .

Obtuve eso de esta URL usando el siguiente comando en la aplicación Terminal:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

No debe preocuparse por el directorio en el que se encuentra cuando ejecuta esto, ya que su directorio de inicio ( ~) se usa con el objetivo.

Luego agregué a mi ~/.bash_profilearchivo el siguiente código 'ejecutar si existe':

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

Actualización: estoy haciendo que estos fragmentos de código sean más concisos para reducir mi .bashrcarchivo, en este caso ahora uso:

test -f ~/.git-completion.bash && . $_

Nota: $_significa el último argumento del comando anterior. entonces . $_significa ejecutarlo - siendo "eso" .git-completion.bashen este caso

Esto todavía funciona tanto en Ubuntu como en OSX y en máquinas sin la secuencia de .git-completion.bashcomandos.

¡ Ahora git Tab(en realidad es git TabTab) funciona a las mil maravillas!

pd: si esto no funciona de inmediato, es posible que deba ejecutar chmod u+x ~/.git-completion.bashpara otorgarse el permiso necesario:

  • chmodes el comando que modifica los permisos de archivo
  • usignifica el usuario propietario del archivo, por defecto su creador, es decir, usted
  • +significa establecer/activar/agregar un permiso
  • xsignifica permiso de ejecución, es decir, la capacidad de ejecutar el script
Sí, reiniciar la terminal después de agregar el script bash hizo que funcionara. Estaba sentado aquí preguntándome por qué seguía intentando autocompletar en mi Modelscarpeta cuando presioné m Tabpara que se autocompletara en master.
Consulte también unix.stackexchange.com/q/48862/10043 para obtener un consejo diferente
Si la respuesta aceptada no funciona para nadie, intente esto: source ~/.bash_profiledespués de pegar el código. Reiniciar el terminal también hará lo mismo.
¡Gracias! Probé algunas otras cosas pero nada funcionó (incluido este github.com/bobthecow/git-flow-completion/wiki/… ). Tu solución funcionó a las mil maravillas ;)
(no tiene brew gitpero Apple predeterminado git) brew install gity reinicie la terminal para aquellos que enfrentan errores extraños comogit checunknown option: --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config usage: git [--version] [--help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>]
Hice esto en una computadora más antigua, copié mi bash_profile a mi nueva computadora, pero la función de autocompletar no funcionó. Olvidé que tenía que curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bashGracias de nuevo :)
@Sachin Publiqué la solución para su problema aquí: apple.stackexchange.com/a/350790/18664
Un cambio interesante que podría realizar en el script de shell es probar si el archivo no está allí, si no, luego curvar el script y buscarlo.
Resolver en zsh siguiendo la respuesta. stackoverflow.com/a/26479426/5293521
¿Alguien sabe cómo hacer que muestre solo las sucursales locales? También muestra todas las sucursales remotas.
Para MacOS Catalina, esto ya no funciona. Solución en esta respuesta: apple.stackexchange.com/a/381958/81900
git-completion.bashestá obsoleto: los usuarios de MacOS deben usar el contenedor de finalización zsh para git git-completion.zshen su lugar: github.com/git/git/blob/master/contrib/completion/…
@Nefeline Recibí el mismo error. ¿Podría señalarme la respuesta correcta sobre cómo usar el envoltorio zsh?
esto resolvió el autocompletado de git. Gracias

Algunas personas prefieren usar un administrador de paquetes para automatizar la instalación, actualización y configuración de los paquetes de Mac OS. Soy fanático de los administradores de paquetes, y creo que Homebrew es el mejor administrador de paquetes para Mac OS (algunos dirían que es el administrador de paquetes de facto de Mac OS).

Una vez que haya instalado Homebrew, simplemente puede instalar git junto con bash-completion con brew install git bash-completion.

A continuación, deberá poner lo siguiente en su ~/.bash_profile:

if [ -f `brew --prefix`/etc/bash_completion.d/git-completion.bash ]; then
  . `brew --prefix`/etc/bash_completion.d/git-completion.bash
fi

(Nota: si esta instalación falla con un error 404 y ya tiene git instalado, simplemente elimine la parte de git de esta instalación de preparación)

Más información sobre la instalación de git y bash-completion con brew aquí.

Agregar gity agregar bash-completionno es lo mismo que agregar .git-completion.bashSon programas diferentes y hacen cosas bastante diferentes: uno hace el autocompletado de comandos bash y el otro hace el autocompletado de comandos git y 'nair los dos se encontrarán;)
trabajando como un encanto, muchas gracias. ¿Podría explicar cuál es el uso de la secuencia de comandos en la que me agregó ~/.bash_profile?
A pesar de lo que otros han dicho sobre esta respuesta, es la que hizo que git autocompletar funcionara en la terminal.
Tenga en cuenta que las líneas para agregar en el ~/.bash_profilese especificaron para mí en la salida de homebrew. Usé esos en lugar de las líneas anteriores. Luego, debe volver a cargar el perfil de bash en cada ventana de terminal en la que le gustaría usar el autocompletado, usando el comandosource ~/.bash_profile

Ejecuta esto en la terminal:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

Entonces, haz esto:

vi ~/.bash_profile

Añade estas líneas:

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

Eso es todo. Esto funcionó para mí.

(2do paso) Si alguien prefiere abrir bash_profile con un editor de texto, simplemente haga esto: open -e .bash_profile
En un Mac OS High Sierra virgen, el ~/.bash_profilearchivo no existe. Está bien, solo cree el archivo y coloque ese ifscript allí y guárdelo. Vuelva a cargar su caparazón después y funcionará.
Esto funcionó para mí. En lugar de vi (con el que siempre lucho) simplemente abre -e ~/.bash_profile
Para el segundo paso necesitarás este enlace
Enlace adjunto útil si tiene alias configurados para git -- gist.github.com/JuggoPop/10706934

gity git-completion.bashya vienen con las herramientas de línea de comandos de macOS ( xcode-select --install). Para habilitar el autocompletado de bash, agregue esto a su archivo ~/.bash_profile.

[ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash ] \
    && . /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

Esto también habilitará el autocompletado para las sucursales de git.

Estoy bastante seguro de que tengo herramientas de línea de comandos instaladas, pero ese archivo no existe en mi caso. Sin embargo, feliz de ir con cerveza (y dado que mi git también está con cerveza, quizás también sea más sabio).
¡Gracias! En mi opinión, esta debería ser la respuesta con la marca de verificación verde.
Esta es la solución más sencilla y funciona para mí.
Esto funcionó para mí, aunque usé un formato ligeramente diferente.if [ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash ]; then . /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash > /dev/null fi
para mí, la respuesta funcionó, pero después de agregar la línea dada ~/.bash_profile, no olvide ejecutar también source ~/.bash_profile(especialmente si crea el ~/.bash_profilearchivo por primera vez)
Directo y correcto. Recuerde que primero debe instalar las herramientas de línea de comandos de Xcode para que esto funcione, use xcode-select --installdesde Terminal.app y reinicie cuando haya terminado.

Autocompletado de Git en Catalina y más reciente (usando Homebrew)

macOs cambió de bash a zsh como shell predeterminado a partir de Catalina.
Por lo tanto, necesitará scripts de autocompletado específicos para zsh.

Aquí está cómo instalarlos con Homebrew:

brew install zsh-completion

De hecho, el zsh-completion de Brew incluye git-completion.

Para activar el autocompletado, debe agregar un pequeño bloque de código a su archivo ~/.zshrc. Es posible que deba crear ese archivo en su carpeta de usuario si aún no existe. Nota: El resultado del script de instalación anterior le dirá exactamente qué código agregar, así que léalo detenidamente y cópielo desde allí en caso de que se haya actualizado desde que escribí aquí.

if type brew &>/dev/null; then
  FPATH=$(brew --prefix)/share/zsh-completions:$FPATH

  autoload -Uz compinit
  compinit
fi

Importante:
Cuando haya finalizado la instalación, lea el resultado del script de instalación.
Le indicará no solo que agregue código a .zshrc, sino que también le dará consejos sobre acciones adicionales que podrían ser necesarias, como forzar la reconstrucción de zcompdump. Pero lo más probable es que no necesite los pasos adicionales.

El terminal muestra un molesto mensaje cada vez que se abre: zsh compinit: insecure directories, run compaudit for list. Ignore insecure directories and continue [y] or abort compinit [n]?¡Pero funciona!
Me acabo de unir a esta comunidad, así que todavía no puedo responder, pero encontré que "oh-my-zsh" es muy útil y me gusta mucho la interfaz de usuario: github.com/ohmyzsh/ohmyzsh Esto es, por supuesto, para las personas utilizando zsh. Supongo que no funciona para bash...
@AdolfoCorrea puede resolver el mensaje de advertencia ingresando el siguiente comando: compaudit | xargs chmod gw
Recibo el mensaje molesto + no funciona...
gitLas finalizaciones de Git son parte del paquete Homebrew , no zsh-completions(que tiene finalizaciones para extensiones de Git, como Git Flow , entre otras). Entonces, brew install gitque le dice que instala las terminaciones, y luego siga la guía de finalización de Shell de Homebrew .

Esto es lo que los confunde a algunos de ustedes: tienen brew o ports instalados, pero están usando un sistema git en /usr/bin/. Para comprobar esto:

which git

Si ve /usr/bin/gitque brew no está configurado correctamente o no ha instalado git a través de brew.

Si instala git a través de brew, habilitar las finalizaciones de bash para brew también habilitará las finalizaciones de bash para git. Esto se debe /usr/local/etc/bash_completiona que en realidad obtiene todo en /usr/local/bash_completion.d, y el paquete brew para git instala un script de finalización de git allí.

Esto tiene sentido, pero ¿cómo "habilitarías las finalizaciones de bash para brew"? Te estás perdiendo cómo hacerlo, esto debería ser parte de tu respuesta
Acabo de hacer esto (funciona, gracias) a través desimplily.guide/macos/bash-completion , pero la finalización automática se retrasa un par de segundos... impar

Puede instalar bash y git desde MacPorts con la opción "bash_completion" habilitada. Probablemente sea la forma más fácil de mantener actualizados tanto git como las finalizaciones.

http://denis.tumblr.com/post/71390665/adding-bash-completion-for-git-on-mac-os-x-snow-leopard

Para instalar MacPorts: http://www.macports.org/install.php/

información adicional

En cuanto a la ubicación de la configuración de finalización en su sistema Linux, eche un vistazo en /etc/bash_completion.d/git (es un archivo largo). Sin embargo, copiar eso por sí solo probablemente no funcionará, ya que está diseñado para que el marco de finalización lo obtenga a través de /etc/bash_completion (que se obtiene de /etc/profile.d/bash_completion.sh; archivos en /etc/profile .d provienen de /etc/profile).

Para macOS Catalina+, en zsh:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh -o ~/.git-completion.zsh

Luego actualice su ~/.zshrccon:

if [ -f ~/.git-completion.zsh ]; then
    . ~/.git-completion.zsh
fi
Ahora obtengo c:8: command not found: __git_aliased_commandcada vez que trato de autocompletar...

Si su finalización de git está parcialmente rota, incluso después de obtener el abastecimiento https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash, es posible que solo necesite actualizar su versión de git.

Por ejemplo, cuando escribí git check+ TAB, se autocompletaría correctamente git checkout. Pero cuando escribí git checkout+ TAB, no mostró la lista de sucursales, solo HEAD.

La solución para mí fue actualizar mi gitversión. Estaba en 2.7.0, que aparentemente no era compatible con el último git-completion.bash. Ejecuté brew upgrade git, que lo actualizó a 2.13.0, y ahora autocompleta correctamente los nombres de mis sucursales.

Estaba teniendo el mismo problema, pero tuve que ejecutar brew upgrade gity brew link git(con la anulación habilitada)
Gracias por la captura @Tope. He cambiado updatea upgrade.

De lejos, la mejor referencia que he encontrado para resolver este mismo problema está en SpinDance , de Connor Livingston :

Si el script git-completion.bash no existe en su máquina, recupérelo del enlace que proporcioné anteriormente (que es este ) y guárdelo en su máquina local en un nuevo archivo llamado git-completion.bash en el / directorio usr/local/etc/bash_completion.d/ . Si el script git-completion.bash existe en su máquina, pero no está en el directorio /usr/local/etc/bash_completion.d/ , debemos crear una copia en ese directorio. Un rápido Sudo cp /current/path/to/your/git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bash debería ser suficiente. Para aquellos que sienten curiosidad por /usr/local/etc/bash_completion.d/directorio: es para almacenar nuevos comandos de finalización, y es posible que deba crearlo si aún no existe en su máquina.

En este punto, el script git-completion.bash debería existir en su máquina local en el directorio /usr/local/etc/bash_completion.d/ . Ahora conectaremos el script de finalización de git en bash apuntándolo desde ~/.bash_profile .

Nota: la tilde en la oración anterior se refiere al directorio de inicio en su computadora. Agregue la siguiente línea a ~/.bash_profile : source /usr/local/etc/bash_completion.d/git-completion.bash y guarde. El paso final es recargar su perfil bash. Puede lograr esto ejecutando source ~/.bash_profile en su sesión bash actual.

Lo probé y funciona bien para las sucursales, pero cuando lo haces git st, tabmuestra un error como este

opción desconocida: --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config uso: git [--version] [--help] [-C ] [-c =] [--exec -ruta[=]] [--ruta-html] [--ruta-man] [--ruta-info] [-p | --paginar | --no-pager] [--no-replace-objects] [--bare] [--git-dir=] [--work-tree=] [--namespace=] []

Busqué en Internet y encontré que estaba --list-cmdsen .git-completion.bashla última versión de git y en mi mac la versión de git era2.17.2

Aquí están las soluciones

Solución 1

  1. Verifique la versión de git usando el git --versioncomando
  2. Luego pon el mismo número de versión en la url como lo hice yo

    curl https://raw.githubusercontent.com/git/git/v2.17.2/contrib/completion/git-completion.bash -o ~/.git-completion.bash
    
  3. Luego siga los mismos pasos que en la respuesta superior, ingrese el siguiente código en~/.bash_profile

    if [ -f ~/.git-completion.bash ]; then
      . ~/.git-completion.bash
    fi
    

Solución 2

Debería intentar actualizar la versión de git a la última, entonces debería funcionar.

Instale oh-my-zsh y configure zsh como su shell predeterminado y agradézcame más tarde :)

Lo he hecho, precisamente con la esperanza de no tener que lidiar con eso, todavía no hay sugerencias de sucursales después de presionar la pestaña.
¡En realidad no necesita oh-my-zsh , ni siquiera ningún sistema de complementos por separado! La finalización de Git sale de la caja, solo tiene que habilitarla.

La mayoría de los usuarios habrán gitinstalado como parte de las herramientas de línea de comandos de xcode en /usr/bin/gity las reglas de finalización de bash para git estarán disponibles en /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash.

En este caso, no es necesario instalar git desde Homebrew ni obtener las reglas de finalización de git desde raw.githubusercontent.com. Simplemente cree un enlace simbólico de la siguiente manera:

cd /usr/local/etc/bash_completion.d/
ln -s /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash git

Nota: asegúrese de haber instalado y configurado bash-completionel paquete de Homebrew.

Si está dispuesto a cambiar a un shell diferente, el fishshell tiene esta función incorporada. También tiene algunas otras funciones útiles, como autocompletar mientras escribe.

Localiza tu .bashrcarchivo.

Ábralo y agregue esta línea en la parte inferior:

source /etc/bash_completion.d/git

No tengo nada en una /etc/bash_completion.d/carpeta, en un sistema relativamente nuevo (OSX 10.10.3).
Intenta crearlo.
No bash_completion, git_completion que hace cosas diferentes.
@MichaelDurrant Funciona. Confía en mí. ;) prowrestlingtees.com/media/catalog/product/cache/1/image/…
@crmpicco ¿Podría proporcionar instrucciones para crear /etc/bash_completion.d/git? Haría que tu respuesta fuera más valiosa.
brew install git bash-completioncomo se explica en apple.stackexchange.com/a/92637/136365 obtendrá estos archivos, aunque en una ubicación diferente