Exibir Branch e Status do Git no Prompt do Bash
Personalização do prompt Bash para contexto Git instantâneo
Uma linha de comando bem configurada exibindo informações do repositório git pode melhorar significativamente seu fluxo de trabalho de desenvolvimento.
Em vez de executar constantemente os comandos git status e git branch, você pode ter essa informação crítica sempre visível na sua linha de terminal.

Exemplo de prompt com oh-my-posh.
Por que adicionar informações do Git ao seu prompt do Bash?
Quando você está trabalhando com múltiplos repositórios git e branches ao longo do dia, a troca de contexto se torna uma grande perda de produtividade. Um prompt consciente de git resolve vários problemas comuns:
- Previne confusão de branch: Você sempre saberá em qual branch está antes de fazer um commit
- Reduz sobrecarga de comandos: Não será necessário executar constantemente
git statusegit branch - Feedback visual imediato: Veja mudanças não comprometidas, arquivos não rastreados e status upstream à vista
- Menos erros: Evite acidentalmente comitar em uma branch errada ou enviar 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ê deseja exibir
- Sequências de escape: Códigos especiais começando com
\que exibem informações dinâmicas - Substituição de comandos: Comandos em
$(...)que são executados e exibem sua saída - Códigos de cor ANSI: Sequências de escape que alteram as cores do texto
Sequências de escape comuns incluem:
\u- nome de usuário atual\h- hostname\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 com: PS1='\u@\h:\w\$ ' produzindo saída como user@hostname:/path/to/dir$ . Para mais fundamentos do bash e sequências de escape, consulte nossa Folha de Dicas do Bash.
Método 1: Usando o script git-prompt.sh integrado ao Git
Distribuições do Git incluem um script de ajuda chamado git-prompt.sh que fornece a função __git_ps1. Este é o método mais confiável e rico em recursos.
Localizando git-prompt.sh
Primeiro, encontre onde o script está localizado no seu sistema:
# Locais 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
# Locais comuns no macOS (com Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
# Procure 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:
# Fonte 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 bem.
Após editar, recarregue sua configuração:
source ~/.bashrc
Opções avançadas de git-prompt.sh
O git-prompt.sh se torna poderoso quando você ativa seus recursos opcionais por meio de variáveis de ambiente:
# Mostre mudanças não comprometidas (*) e comprometidas (+)
export GIT_PS1_SHOWDIRTYSTATE=1
# Mostre se há mudanças em stash ($)
export GIT_PS1_SHOWSTASHSTATE=1
# Mostre se há arquivos não rastreados (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1
# Mostre a diferença entre HEAD e upstream
# Opções: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"
# Ative dicas de cor (requer bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1
# Mostre o estado do repositório durante operações
# (MERGING, REBASING, BISECTING, etc.)
export GIT_PS1_DESCRIBE_STYLE="default"
Aqui está o que os indicadores significam:
*- Mudanças não comprometidas (arquivos modificados, mas não adicionados)+- Mudanças comprometidas (arquivos adicionados, mas não comprometidos)$- Existem mudanças em stash%- Arquivos não rastreados presentes<- Para trás da branch upstream>- À frente da branch upstream<>- Divergido da upstream=- Igual à upstream
Configuração completa
Aqui está uma configuração abrangente para o ~/.bashrc:
# Fonte 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 de 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 cor
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 manual de comandos git
Se você não tiver acesso ao git-prompt.sh ou quiser uma solução minimalista, pode executar diretamente comandos git em seu prompt:
# Apenas o nome da branch
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\]\$ '
Este método é mais portável, mas carece da sofisticação do git-prompt.sh e pode ser mais lento em repositórios grandes.
Método 3: Ferramentas modernas de prompt
Para uma experiência mais rica com mínima configuração, considere essas alternativas modernas:
Prompt Starship
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 ao ~/.bashrc
eval "$(starship init bash)"
O Starship detecta automaticamente repositórios git e exibe:
- Nome da branch
- Hash de commit quando desconectado
- Estado do repositório (merge, rebase, etc.)
- Contagem de arquivos modificados
- Status de adiantamento/retardo em relação à 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 a configuração do 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 motor moderno e multiplataforma de prompt que funciona com bash, zsh, PowerShell e outros shells. Ele fornece prompts bonitos e personalizáveis com excelente integração com git e usa Nerd Fonts para suporte a ícones.
Instalação no Linux
Instale Oh My Posh com um único comando:
# Instale para ~/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 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
Oh My Posh inclui vários temas pré-construídos. Primeiro, baixe-os:
# 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 com gitpowerline.omp.json- Estilo clássico powerlineatomic.omp.json- Minimalista com informações essenciaisnight-owl.omp.json- Tema rico em cores com detalhes extensos de git
Mude de tema alterando o caminho da configuração:
eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"
Funcionalidades de git
Oh My Posh exibe automaticamente informações completas de git:
- Nome da branch atual
- Contagem de commits à frente/atrás do remoto
- Estado do diretório de trabalho (limpo/sujo)
- Contagem de stash
- Estado de merge/rebase
- Informações de tag
- Hash de commit em estado de HEAD desconectado
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 de 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
Oh My Posh funciona melhor com Nerd Fonts para suporte a ícones:
# Faça o download e instale uma fonte Nerd (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 fonte Nerd.
Vantagens de Oh My Posh
- Multiplataforma: 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, idiomas, provedores de nuvem, etc.
- Temas ricos: Coleção grande de temas pré-feitos
- Desenvolvimento ativo: Atualizações e melhorias regulares
- Agnóstico de terminal: Funciona em qualquer terminal compatível com ANSI
Bash-git-prompt
Uma ferramenta dedicada para prompt do bash focada em informações de git:
# Clone o repositório
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1
# Adicione ao ~/.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 recursos caros seletivamente
# No .bashrc, desative recursos condicionalmente 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:
# Ative 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 é atualizado após a informação de git ser obtida, em vez de bloquear.
Solução de problemas comuns
Prompt não mostrando informações de git
- Verifique se git-prompt.sh foi fonteado: Execute
type __git_ps1no seu terminal. Se ele disser “não encontrado”, o script não foi carregado. - Verifique permissões de arquivo: Certifique-se de que git-prompt.sh é legível:
ls -l /caminho/para/git-prompt.sh - Verifique se você está em um repositório git: Execute
git statuspara confirmar - Verifique a sintaxe PS1: Certifique-se de que
$(__git_ps1)está incluído e corretamente citado
Cores não exibindo
- Problemas com sequências de escape: As cores no PS1 devem estar envoltas em
\[ \]para evitar problemas de quebra de linha - Suporte do terminal: Verifique se seu terminal suporta cores ANSI:
echo -e "\033[31mTexto vermelho\033[0m" - Códigos de reset: Sempre termine as sequências de cor com o código de reset
\033[00m
Prompt quebrando quebra de linha
Quando usando cores, sequências de escape não imprimíveis devem estar 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 em WSL ou drives de rede
Operações de git em compartilhamentos de rede ou WSL podem ser lentas:
# Desative recursos caros de git-prompt em sistemas de arquivos lentos
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS链
Considere usar o Git bash nativo no lugar do WSL para repositórios em drives do Windows.
## Integração com fluxos de trabalho de desenvolvimento
Um prompt consciente de git se torna ainda mais poderoso quando combinado com outras melhorias do shell:
### Aliases de git para navegação rápida
Combine seu prompt aprimorado com aliases úteis de git para maximizar a eficiência. Para uma lista abrangente de comandos e atalhos de git, consulte nossa [Folha de Dicas de Comandos Git](https://www.glukhov.org/pt/post/2022/git-cheatsheet/ "Folha de Dicas de Comandos Git").
```bash
# 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 do prompt condicional
# Cores diferentes 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"'
Boas práticas e recomendações
- Mantenha legível: Não sobrecarregue seu prompt com muita informação
- Use cores estrategicamente: Diferentes cores 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, talvez queira explorar Instalação e teste do Gitea como uma opção leve de auto-hospedagem
- Considere seu fluxo de trabalho: Ative apenas os recursos que você realmente precisa
- Use ferramentas modernas quando possível: Starship e ferramentas similares são bem testadas e performantes
Para soluções de git auto-hospedadas, aprenda sobre Backup e restauração do Gitea para garantir que seus repositórios sejam protegidos. Se você estiver interessado em automatizar seus fluxos de trabalho de git, explore nossa Folha de Dicas de GitHub Actions para automação abrangente 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
- Wiki do Bash Hackers - Configuração PS1
- Repositório do Oh My Bash no GitHub
- Repositório do bash-git-prompt no GitHub
- Site oficial dos Nerd Fonts
- Referência de código de escape ANSI
- Dicas de desempenho do Git para repositórios grandes