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


351

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

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

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

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

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

He intentado descargar y ejecutar bash-completion/bash_completiony bash-completion/bash_completion.sh.inpero no alegría. El primero dio mensajes de error sobre declare: -A invalid_option. El segundo no dio errores. Cuando I git checkout+ TABaunque todavía obtengo una lista de archivos en el directorio, no ramas. Estoy en la raíz del proyecto.

El autocompletado para directorios y comandos bash funciona bien, por lo que es específico de Git.

Respuestas:


484

ok, así que necesitaba el script de autocompletado git .

Lo obtuve de esta url:

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

No necesita preocuparse sobre en qué directorio se encuentra cuando ejecuta esto, ya que su directorio de inicio ( ~) se usa con el destino.

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 estos bits de código 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, " .git-completion.bashen este caso"

Esto todavía funciona tanto en Ubuntu como en OSX y en máquinas sin el script .git-completion.bashscript.

¡Ahora git Tab(en realidad lo es git TabTab) funciona como un encanto!

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

  • chmod es el comando que modifica los permisos de archivo
  • u significa el usuario que posee el archivo, por defecto su creador, es decir, usted
  • + significa establecer / activar / agregar un permiso
  • x significa permiso de ejecución, es decir, la capacidad de ejecutar el script

1
Sí, reiniciar el terminal después de agregar el script bash lo hizo funcionar. Estaba sentado aquí preguntándome por qué seguía intentando autocompletarse en mi Modelscarpeta cuando presioné m Tabpara que se completara automáticamente master.
Alex

1
Consulte también unix.stackexchange.com/q/48862/10043 para obtener un consejo diferente
Michael Durrant,

3
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.
Ben

¡Gracias! Intenté algunas otras cosas pero nada funcionó (incluido este github.com/bobthecow/git-flow-completion/wiki/… ). Su solución funcionó a las
mil maravillas

1
(no tiene cerveza gitpero Apple predeterminado git) brew install gity reinicie el terminal para aquellos que enfrentan un error extraño 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>]
Sachin

90

Algunas personas prefieren usar un administrador de paquetes para automatizar la instalación, actualización y configuración de 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-complete con brew install git bash-completion.

Luego 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 instalado git, simplemente elimine la parte git de esta instalación de preparación)

Más información sobre cómo instalar git y bash-complete con brew aquí.


27
Agregar gity agregar bash-completionno es lo mismo que agregar .git-completion.bash Son programas diferentes y hacen cosas muy diferentes: uno realiza el autocompletado de comandos bash y el otro hace el autocompletado de comandos git y 'nair the twain se reunirá;)
Michael Durrant

trabajando como un encanto, muchas gracias. ¿Podría explicar cuál es el uso del script que me han agregado ~/.bash_profile?
Vikas Bansal

A pesar de lo que otros han dicho sobre esta respuesta, es la que hizo que git autocomplete funcione en la terminal.
Iain

32

Ejecute 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

Agregue estas líneas:

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

Eso es todo. Esto funcionó para mí.


1
(2do paso) Si alguien prefiere abrir bash_profile con un editor de texto, simplemente haga esto: open -e .bash_profile
Nicolas Bodin-Ripert

2
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 shell después y funcionará.
agm1984

11

gity git-completion.bashya viene con herramientas de línea de comandos de macOS ( xcode-select --install). Para habilitar bash autocompletar, agregue esto a su ~/.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 ramas de git.


Estoy bastante seguro de que tengo instaladas herramientas de línea de comandos, pero ese archivo no existe en mi caso. Sin embargo, me alegra ir con cerveza (y dado que mi git también es con cerveza, quizás más sabio también).
drevicko

¡Gracias! OMI, esta debería ser la respuesta con la marca de verificación verde.
geekisthenewcool

8

Esto es lo que confunde a algunos de ustedes: tiene cerveza o puertos instalados, pero está utilizando un git del sistema /usr/bin/. Para verificar esto:

which git

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

Si instala git mediante brew, entonces habilitar bash completions para brew también habilitará bash completions para git. Esto se debe a que en /usr/local/etc/bash_completionrealidad lo contiene todo /usr/local/bash_completion.d, y el paquete de preparación para git instala un script de finalización de git allí.


Esto tiene sentido, pero ¿cómo "habilitaría las finalizaciones de bash para la preparación"? Te estás perdiendo cómo hacerlo, esto debería ser parte de tu respuesta
skplunkerin

Acabo de hacer esto (funciona, gracias) a través de simplified.guide/macos/bash-completion , pero la finalización automática se retrasa un par de segundos ... extraño
skplunkerin

4

Puede instalar bash y git desde MacPorts con la opción "bash_completion" habilitada. Es probablemente 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í mismo probablemente no funcionará, ya que está diseñado para ser generado por el marco de finalización 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).


2

Si su finalización de git está parcialmente rota, incluso después de la búsqueda 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 mostraba la lista de ramas, solo HEAD.

La solución para mí fue actualizar mi gitversión. Estaba en 2.7.0, que aparentemente no era compatible con la última git-completion.bash. Corrí brew upgrade git, que se actualiza a 2.13.0, y ahora se completa automáticamente adecuadamente mis nombres de rama.


Estaba teniendo el mismo problema, pero tenía que correr brew upgrade gity brew link git(con la anulación habilitada)
Tope

1
Gracias por la captura @Tope. He cambiado updatea upgrade.
wisbucky

2

Con mucho, la mejor referencia que he encontrado para resolver este problema está en SpinDance , de Connor Livingston :

Si el script git-completar.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-completar.bash en el / usr / local / etc / bash_completion.d / directorio. Si el script git-completar.bash existe en su máquina, pero no está en el directorio /usr/local/etc/bash_completion.d/ , deberíamos crear una copia del mismo 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 hacer el truco. Para aquellos que sienten curiosidad por el /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-completar.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 señalá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 último paso es volver a cargar su perfil bash. Puede lograr esto ejecutando source ~ / .bash_profile en su sesión de bash actual.


1

Lo probé y funciona bien para las ramas, pero cuando haces git st+ tab, muestra el error como este

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

Buscado en Internet y encontró que --list-cmdsen .git-completion.bashestaba en la versión más reciente de Git y en mi mac era la versión git2.17.2

Aquí están las soluciones.

Solución 1

  1. Verifique la versión del git usando el git --versioncomando
  2. Luego ponga el mismo número de versión en la url que hice

    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, coloque el siguiente código en ~/.bash_profile

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

Solución 2

Debes intentar actualizar la versión de git a la última y luego debería funcionar.


0

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

¡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.
SilverWolf

0

La mayoría de los usuarios se 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 o las reglas de finalización de git de origen 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 el bash-completionpaquete de Homebrew.


-2

Localiza tu .bashrcarchivo.

Ábrelo y agrega esta línea en la parte inferior:

source /etc/bash_completion.d/git


1
No tengo nada una /etc/bash_completion.d/carpeta, en un sistema relativamente nuevo (OSX 10.10.3).
livingtech

Intenta crearlo.
crmpicco

No bash_completion, git_completion que hace cosas diferentes.
Michael Durrant


@crmpicco ¿Podría por favor proporcionar instrucciones para crear /etc/bash_completion.d/git? Haría que su respuesta sea más valiosa.
Dannid