Embora você já tenha resolvido o problema, gostaria de apresentar a solução já enviada com o git:
Juntamente com o git, o arquivo /usr/lib/git-core/git-sh-prompt
é instalado. Anos atrás, estava no diretório contrib , mas, enquanto isso, entrava nos caminhos oficiais. O arquivo não deve ser executado (na verdade, ele não tem x
flags), mas sim originado do .bashrc
. Ele define algumas funções para lidar com um prompt bonito, sendo o mais proeminente __git_ps1
.
Você pode adicionar as seguintes linhas ao seu .bashrc
:
source /usr/lib/git-core/git-sh-prompt
export PS1="${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u:\[3[01;34m\]\w\[3[00m\]\$(__git_ps1)\[3[00m\] $ "
A parte superior do arquivo /usr/lib/git-core/git-sh-prompt
fornece uma descrição do que mais pode ser feito. Minha versão diz 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
, mas isso não é necessário (a instrução é obsoleta).
Você também pode definir algumas variáveis de ambiente para alterar o comportamento da função. Eu, por exemplo, uso
export GIT_PS1_SHOWDIRTYSTATE=yes
O resultado então parece:
# clean
pduck:~/oss/rsyslog (master) $
ou
# dirty
pduck:~/oss/rsyslog (master *) $
ou
# something added to index
pduck:~/oss/rsyslog (master +) $
ou
# in a completely fresh repo
pduck:~/oss/xxx (master #) $
Btw: A maneira "correta" de obter a ramificação atual é não analisar a saída de git branch
, pois isso pode mudar com as novas versões do git.
git branch
é um comando chamado porcelain , o que significa que sua saída é legal e bonita, mas não garantida para permanecer na mesma com versões diferentes. Os caras do git recomendam, assim, as ferramentas encanamento para o script. Com o encanamento , o ramo atual pode ser determinado com
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
current_branch=$(git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD)
else
current_branch=""
fi
A primeira atribuição funciona se HEAD for uma referência simbólica (ou seja: uma ramificação ou tag está com check-out). Se você fez check-out de algo que não tem rótulo (por exemplo, git checkout HEAD^^
), ele falha e usamos git rev-parse --short HEAD
para mostrar o SHA1. O if
verifica se estamos em um diretório de trabalho git (porque senão os comandos não fazem sentido).