Mostra ramo Git e stato nel prompt di Bash
Personalizzazione del prompt Bash per il contesto Git immediato
Un prompt bash ben configurato che mostra le informazioni del repository git bash prompt displaying git repository information può migliorare drasticamente il tuo flusso di lavoro di sviluppo.
Invece di eseguire costantemente i comandi git status e git branch, puoi avere questa informazione critica sempre visibile nel tuo terminale.

Esempio del prompt oh-my-push.
Perché aggiungere informazioni git al tuo prompt bash?
Quando lavori con diversi repository git e branch durante la giornata, il passaggio tra contesti diventa un notevole spreco di produttività. Un prompt consapevole di git risolve diversi problemi comuni:
- Previene la confusione tra branch: Conoscerai sempre su quale branch sei prima di effettuare un commit
- Riduce l’overhead dei comandi: Non è necessario eseguire costantemente
git statusegit branch - Feedback visivo immediato: Vedrai modifiche non committate, file non tracciati e stato upstream a colpo d’occhio
- Meno errori: Eviti di commettere accidentalmente su un branch sbagliato o di spostare codice sporco
Comprendere la variabile bash PS1
Il prompt bash è controllato dalla variabile ambiente PS1. Questa variabile può contenere:
- Testo letterale: Qualsiasi carattere che desideri visualizzare
- Sequenze di escape: Codici speciali che iniziano con
\che visualizzano informazioni dinamiche - Sostituzione di comandi: Comandi in
$(...)che vengono eseguiti e visualizzano il loro output - Codici di colore ANSI: Sequenze di escape che modificano i colori del testo
Le sequenze di escape PS1 comuni includono:
\u- nome utente corrente\h- nome dell’host\w- directory di lavoro corrente\$-#per l’utente root,$per l’utente normale\t- ora corrente in formato 24 ore
Un prompt di base potrebbe apparire così: PS1='\u@\h:\w\$ ' produrrebbe un output come user@hostname:/path/to/dir$ . Per ulteriori fondamenti su bash e sequenze di escape, consulta il nostro completo Bash Cheat Sheet.
Metodo 1: Utilizzo dello script git-prompt.sh incluso in git
Le distribuzioni git includono uno script helper chiamato git-prompt.sh che fornisce la funzione __git_ps1. Questo è l’approccio più affidabile e ricco di funzionalità.
Localizzazione di git-prompt.sh
Per prima cosa, trova dove si trova lo script sul tuo sistema:
# Posizioni comuni su Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt
# Posizioni comuni su macOS (con Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
# Cerca se necessario
find /usr -name git-prompt.sh 2>/dev/null
Configurazione base
Aggiungi il seguente al tuo ~/.bashrc o ~/.bash_profile:
# Source del script git-prompt
source /usr/lib/git-core/git-sh-prompt
# Imposta il prompt per includere le informazioni su git
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '
La parte $(__git_ps1 " (%s)") chiama la funzione, e %s viene sostituito con il nome del branch corrente. Gli spazi e le parentesi intorno formattano bene l’output.
Dopo aver modificato, ricarica la tua configurazione:
source ~/.bashrc
Opzioni avanzate di git-prompt.sh
git-prompt.sh diventa potente quando attivi le sue funzionalità opzionali attraverso le variabili d’ambiente:
# Mostra modifiche non aggiornate (*) e aggiornate (+)
export GIT_PS1_SHOWDIRTYSTATE=1
# Mostra se esistono modifiche in sospeso ($)
export GIT_PS1_SHOWSTASHSTATE=1
# Mostra se esistono file non tracciati (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1
# Mostra la differenza tra HEAD e upstream
# Opzioni: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"
# Abilita suggerimenti colorati (richiede bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1
# Mostra lo stato del repository durante le operazioni
# (MERGING, REBASING, BISECTING, ecc.)
export GIT_PS1_DESCRIBE_STYLE="default"
Ecco cosa significano gli indicatori:
*- Modifiche non aggiornate (file modificati non aggiunti)+- Modifiche aggiornate (file aggiunti ma non committati)$- Esistono modifiche in sospeso%- Presenti file non tracciati<- Indietro rispetto al branch upstream>- Avanti rispetto al branch upstream<>- Divergono dal branch upstream=- Uguale al branch upstream
Configurazione completa
Ecco una configurazione completa per il ~/.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
# Configurazione opzioni 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
# Definizioni di colore
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]' # Verde
COLOR_PATH='\[\033[01;34m\]' # Blu
COLOR_GIT='\[\033[01;33m\]' # Giallo
# Imposta il prompt
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "
Metodo 2: Sostituzione manuale del comando git
Se non hai accesso a git-prompt.sh o vuoi una soluzione minimale, puoi eseguire direttamente i comandi git nel tuo prompt:
# Solo nome del branch
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '
# Nome del branch con indicatore di stato
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\]\$ '
Questo approccio è più portabile ma manca dell’abilità di git-prompt.sh e può essere più lento in repository molto grandi.
Metodo 3: Strumenti moderni per il prompt
Per un’esperienza più ricca con una configurazione minima, considera queste moderne alternative:
Starship Prompt
Starship è un prompt veloce e personalizzabile scritto in Rust che funziona su diversi shell (bash, zsh, fish, PowerShell).
# Installa Starship
curl -sS https://starship.rs/install.sh | sh
# Aggiungi a ~/.bashrc
eval "$(starship init bash)"
Starship rileva automaticamente i repository git e visualizza:
- Nome del branch
- Hash del commit quando non si è su un branch
- Stato del repository (merge, rebase, ecc.)
- Conteggio dei file modificati
- Stato di avanzamento/ritardo rispetto al branch upstream
- E molto altro con icone personalizzabili
Configuralo tramite ~/.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 è un framework per gestire la configurazione bash con temi e plugin:
# Installa Oh My Bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"
# Modifica ~/.bashrc per impostare il tema
OSH_THEME="powerline"
Molti temi Oh My Bash includono l’integrazione git di default.
Oh My Posh
Oh My Posh è un motore moderno e multi-piattaforma per i prompt che funziona con bash, zsh, PowerShell e altre shell. Fornisce prompt bellissimi e personalizzabili con eccellente integrazione git e utilizza le Nerd Fonts per il supporto delle icone.
Installazione su Linux
Installa Oh My Posh con un singolo comando:
# Installa in ~/bin o ~/.local/bin (predefinito)
curl -s https://ohmyposh.dev/install.sh | bash -s
# Oppure specifica una directory di installazione personalizzata
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin
Configurazione base
Aggiungi Oh My Posh al tuo ~/.bashrc:
# Inizializza Oh My Posh con un tema
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"
Installazione e utilizzo dei temi
Oh My Posh include numerosi temi predefiniti. Scaricali prima:
# Crea la directory dei temi
mkdir ~/.poshthemes
# Scarica tutti i temi
curl -s https://ohmyposh.dev/themes.json | \
jq -r '.[] | .url' | \
xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'
Tempi popolari includono:
jandedobbeleer.omp.json- Il tema personale dell’autore con integrazione completa di gitpowerline.omp.json- Stile classico powerlineatomic.omp.json- Minimalista con informazioni essenzialinight-owl.omp.json- Tema ricco di colori con dettagli estesi su git
Passa ai temi modificando il percorso del config:
eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"
Funzionalità git
Oh My Posh visualizza automaticamente informazioni dettagliate su git:
- Nome del branch corrente
- Conteggio dei commit avanzati/ritardati rispetto al branch remoto
- Stato del working directory (pulito/sporco)
- Conteggio delle modifiche in sospeso
- Stato di merge/rebase
- Informazioni sul tag
- Hash del commit in stato detached HEAD
Configurazione personalizzata
Crea un tema personalizzato copiando uno esistente:
# Copia un tema come punto di partenza
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json
# Modifica il tuo tema
nano ~/.mytheme.omp.json
# Usa il tuo tema personalizzato
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"
Esempio di configurazione del segmento git in 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": "…"
}
}
Requisiti delle font
Oh My Posh funziona meglio con Nerd Fonts per il supporto delle icone:
# Scarica e installa una Nerd Font (esempio: 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
Poi configura il tuo terminale per utilizzare la Nerd Font.
Vantaggi di Oh My Posh
- Multi-piattaforma: La stessa configurazione funziona su Linux, macOS e Windows
- Velocità: Scritto in Go per prestazioni elevate
- Estensibile: Segmenti modulari per git, orario, percorso, linguaggi, provider cloud, ecc.
- Tempi ricchi: Grande raccolta di temi predefiniti
- Sviluppo attivo: Aggiornamenti e miglioramenti regolari
- Indipendente dal terminale: Funziona in qualsiasi terminale compatibile ANSI
Bash-git-prompt
Un tool dedicato per il prompt bash focalizzato sulle informazioni git:
# Clona il repository
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1
# Aggiungi 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
Considerazioni sulle prestazioni in repository grandi
Le operazioni git status possono essere lente in repository molto grandi. Ecco alcune strategie di ottimizzazione:
Disattiva selettivamente le funzionalità costose
# In .bashrc, disattiva le funzionalità per repository grandi
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
repo_size=$(du -sh .git 2>/dev/null | cut -f1)
# Disattiva il controllo dello stato sporco per repository sopra 100MB
if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
export GIT_PS1_SHOWDIRTYSTATE=0
fi
fi
Utilizza opzioni di configurazione git
Configura git per ottimizzare i controlli di stato:
# Abilita il monitoraggio del filesystem per controlli di stato più veloci
git config core.fsmonitor true
git config core.untrackedCache true
# Per repository molto grandi, considera cloni parziali
git config core.commitGraph true
git config gc.writeCommitGraph true
Alternativa: Prompt asincroni
Strumenti come Starship utilizzano operazioni asincrone per prevenire il ritardo del prompt. Il prompt si aggiorna dopo che le informazioni git sono state recuperate, invece di bloccare.
Risoluzione dei problemi comuni
Il prompt non mostra le informazioni git
- Verifica che git-prompt.sh sia caricato: Esegui
type __git_ps1nel tuo terminale. Se dice “non trovato”, lo script non è caricato. - Controlla i permessi del file: Assicurati che git-prompt.sh sia leggibile:
ls -l /path/to/git-prompt.sh - Verifica che tu sia in un repository git: Esegui
git statusper confermare - Controlla la sintassi PS1: Assicurati che
$(__git_ps1)sia incluso e correttamente citato
I colori non vengono visualizzati
- Problemi con le sequenze di escape: I colori in PS1 devono essere avvolti in
\[ \]per prevenire problemi di wrapping delle righe - Supporto del terminale: Verifica che il tuo terminale supporti i colori ANSI:
echo -e "\033[31mRed Text\033[0m" - Codici di reset: Sempre terminare le sequenze di colore con il codice di reset
\033[00m
Il prompt rompe il wrapping delle righe
Quando si usano i colori, le sequenze di escape non stampabili devono essere avvolte in \[ e \]:
# Errato - causa problemi di wrapping
PS1="\033[32m\u\033[00m\$ "
# Corretto
PS1="\[\033[32m\]\u\[\033[00m\]\$ "
Prompt lento in WSL o su dischi di rete
Le operazioni git su condivisioni di rete o WSL possono essere lente:
# Disattiva funzionalità costose di git-prompt su filesystem lenti
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0
Considera l’uso di Git bash nativo invece di WSL per repository su dischi Windows.
Integrazione con i flussi di lavoro di sviluppo
Un prompt consapevole di git diventa ancora più potente quando combinato con altre migliorazioni del shell:
Aliase git per la navigazione rapida
Combina il tuo prompt migliorato con utili aliase git per massimizzare l’efficienza. Per un elenco completo di comandi git e scorciatoie, vedi la nostra GIT commands cheatsheet.
# Aggiungi a ~/.gitconfig o ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'
Comportamento del prompt condizionale
# Colori diversi per diversi stati
__git_ps1_colorize() {
local git_status="$(git status 2>/dev/null)"
if [[ $git_status =~ "nothing to commit" ]]; then
echo -e "\[\033[32m\]" # Verde per pulito
else
echo -e "\[\033[31m\]" # Rosso per sporco
fi
}
PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '
Integrazione con la barra del titolo del terminale
Aggiorna la barra del titolo del terminale con informazioni sul repository:
PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'
Linee guida e raccomandazioni
- Mantieni la leggibilità: Non sovraccaricare il prompt con troppa informazione
- Usa i colori strategicamente: Colori diversi per diversi stati (pulito vs sporco)
- Testa in diversi scenari: Verifica che il prompt funzioni in directory normali, repository git e durante le operazioni git
- Documenta la tua configurazione: Commenta il tuo .bashrc per ricordarti cosa fa ogni parte
- Fai backup della tua configurazione: Versiona i tuoi dotfiles in un repository git. Se stai gestendo il tuo server git, potresti voler esplorare Gitea server installing come opzione leggera self-hosted
- Considera il tuo flusso di lavoro: Abilita solo le funzionalità che effettivamente necessiti
- Usa gli strumenti moderni quando possibile: Starship e strumenti simili sono ben testati e performanti
Per soluzioni self-hosted git, impara su Gitea Backup and Restore per assicurarti che i tuoi repository siano protetti. Se sei interessato ad automatizzare i tuoi flussi di lavoro git, esplora il nostro GitHub Actions cheatsheet per un’automazione completa di CI/CD.
Link utili
- Documentazione ufficiale di Git su git-prompt.sh
- Sito ufficiale di Starship Prompt
- Documentazione ufficiale di Oh My Posh
- Galleria dei temi di Oh My Posh
- Wiki di Bash Hackers - Configurazione PS1
- Repository GitHub di Oh My Bash
- Repository GitHub di bash-git-prompt
- Sito ufficiale di Nerd Fonts
- Riferimento dei codici ANSI Escape
- Consigli su git per repository molto grandi