¿Cómo muestro la rama de git con colores en Bash prompt?

110

Estoy usando esta guía para mostrar el nombre de la rama en el terminal gnome (Ubuntu 15.10) cuando trabajo en un repositorio git. Basado en lo anterior, ahora tengo lo siguiente en mi archivo ~ / .bashrc:

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes 

...

# Add git branch if its present to PS1
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

Como resultado ahora obtengo:

ingrese la descripción de la imagen aquí

Entonces funciona . Pero, ¿por qué se ha eliminado el color de mi usuario @ host? Y también esperaría que el nombre de la rama sea de color. Antes se veía así:

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN: ahora he probado esta guía en su lugar:

https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt

agregando esto a .bashrc:

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\] $ "

y eso funciona:

ingrese la descripción de la imagen aquí

Observe en .bashrc también tengo esto (predeterminado):

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

Todavía tengo que encontrar la razón por la cual ese fragmento da el resultado correcto y la otra versión no. ¿Alguna aportación sobre esto?

Aquí está la versión de mi .bashrc que tiene habilitado el fragmento anterior que no funciona:

http://pastebin.com/M8kjEiH3

u123
fuente
Fue force_color_promptcomentado antes?
muru
Sí, lo he intentado con el mismo resultado sin comentar y comentado. La guía publicada anteriormente dice que debería comentarse.
u123
¿Puedes publicar tu completa .bashrc? IIRC por defecto .bashrcno habilita los avisos de color, por lo que debe cambiarlo para mostrar los colores. Depende de lo que hayas cambiado.
muru
1
Eche un vistazo a la línea 64, que debería decirle por qué force_color_promptno fue útil descomentar .
muru
2
@ u123 no te preocupes .bashrcdemasiado por el valor predeterminado . Si te equivocas, siempre puedes obtener el original /etc/skel/.bashrc.
muru

Respuestas:

124

Este fragmento:

# Add git branch if its present to PS1

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

Está destinado a reemplazar la definición de solicitud predeterminada:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

Que termina con:

unset color_prompt force_color_prompt

Lo .bashrcque publicaste muestra que lo estás agregando después de la definición de solicitud predeterminada y unset color_prompt force_color_prompt(línea # 64).

O bien reemplazar la definición de los mensajes predeterminados con el fragmento o salir de su ~/.bashrctal como es y comentar la definición indicador predeterminado junto con unset color_prompt force_color_promptla línea # 64:


Entonces, parte de su .bashrc podría verse como

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
# THE SIX LINES BELOW are the default prompt and the unset (which were in the original .bashrc)
#if [ "$color_prompt" = yes ]; then
#    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
#else
#    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
#fi
#unset color_prompt force_color_prompt

pantallazo

kos
fuente
Verificó lo anterior y está en lo correcto. Seguiré con la nueva versión del fragmento ya que funciona sin tener que modificar las partes predeterminadas del archivo bashrc.
u123
1
no puede agregar color al nombre de la rama.
Avinash Raj
@AvinashRaj Prueba con una copia de la forma predeterminada ~/.bashrcen /etc/skel/.bashrc, es posible que tenga algo interfiere en su ~/.bashrc.
kos
un-comentario force_color_prompt = yes (línea # 48) si los colores no son visibles.
Adil Abbasi
1
Para colorear su rama de acuerdo con su estado, puede usar el script nativo git-prompt proporcionado por git.
Niket Pathak
61

Ubuntu: muestra el nombre de tu sucursal en tu terminal

Agregue estas líneas en su archivo ~ / .bashrc

# Show git branch name
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

Vuelva a cargar el archivo .bashrc con este comando:

$ source ~/.bashrc
Sam
fuente
55
¡Esto funcionó para mí el 18.04!
cbloss793
1
Gracias. Usando: Ubuntu 18.04.1 LTS
Bishwas Mishra
También funcionó para mí en elementaryOS 0.4 Loki. Tan simple como abrir mi ~ / .bashrc con el comando sudo nano ~/.bashrc, copie su código al final del archivo, guárdelo, salga y vuelva a cargar el ~ / .bashrc con el código que pegó anteriormente. Muchas gracias;)
Juan Gómez Carrillo
Funciona en Redhat 6.8!
BeeGee
1
¡Esto funcionó y mantuvo los colores! (Ubuntu 18.04)
warkentien2
10

Por ahora, seguí este https://gist.github.com/eliotsykes/47516b877f5a4f7cd52f y trabajé, me gusta hasta ahora, aunque estoy planeando personalizarlo aún más.

En la terminal

mkdir ~/.bash

Copie el git-prompt.sharchivo sin formato de git contrib en el ~/.bash directorio: https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh

Dentro ~/.bashrco ~/.bash_profile(elija el archivo donde normalmente coloca las personalizaciones / configuraciones de bash), agregue las líneas:

source ~/.bash/git-prompt.sh # Show git branch name at command prompt
export GIT_PS1_SHOWCOLORHINTS=true # Option for git-prompt.sh to show branch name in color

# Terminal Prompt:
# Include git branch, use PROMPT_COMMAND (not PS1) to get color output (see git-prompt.sh for more)
export PROMPT_COMMAND='__git_ps1 "\w" "\n\\\$ "' # Git branch (relies on git-prompt.sh)

Mientras esté dentro de un repositorio de git, su indicador Bash ahora debe mostrar la rama git actual en color, lo que significa si tiene cambios no confirmados.

logica
fuente
Fácil y de trabajo!
Dani
Esta debería ser la respuesta aceptada, ya que es clara, concisa y hace el trabajo, y también funciona en otras plataformas.
miguelmorin
2

Ir a la carpeta de inicio

Haga clic en Ctrl+ hpara mostrar los archivos ocultos.

Abierto . bashrcarchivo y al final pegue el siguiente:

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\] $ "

En caso de que tenga su terminal abierta, cierre y abra nuevamente. ¡¡Disfrutar!!

webtechnelson
fuente
Hola, lo probé y solo funciona cuando cambio de superusuario, ¿puedes decirme cómo habilitarlo siempre?
Denis Stephanov
0

Mi problema fue que no había habilitado la opción

Ejecute el comando como un shell de inicio de sesión en

TerminalEditarPreferencias de perfilComando

bufón
fuente
0

reemplazar

parse_git_branch

con

parse_git_branch 2>/dev/null

en tu definición de PS1 y vive feliz para siempre.

andrej
fuente
0

Agregue las siguientes líneas a ~/.bashrc:

export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true

export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
nardele salomon
fuente