Agregar git branch en el símbolo del sistema Bash


161

Intenté agregar la rama git en la que estoy trabajando actualmente (desprotegido) en el indicador bash sin éxito ... ( mientras mantengo mi ruta actual que muestra el directorio / archivo activo intacto) Tengo un archivo .bashrc en mi casa, pero también vi a muchas personas mencionar el archivo .profile ...


3
Creo que esto sería mejor preguntar en el intercambio de Unix / Linux.
Cole Busby

He intentado como 10 procedimientos diferentes, algunos de ellos funcionaron pero obtuve la rama git y perdí el directorio / ruta de trabajo que tenía antes ...
George Katsanos

Git 1.9.3+ trae una forma interesante de mostrar la rama: vea mi respuesta a continuación
VonC

1
@cole busby aparentemente no.
George Katsanos

1
@GeorgeKatsanos cuatro años seguro me mostraron: p
Cole Busby

Respuestas:


161

git 1.9.3 o posterior: uso __git_ps1

Git proporciona un script de shell llamado git-prompt.sh, que incluye una función __git_ps1que

imprime el texto para agregar a la solicitud de bash PS1 (incluye el nombre de la sucursal)

Su uso más básico es:

$ __git_ps1
(master)

También toma una cadena de formato opcional:

$ __git_ps1 'git:[%s]'
git:[master]

Cómo conseguirlo

Primero, copie el archivo en algún lugar (por ejemplo ~/.git-prompt.sh).

Opción 1: use una copia existente en su sistema de archivos. Ejemplo (Mac OS X 10.15):

$ find / -name 'git-prompt.sh' -type f -print -quit 2>/dev/null
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

Opción 2: extraer el script de GitHub .

A continuación, agregue la siguiente línea a su .bashrc/.zshrc:

source ~/.git-prompt.sh

Finalmente, cambie su PS1llamada __git_ps1a sustitución de comando:

Intento:

PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

Zsh:

setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '

git <1.9.3

Pero tenga en cuenta que solo git 1.9.3 (mayo de 2014) o posterior le permite mostrar de forma segura ese nombre de sucursal (!)

Ver commit 8976500 por Richard Hansen ( richardhansen) :

Tanto bash como zsh someten el valor de PS1 a la expansión de parámetros , la sustitución de comandos y la expansión aritmética.

En lugar de incluir el nombre de rama sin formato y sin escape PS1cuando se ejecuta en modo de dos o tres argumentos, construya PS1para hacer referencia a una variable que contenga el nombre de rama.

Debido a que los shells no se expanden recursivamente, esto evita la ejecución de código arbitrario por nombres de rama especialmente diseñados, como

'$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)'.

¿Qué mente tortuosa llamaría una rama así? ;) ( Al lado de una mamá como en xkcd )

Más ejemplos

still_dreaming_1 informa en los comentarios :

Esto parece funcionar muy bien si desea un indicador de color con xterm(en mi .bashrc):

PS1='\[\e]0;\u@\h: \w\a\]\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\03‌​3[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ ' 

Todo es de un color diferente, incluida la rama.

En Linux Mint 17.3 Cinnamon 64-bit:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ ' 

3
cómo puede establecer el indicador en la rama git actual cuando realmente está en un repositorio git. Entonces, si está en un directorio normal, muestra un mensaje normal.
Zubair Alam

1
@ still_dreaming_1 puede actualizar o compilar git muy fácilmente: stackoverflow.com/a/24847953/6309
VonC

1
Esto parece funcionar muy bien si desea un color un indicador de color con xterm (en .bashrc): PS1='\[\e]0;\u@\h: \w\a\]\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$'todo es un color diferente, incluida la rama.
still_dreaming_1

55
Esa PS1 que publiqué ya no se muestra correctamente para mí en Linux Mint 17.3 Cinnamon 64-bit, pero esto sí:PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ '
still_dreaming_1

1
El maestro actual está en github.com/git/git/blob/master/contrib/completion/git-prompt.sh - ¿Creo que deberíamos vincularnos a eso en la respuesta, en caso de que se encuentre un exploit en el futuro? También: Tenía que escapar de la $ y "en mi línea PS1, pero eso es probablemente debido a su complejidad.
ArchimedesMP

57

Siga los pasos a continuación: (Linux)

Edite el archivo ~/.bashrcpara ingresar las siguientes líneas al final (en el caso de Mac, el archivo sería ~/.bash_profile)

# Git branch in prompt.
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Ahora, inicie la nueva ventana de terminal e intente ingresar a cualquier git-repo. Se mostraría la rama actual, con el aviso.

4 Más información - MAC / Linux


No creo que sea necesario cambiar el ~ / .bash_profile en lugar de ~ / .bashrc en OSX.
bergercookie


1
Para el color, considere cambiar la "rama git" para que sea "git -c color.ui = siempre rama" en parse_git_branch arriba. Tiene el mismo color que usa git branch para resaltar la rama actual.
Awatts

Inspirado por usted, pero me gusta que mi directorio de trabajo sea la ruta completa (\ w) con resaltado azul. Ejemplo: gist.github.com/rmharrison/1885ef6bbb0226eb7b42e2135d5eeca2
rmharrison el

Para MAC que tenía que eliminar la fuga antes de que el $ (parse_git_branch) para conseguir que esto funcione así: PS1="\u@\h \W\[\033[32m\]$(parse_git_branch)\[\033[00m\] $ ". Aunque tampoco estoy usando 'exportar' frente a PS1.
Chris

37

1- Si no tienes bash-complete ...:sudo apt-get install bash-completion

2- Edite su archivo .bashrc y verifique (o agregue):

