¿Cómo hacer que git-completar.bash funcione en Mac OS X?

Respuestas:

64

Instalé git usando MacPorts en mi nueva instalación de Snow Leopard. Después de instalar MacPorts desde la imagen .dmg, estos serían los comandos en Terminal.app:

sudo port selfupdate
sudo port install git-core +bash_completion

Si también desea soporte para extraer documentos y repositorios SVN, use esto en lugar de la segunda línea:

sudo port install git-core +bash_completion +doc +svn

Luego agregue lo siguiente a su ~ / .profile o ~ / .bash_profile:

# MacPorts Bash shell finalización del comando
if [-f / opt / local / etc / bash_completion]; entonces
    . / opt / local / etc / bash_completion
fi

o para MacPorts desde la versión 2.1.2 en Mountain Lion:

# MacPorts Bash shell finalización del comando
if [-f /opt/local/etc/profile.d/bash_completion.sh]; entonces
  . /opt/local/etc/profile.d/bash_completion.sh
fi

o para MacPorts con versiones más nuevas de git:

if [-f /opt/local/share/git-core/git-prompt.sh]; entonces
    . /opt/local/share/git-core/git-prompt.sh
fi

Nota: bash 4.1 o superior es requerido por bash_completion.sh. Si la finalización no funciona, intente echo $BASH_VERSIONver si ese es el problema. Si es así, ingrese MacPorts bash escribiendo bashe intente git complete nuevamente.

Lara Dougan
fuente
Acabo de copiar y pegar, y todavía recibo el error que tiene el OP. = \. ¿Cómo sabes qué ha sido incluido? No sé entonces que bash_completion tiene su origen
NullVoxPopuli
tenga en cuenta que con las versiones más recientes de git / macport / bash-complete la solicitud está en un archivo diferente. Ver: trac.macports.org/ticket/36334 if [ -f /opt/local/share/git-core/git-prompt.sh ]; then . /opt/local/share/git-core/git-prompt.sh fi
Yehosef
3
Debido a que /opt/local/etc/profile.d/bash_completion.shnecesita $BASH_VERSION4.1 o superior, tuve que hacer lo siguiente en un Mac OS X 10.8.3 con MacPorts 2.1.3: cambiar el shell de inicio de sesión de Mac OS X de su valor predeterminado /bin/bash(versión 3.2.48 (1)) a MacPorts /opt/local/bin/bash(4.2 .42 (2) -release) como se describe aquí: stackoverflow.com/a/791244/287984. Básicamenteif [ `grep /opt/local/bin/bash /etc/shells` ]; then echo /opt/local/bin/bash | chsh -s /opt/local/bin/bash; else echo /opt/local/bin/bash | sudo tee -a /etc/shells; chsh -s /opt/local/bin/bash; fi
Uwe Günther
Funcionó muy bien para mí. Tuve que reemplazar /bin/bashen Terminal.app con /opt/local/bin/bashdesde macports + todos los .bash_profilecambios sugeridos aquí.
bgs
1
Para pasar a bash 4.1 o posterior, puede seguir las instrucciones aquí: apple.stackexchange.com/questions/70132/…
ThomasW
55

Si ha instalado git utilizando homebrew de lo que pueda ajustar el consejo DarwinPorts un poco y agregar esto a su .bash_profilee.bashrc

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

La mejor manera de verificar si tiene git instalado correctamente usando homebrew es ejecutar

brew info git

y verifique la salida para el directorio de instalación de la finalización de git bash

La última versión de Git (1.7.12) también requiere lo siguiente para habilitar la solicitud.

if [ -f `brew --prefix`/etc/bash_completion.d/git-prompt.sh ]; then
    . `brew --prefix`/etc/bash_completion.d/git-prompt.sh
fi
Grundprinzip
fuente
Para obtener más información __git_ps1, consulte superuser.com/a/477749/90231 answer en esta pila.
RichVel
26

Todo lo que necesita hacer es colocar el git-completion.basharchivo en su bindirectorio de inicio de usuario y colocar lo siguiente en usted .profileo en el .bash_profilearchivo:

export PATH="$HOME/bin:$PATH"
source ~/bin/git-completion.bash
PS1='[\u@\h \w$(__git_ps1 " (%s)")]\$ '

Lo que esto hace es asegurarse de que su contenedor local esté en la RUTA y que el sourcecomando ponga las cosas en marcha. Luego, por supuesto, el cambio de PS1 coloca la rama actualmente desprotegida en el indicador.

Por lo tanto, no instale MacPort para instalar una versión de "finalización" de GIT (especialmente irritante si ya lo tiene instalado).

iansheridan
fuente
1
Para aquellos que se preguntan cómo combinar esa cosa de PS1 con colores en su solicitud, consulte: stackoverflow.com/questions/816790/…
Nickolay
1
Más precisamente, git-completar.bash solo necesita estar en algún lugar de tu $PATH. Decidí poner el mío /usr/local/bin/para no tener que modificar mi existente $PATH.
metavida
13

Si bien la respuesta actual es correcta para MacPorts anteriores, hay un nuevo problema con los MacPorts más actuales que resulta en el mismo error.

El paquete actual de finalización de bash (2.0 r1) requiere al menos un bash 4.1 para funcionar correctamente. Como un OS X Terminal habitual usa /bin/bash, solo obtiene un 3.x. Debe cambiar la configuración de su terminal para usar /opt/local/bin/bash -lcomo se describe en la documentación de MacPorts aquí: http://trac.macports.org/wiki/howto/bash-completion

