Mostra ramo Git e stato nel prompt di Bash

Personalizzazione del prompt Bash per il contesto Git immediato

Indice

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.

oh-my-posh

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 status e git 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 git
  • powerline.omp.json - Stile classico powerline
  • atomic.omp.json - Minimalista con informazioni essenziali
  • night-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

  1. Verifica che git-prompt.sh sia caricato: Esegui type __git_ps1 nel tuo terminale. Se dice “non trovato”, lo script non è caricato.
  2. Controlla i permessi del file: Assicurati che git-prompt.sh sia leggibile: ls -l /path/to/git-prompt.sh
  3. Verifica che tu sia in un repository git: Esegui git status per confermare
  4. Controlla la sintassi PS1: Assicurati che $(__git_ps1) sia incluso e correttamente citato

I colori non vengono visualizzati

  1. Problemi con le sequenze di escape: I colori in PS1 devono essere avvolti in \[ \] per prevenire problemi di wrapping delle righe
  2. Supporto del terminale: Verifica che il tuo terminale supporti i colori ANSI: echo -e "\033[31mRed Text\033[0m"
  3. 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

  1. Mantieni la leggibilità: Non sovraccaricare il prompt con troppa informazione
  2. Usa i colori strategicamente: Colori diversi per diversi stati (pulito vs sporco)
  3. Testa in diversi scenari: Verifica che il prompt funzioni in directory normali, repository git e durante le operazioni git
  4. Documenta la tua configurazione: Commenta il tuo .bashrc per ricordarti cosa fa ogni parte
  5. 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
  6. Considera il tuo flusso di lavoro: Abilita solo le funzionalità che effettivamente necessiti
  7. 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.

Altri articoli utili