if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

3- ... antes de su línea de solicitud: export PS1='$(__git_ps1) \w\$ '
( __git_ps1 mostrará su rama git)

4- hacer source .bashrc

EDITAR:

Lecturas adicionales: no reinventes la rueda


esta parece ser la única forma en que funciona para mí usando una máquina
doméstica

Funciona bien en ubuntu 16.04
Frug

El enlace "No reinventar la rueda" está tristemente roto.
Taylor R

@TaylorR He restaurado el enlace.
VonC

23

Así es como configuré el indicador para mostrar el estado de Git:

Obtenga el script git-prompt:

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

Y personalice su solicitud agregando el siguiente código en su archivo .bashrc:

# Load Git functions
source ~/.git-prompt.sh

# Syntactic sugar for ANSI escape sequences
txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
badgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

# Prompt variables
PROMPT_BEFORE="$txtcyn\u@\h $txtwht\w$txtrst"
PROMPT_AFTER="\\n\\\$ "

# Prompt command
PROMPT_COMMAND='__git_ps1 "$PROMPT_BEFORE" "$PROMPT_AFTER"'

# Git prompt features (read ~/.git-prompt.sh for reference)
export GIT_PS1_SHOWDIRTYSTATE="true"
export GIT_PS1_SHOWSTASHSTATE="true"
export GIT_PS1_SHOWUNTRACKEDFILES="true"
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS="true"

Si desea obtener más información, puede obtener todos los archivos de puntos aquí: https://github.com/jamming/dotfiles


La mejor respuesta hasta ahora.
Basil Musa

@Hesam Puede cambiar la PROMPT_BEFOREvariable de entorno y eliminar el $txtwht\wNo lo sé de memoria, pero supongo que funciona
jaguililla

1
Funciona en mi Mac, pero muestra el nombre de la rama como (master * $% =)
Ajak6

Esos símbolos se asemejan al estado de la rama, es decir: $significa que hay cambios escondidos, y =significa que el último commit fue
enviado


3

Al principio, abra su Perfil de Bash en su directorio de inicio. La forma más fácil de abrir y editar su bash_profile usando su editor predeterminado.

Por ejemplo, lo abro usando el código VS usando este comando: código .bash_profile.

Luego solo pegue los siguientes códigos en su Bash.

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

La función

parse_git_branch ()

buscará el nombre de la sucursal y luego, a través de PS1, puede mostrarlo en su terminal.

Aquí,

\ u = Nombre de usuario

@ = Texto estático

\ h = Nombre de la computadora

\ w = Directorio actual

$ = Texto estático

Puede cambiar o eliminar estas variables para una mayor personalización.


Si usa Git por primera vez en la terminal o al instante después de la configuración, tal vez a veces no pueda ver el nombre de la sucursal.

Si tiene este problema, no se preocupe. En ese caso, solo haga un repositorio de muestra y confírmelo después de algunos cambios. Cuando el comando commit se ejecutará una vez, el terminal encontrará la rama git a partir de entonces.


Captura de pantalla: Git Branch en Terminal


2
vim ~/.bash

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $"

Para reflejar los últimos cambios, ejecute el siguiente comando

source ~/.bashrc

Salida:-

chandrakant@NDL41104 ~/Chandrakant/CodeBase/LaravelApp (development) $

0

Si utiliza la concha de pescado es bastante sencillo. El pescado es un caparazón interactivo que viene con muchas golosinas. Puedes instalarlo usando apt-get.

sudo apt-get install fish

luego puede cambiar la configuración del indicador utilizando

> fish_config 
Web config started at 'http://localhost:8001/'. Hit enter to stop.
Created new window in existing browser session.

ahora ve a http://localhost:8001/ abrir la pestaña de solicitud y elige la opción clásica + git

ingrese la descripción de la imagen aquí

Ahora haga clic en el botón de solicitud de uso y estará listo.


0
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]$(parse_git_branch)\n\$ '

Eww, realmente no pongas escapes de terminal desnudos allí; usar tputcomo cualquier persona cuerda.
Toby Speight

0

Siga los pasos a continuación para mostrar el nombre de la rama de su repositorio GIT en la terminal de ubuntu:

Paso 1: abra la terminal y edite .bashrc con el siguiente comando.

vi .bashrc

Paso 2: agrega la siguiente línea al final del archivo .bashrc:

parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' }

export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Paso 3: fuente .bashrc en el directorio raíz (inicio) haciendo:

/ rootfolder: ~ $ source .bashrc

Paso 4: reinicie y abra la terminal y verifique el cmd. Navegue a su ruta de directorio de repositorio GIt y ya está. :)


0
root:~/project#  -> root:~/project(dev)# 

agregue el siguiente código al final de su ~ / .bashrc

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt


-1

He intentado un pequeño script en python que va en una carpeta bin ... archivo 'gitprompt'

#!/usr/bin/env python
import subprocess, os
s = os.path.join(os.getcwd(), '.git')
def cut(cmd):
    ret=''
    half=0
    record = False
    for c in cmd:
        if c == "\n":
            if not (record):
                pass
            else:
                break
        if (record) and c!="\n":
            ret = ret + c
        if c=='*':
            half=0.5
        if c==' ':
            if half == 0.5:
                half = 1
        if half == 1:
            record = True
    return ret
if (os.path.isdir(s)):
    out = subprocess.check_output("git branch",shell=True)
    print cut(out)
else:
    print "-"

Hazlo ejecutable y esas cosas

Luego ajuste el indicador de bash en consecuencia como:

\u:\w--[$(gitprompt)] \$ 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.