Mostre seu status git e branch (em cores) no prompt de comando

Sou um grande fã de ter o branch e o status do meu projeto atual refletido no prompt do bash. Esta é a minha aparência:

prompt de comando com status git

E aqui está como fazer isso:

Primeiro defina algumas cores. Isso tornará mais fácil trabalhar com as sequências de escape posteriormente:

COLOR_RED="\033[0;31m"
COLOR_YELLOW
="\033[0;33m"
COLOR_GREEN
="\033[0;32m"
COLOR_OCHRE
="\033[38;5;95m"
COLOR_BLUE
="\033[0;34m"
COLOR_WHITE
="\033[0;37m"
COLOR_RESET
="\033[0m"

A seguir, uma função para a formatação de cores:

function git_color {
local git_status="$(git status 2> /dev/null)"

if [[ ! $git_status =~ "working directory clean" ]]; then
echo
-e $COLOR_RED
elif [[ $git_status =~ "Your branch is ahead of" ]]; then
echo
-e $COLOR_YELLOW
elif [[ $git_status =~ "nothing to commit" ]]; then
echo
-e $COLOR_GREEN
else
echo
-e $COLOR_OCHRE
fi
}

e um para o branch git:

function git_branch {
local git_status="$(git status 2> /dev/null)"
local on_branch="On branch ([^${IFS}]*)"
local on_commit="HEAD detached at ([^${IFS}]*)"

if [[ $git_status =~ $on_branch ]]; then
local branch=${BASH_REMATCH[1]}
echo
"($branch)"
elif [[ $git_status =~ $on_commit ]]; then
local commit=${BASH_REMATCH[1]}
echo
"($commit)"
fi
}

NB: a formatação das mensagens de status do git mudou, então, se você estiver na versão mais recente do git, provavelmente precisará usar em "^On branchvez da "^# On branchanterior. Verifique git statusse você está usando a corda certa.

Por último, incorpore na declaração PS1 (dividida para maior clareza):

PS1="\[$COLOR_WHITE\]\n[\W]"          # basename of pwd
PS1
+="\[\$(git_color)\]" # colors git status
PS1
+="\$(git_branch)" # prints current branch
PS1
+="\[$COLOR_BLUE\]\$\[$COLOR_RESET\] " # '#' for root, else '$'
export PS1

Voila!

referência: O Bash Prompt HOWTO

Respostas relacionadas:

Remova todos os seus branches locais do git, mas mantenha o mestre