Andy
fuente
Esta es la respuesta más correcta, ya que solo comencé a tener el problema después de actualizar macports. La única desventaja de usar macports bash desde la terminal es que ahora me advierte sobre la finalización de los procesos en ejecución cuando intento cerrar la ventana de mi terminal. ¿Te has encontrado con esto?
vitch
5

Molesto, esto se ha roto una vez más. Esta vez es la gente de git con la versión 1.7.12-1. Para permitir que las personas tengan solo la funcionalidad de solicitud sin la funcionalidad de finalización (que puede ralentizar las cosas), refactorizaron la funcionalidad de solicitud de bash_completion / git y en su propio archivo git-prompt.sh.

Por lo tanto, agregar bash_completion como lo describe @Lara solo lo completará (al presionar la pestaña se completan los nombres de etiqueta / rama).

Para obtenerlo __git_ps1y poder usarlo en su solicitud de PS1, también debe agregar lo siguiente a su ~ / .profile.

. /opt/local/share/doc/git-core/contrib/completion/git-prompt.sh

Algunos antecedentes están aquí: https://bbs.archlinux.org/viewtopic.php?pid=1163632#p1163632

studgeek
fuente
3

O con Homebrew

brew install bash-completion git-extras
derek73
fuente
2
Muchas gracias. Sin brew install bash-completion git-extrasembargo, debería ser (guión en lugar de guión bajo).
simonair
2

Encontró una solución en una pregunta similar :

El instalador de git-osx viene con git-completion.bashy lo instala /usr/local/git/contrib/completion/. Simplemente .bash_profileobtenga ese archivo de su para obtener __git_ps1.

John Mellor
fuente
2

Para Mountain Lion y Mac-Ports, necesitaba usar las siguientes líneas en mi .bash_profile para que tanto __git_ps1 como las terminaciones se ejecuten normalmente:

# Bash shell command completion
if [ -f /opt/local/share/doc/git-core/contrib/completion/git-completion.bash ]; then
  . /opt/local/share/doc/git-core/contrib/completion/git-completion.bash
fi

if [ -f /opt/local/share/doc/git-core/contrib/completion/git-prompt.sh ]; then
  . /opt/local/share/doc/git-core/contrib/completion/git-prompt.sh
fi
haysclark
fuente
1

Yo uso brew, por bash_completionlo que bash_completion.dparece que no se proporciona un script maestro que ejecute todos los que hay. Las soluciones que proponen simplemente ejecutar un solo script para agregar terminaciones git no son extensibles, porque diferentes paquetes agregarán diferentes scripts de finalización, y probablemente desee ejecutarlos todos. Por lo tanto, agregué esto (adaptado de Arch Linux) al final de /etc/bashrc:

# source compat completion directory definitions
BASH_COMPLETION_COMPAT_DIR=/usr/local/etc/bash_completion.d
if [[ -d $BASH_COMPLETION_COMPAT_DIR && -r $BASH_COMPLETION_COMPAT_DIR && \
    -x $BASH_COMPLETION_COMPAT_DIR ]]; then
    for i in $(LC_ALL=C command ls "$BASH_COMPLETION_COMPAT_DIR"); do
        i=$BASH_COMPLETION_COMPAT_DIR/$i
        [[ -f $i && -r $i ]] && . "$i"
    done
fi
ecloud
fuente
1

Al menos con Xcode 6, ya lo tienes git-completion.bash. Está dentro del paquete de la aplicación Xcode.

Simplemente agregue esto a su .bashrc:

source `xcode-select -p`/usr/share/git-core/git-completion.bash
jrc
fuente
Esta fue la única respuesta que realmente funcionó para mí. Otras respuestas producían errores extraños cuando git br<TAB>
escribía
0

Además de la publicación de Adam K. Johnson

También puedes poner lo siguiente ...

# MacPorts Bash shell command completion
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi

... en su / etc / profile, si lo desea.

De esa manera, todos los usuarios del sistema se beneficiarán de cualquier script de finalización de bash instalado en el directorio "/opt/local/etc/bash_completion.d/".

la verdad
fuente
0

Si bien la respuesta anterior de grundprinzip de 2011 todavía funciona bien, quería agregar una respuesta más reciente ahora que ahora hay un paquete Homebrew bash-complete ( fórmula , repositorio ) que lo hace aún más fácil. (Esto incluye la finalización de git, así como otras herramientas comunes).

Hoy macOS viene con Bash 3, pero puede brew install bashobtener Bash 4. Si está ejecutando Bash 4, instale la nueva rama 2.x de bash-complete.

Golpe 4

  1. Correr:

    brew install bash-completion@2
  2. Añadir a ~/.bash_profile:

    if [ -f /usr/local/share/bash-completion/bash_completion ]; then
      . /usr/local/share/bash-completion/bash_completion
    fi

Golpe 3

Si desea seguir con stock bash 3.x en macOS, siga estas instrucciones en su lugar.

  1. Correr:

    brew install bash-completion
  2. Añadir a ~/.bash_profile:

    echo "[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion" >> ~/.bash_profile

Referencia: http://davidalger.com/development/bash-completion-on-os-x-with-brew/

Taylor Edmiston
fuente
-2

Creo que quizás olvides obtener el archivo en tu inicio de sesión .bashrc, puedes agregar algo como:

. ./path/to/your/file.ext

El uso .seguido de un espacio ejecuta el archivo en el contexto actual.

sufery
fuente