Mostrar Ramo e Status do Git no Prompt do Bash
Personalização do prompt do Bash para contexto Git instantâneo
Um prompt bash bem configurado exibindo informações do repositório git pode melhorar drasticamente seu fluxo de trabalho de desenvolvimento.
Este guia faz parte da nossa série completa Ferramentas de Desenvolvimento: O Guia Completo para Fluxos de Trabalho de Desenvolvimento Moderno.
Em vez de executar constantemente os comandos git status e git branch, você pode ter essas informações críticas sempre visíveis no prompt do seu terminal.

Exemplo de prompt do Oh-my-posh.
Por Que Adicionar Informações do Git ao Prompt Bash?
Quando você trabalha com múltiplos repositórios e branches do git ao longo do dia, a mudança de contexto torna-se um dreno significativo de produtividade. Um prompt consciente do git resolve vários problemas comuns:
- Previne confusão de branches: Você saberá sempre em qual branch está antes de fazer commit
- Reduz sobrecarga de comandos: Sem necessidade de executar constantemente
git statusegit branch - Feedback visual imediato: Veja alterações não commitadas, arquivos não rastreados e status upstream de relance
- Menos erros: Evite acidentalmente fazer commit na branch errada ou empurrar código sujo
Entendendo a Variável PS1 do Bash
O prompt do bash é controlado pela variável de ambiente PS1. Esta variável pode conter:
- Texto literal: Quaisquer caracteres que você queira exibir
- Sequências de escape: Códigos especiais começando com
\que exibem informações dinâmicas - Substituição de comandos: Comandos em
$(...)que executam e exibem sua saída - Códigos de cor ANSI: Sequências de escape que alteram as cores do texto
Sequências de escape PS1 comuns incluem:
\u- nome de usuário atual\h- nome do host\w- diretório de trabalho atual\$-#para root,$para usuário normal\t- hora atual no formato de 24 horas
Um prompt básico pode parecer: PS1='\u@\h:\w\$ ' produzindo saída como user@hostname:/path/to/dir$ . Para mais fundamentos do bash e sequências de escape, confira nosso Folhetos Bash.
Método 1: Usando o Script git-prompt.sh do Git
As distribuições do Git incluem um script auxiliar chamado git-prompt.sh que fornece a função __git_ps1. Esta é a abordagem mais confiável e rica em recursos.
Localizando git-prompt.sh
Primeiro, encontre onde o script está localizado no seu sistema:
# Localizações comuns no Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt
# Localizações comuns no macOS (com Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
# Pesquise se necessário
find /usr -name git-prompt.sh 2>/dev/null
Configuração Básica
Adicione o seguinte ao seu ~/.bashrc ou ~/.bash_profile:
# Source o script git-prompt
source /usr/lib/git-core/git-sh-prompt
# Defina seu prompt para incluir informações do git
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '
A parte $(__git_ps1 " (%s)") chama a função, e %s é substituído pelo nome da branch atual. Os espaços e parênteses ao redor formatam tudo de forma agradável.
Após editar, recarregue sua configuração:
source ~/.bashrc
Opções Avançadas do git-prompt.sh
O git-prompt.sh torna-se poderoso quando você ativa seus recursos opcionais através de variáveis de ambiente:
# Mostrar alterações não estagiadas (*) e estagiadas (+)
export GIT_PS1_SHOWDIRTYSTATE=1
# Mostrar se há alterações estagiadas ($)
export GIT_PS1_SHOWSTASHSTATE=1
# Mostrar se há arquivos não rastreados (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1
# Mostrar diferença entre HEAD e upstream
# Opções: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"
# Habilitar dicas coloridas (requer bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1
# Mostrar estado do repositório durante operações
# (MERGING, REBASING, BISECTING, etc.)
export GIT_PS1_DESCRIBE_STYLE="default"
Aqui está o que os indicadores significam:
*- Alterações não estagiadas (arquivos modificados não adicionados)+- Alterações estagiadas (arquivos adicionados mas não commitados)$- Alterações estagiadas existem%- Arquivos não rastreados presentes<- Atrás da branch upstream>- À frente da branch upstream<>- Divergido do upstream=- Igual ao upstream
Exemplo de Configuração Completa
Aqui está uma configuração abrangente do ~/.bashrc:
# Source git-prompt
if [ -f /usr/share/git-core/contrib/completion/git-prompt.sh ]; then
source /usr/share/git-core/contrib/completion/git-prompt.sh
fi
# Configure as opções do git-prompt
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1
# Definições de cores
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]' # Verde
COLOR_PATH='\[\033[01;34m\]' # Azul
COLOR_GIT='\[\033[01;33m\]' # Amarelo
# Defina o prompt
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "
Método 2: Substituição de Comandos Git Manual
Se você não tem acesso ao git-prompt.sh ou quer uma solução mínima, pode executar diretamente comandos git no seu prompt:
# Apenas nome da branch simples
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '
# Nome da branch com indicador de status
parse_git_dirty() {
[[ $(git status 2> /dev/null | tail -n1) != "nothing to commit, working tree clean" ]] && echo "*"
}
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ (\1$(parse_git_dirty))/"
}
PS1='\u@\h:\w\[\033[01;33m\]$(parse_git_branch)\[\033[00m\]\$ '
Esta abordagem é mais portátil, mas carece da sofisticação do git-prompt.sh e pode ser mais lenta em repositórios grandes.
Método 3: Ferramentas de Prompt Modernas
Para uma experiência mais rica com configuração mínima, considere estas alternativas modernas:
Starship Prompt
O Starship é um prompt rápido e personalizável escrito em Rust que funciona em múltiplos shells (bash, zsh, fish, PowerShell).
# Instale o Starship
curl -sS https://starship.rs/install.sh | sh
# Adicione a ~/.bashrc
eval "$(starship init bash)"
O Starship detecta automaticamente repositórios git e exibe:
- Nome da branch
- Hash do commit quando detached
- Estado do repositório (merge, rebase, etc.)
- Contagem de arquivos modificados
- Status à frente/atrasado do upstream
- E muito mais com ícones personalizáveis
Configure-o via ~/.config/starship.toml:
[git_branch]
symbol = "🌱 "
format = "on [$symbol$branch]($style) "
[git_status]
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "🤷"
stashed = "📦"
modified = "📝"
staged = '[++\($count\)](green)'
renamed = "👅"
deleted = "🗑"
Oh My Bash
Oh My Bash é um framework para gerenciar configurações bash com temas e plugins:
# Instale Oh My Bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"
# Edite ~/.bashrc para definir o tema
OSH_THEME="powerline"
Muitos temas do Oh My Bash incluem integração com git por padrão.
Oh My Posh
Oh My Posh é um mecanismo de prompt moderno e cross-platform que funciona com bash, zsh, PowerShell e outros shells. Ele fornece prompts bonitos e personalizáveis com excelente integração git e usa Nerd Fonts para suporte a ícones.
Instalação no Linux
Instale o Oh My Posh com um único comando:
# Instale em ~/bin ou ~/.local/bin (padrão)
curl -s https://ohmyposh.dev/install.sh | bash -s
# Ou especifique um diretório de instalação personalizado
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin
Configuração Básica
Adicione o Oh My Posh ao seu ~/.bashrc:
# Inicialize Oh My Posh com um tema
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"
Instalando e Usando Temas
O Oh My Posh inclui numerosos temas pré-construídos. Baixe-os primeiro:
# Crie o diretório de temas
mkdir ~/.poshthemes
# Baixe todos os temas
curl -s https://ohmyposh.dev/themes.json | \
jq -r '.[] | .url' | \
xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'
Temas populares incluem:
jandedobbeleer.omp.json- O tema pessoal do criador com integração completa do gitpowerline.omp.json- Estilo clássico powerlineatomic.omp.json- Minimalista com informações essenciaisnight-owl.omp.json- Tema rico em cores com detalhes extensos do git
Altere os temas mudando o caminho da configuração:
eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"
Recursos do Git
O Oh My Posh exibe automaticamente informações abrangentes do git:
- Nome da branch atual
- Contagem de commits à frente/atrasado do remoto
- Status do diretório de trabalho (limpo/sujo)
- Contagem de stash
- Estado de merge/rebase
- Informações de tags
- Hash do commit no estado HEAD detached
Configuração Personalizada
Crie um tema personalizado copiando um existente:
# Copie um tema como ponto de partida
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json
# Edite seu tema
nano ~/.mytheme.omp.json
# Use seu tema personalizado
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"
Exemplo de configuração de segmento git em JSON:
{
"type": "git",
"style": "powerline",
"powerline_symbol": "",
"foreground": "#193549",
"background": "#fffb38",
"background_templates": [
"{{ if or (.Working.Changed) (.Staging.Changed) }}#FF9248{{ end }}",
"{{ if and (gt .Ahead 0) (gt .Behind 0) }}#ff4500{{ end }}",
"{{ if gt .Ahead 0 }}#B388FF{{ end }}",
"{{ if gt .Behind 0 }}#B388FF{{ end }}"
],
"properties": {
"fetch_status": true,
"fetch_upstream_icon": true,
"branch_icon": " ",
"branch_max_length": 25,
"truncate_symbol": "…"
}
}
Requisitos de Fonte
O Oh My Posh funciona melhor com Nerd Fonts para suporte a ícones:
# Baixe e instale uma Nerd Font (exemplo: FiraCode)
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
curl -fLo "FiraCode Nerd Font.ttf" \
https://github.com/ryanoasis/nerd-fonts/raw/HEAD/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf
fc-cache -fv
Em seguida, configure seu terminal para usar a Nerd Font. Veja nossa Comparação de Emuladores de Terminal Linux para opções detalhadas de emuladores de terminal.
Vantagens do Oh My Posh
- Cross-platform: A mesma configuração funciona em Linux, macOS e Windows
- Rápido: Escrito em Go para desempenho
- Extensível: Segmentos modulares para git, tempo, caminho, linguagens, provedores de nuvem, etc.
- Temas ricos: Grande coleção de temas pré-fabricados
- Desenvolvimento ativo: Atualizações e melhorias regulares
- Agnóstico de terminal: Funciona em qualquer terminal compatível com ANSI
Bash-git-prompt
Uma ferramenta de prompt bash dedicada focada em informações do git:
# Clone o repositório
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1
# Adicione a ~/.bashrc
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
GIT_PROMPT_ONLY_IN_REPO=1
source $HOME/.bash-git-prompt/gitprompt.sh
fi
Considerações de Desempenho em Repositórios Grandes
Operações de status do git podem ser lentas em repositórios grandes. Aqui estão estratégias de otimização:
Desative Seletivamente Recursos Caros
# Em .bashrc, desative condicionalmente recursos para repositórios grandes
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
repo_size=$(du -sh .git 2>/dev/null | cut -f1)
# Desative verificação de estado sujo para repositórios acima de 100MB
if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
export GIT_PS1_SHOWDIRTYSTATE=0
fi
fi
Use Opções de Configuração do Git
Configure o git para otimizar verificações de status:
# Habilite o monitor de sistema de arquivos para verificações de status mais rápidas
git config core.fsmonitor true
git config core.untrackedCache true
# Para repositórios muito grandes, considere clones parciais
git config core.commitGraph true
git config gc.writeCommitGraph true
Alternativa: Prompts Assíncronos
Ferramentas como Starship usam operações assíncronas para evitar atrasos no prompt. O prompt atualiza após a informação do git ser recuperada, em vez de bloquear.
Solução de Problemas Comuns
Prompt Não Mostrando Informações do Git
- Verifique se git-prompt.sh foi carregado: Execute
type __git_ps1no seu terminal. Se disser “not found”, o script não foi carregado. - Verifique permissões de arquivo: Certifique-se de que git-prompt.sh seja legível:
ls -l /path/to/git-prompt.sh - Verifique se está em um repositório git: Execute
git statuspara confirmar - Verifique a sintaxe PS1: Certifique-se de que
$(__git_ps1)esteja incluído e corretamente cotado
Cores Não Estão Sendo Exibidas
- Problemas com sequências de escape: Cores em PS1 devem ser envoltas em
\[ \]para evitar problemas de quebra de linha - Suporte do terminal: Verifique se seu terminal suporta cores ANSI:
echo -e "\033[31mRed Text\033[0m" - Códigos de reset: Sempre termine sequências de cor com código de reset
\033[00m
Prompt Quebrando Quebra de Linha
Ao usar cores, sequências de escape não imprimíveis devem ser envoltas em \[ e \]:
# Errado - causa problemas de quebra de linha
PS1="\033[32m\u\033[00m\$ "
# Correto
PS1="\[\033[32m\]\u\[\033[00m\]\$ "
Prompt Lento no WSL ou Unidades de Rede
Operações do git em compartilhamentos de rede Windows ou WSL podem ser lentas:
# Desative recursos caros do git-prompt em sistemas de arquivos lentos
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0
Considere usar o bash Git nativo do Windows em vez do WSL para repositórios em drives Windows. Para gerenciar múltiplas janelas de terminal de forma eficiente, veja Como iniciar janelas de terminal em mosaico.
Integração com Fluxos de Trabalho de Desenvolvimento
Um prompt consciente do git torna-se ainda mais poderoso quando combinado com outros aprimoramentos de shell:
Aliases Git para Navegação Rápida
Combine seu prompt aprimorado com aliases git úteis para maximizar a eficiência. Para uma lista abrangente de comandos e atalhos git, veja nosso Folhetos de Comandos GIT.
# Adicione a ~/.gitconfig ou ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'
Comportamento Condicional do Prompt
# Diferentes cores de prompt para diferentes estados
__git_ps1_colorize() {
local git_status="$(git status 2>/dev/null)"
if [[ $git_status =~ "nothing to commit" ]]; then
echo -e "\[\033[32m\]" # Verde para limpo
else
echo -e "\[\033[31m\]" # Vermelho para sujo
fi
}
PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '
Integração com a Barra de Título do Terminal
Atualize o título do terminal com informações do repositório:
PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'
Melhores Práticas e Recomendações
- Mantenha legível: Não sobrecarregue seu prompt com muita informação
- Use cores estrategicamente: Cores diferentes para diferentes estados (limpo vs sujo)
- Teste em múltiplos cenários: Verifique se o prompt funciona em diretórios regulares, repositórios git e durante operações git
- Documente sua configuração: Comente seu .bashrc para lembrar o que cada parte faz
- Faça backup da sua configuração: Controle de versão seus dotfiles em um repositório git. Se você estiver executando seu próprio servidor git, pode querer explorar instalação do servidor Gitea como uma opção auto-hospedada leve
- Considere seu fluxo de trabalho: Habilite apenas os recursos que você realmente precisa
- Use ferramentas modernas quando possível: Starship e ferramentas similares são bem testadas e performáticas
Para soluções git auto-hospedadas, aprenda sobre Backup e Restauração do Gitea para garantir que seus repositórios estejam protegidos. Se você está interessado em automatizar seus fluxos de trabalho git, explore nosso Folhetos GitHub Actions para automação completa de CI/CD.
Links Úteis
- Documentação oficial do Git sobre git-prompt.sh
- Site Oficial do Starship Prompt
- Documentação Oficial do Oh My Posh
- Galeria de Temas do Oh My Posh
- Bash Hackers Wiki - Configuração PS1
- Repositório GitHub do Oh My Bash
- Repositório GitHub do Bash-git-prompt
- Site Oficial das Nerd Fonts
- Referência de Códigos de Escape ANSI
- Dicas de Desempenho do Git para Repositórios Grandes