Toon Git-vertakking & status in Bash-prompt

Aanpassen van de Bash-prompt voor directe Git-context

Inhoud

Een goed geconfigureerde bash prompt die git repository informatie toont kan het ontwikkelingswerkflow aanzienlijk verbeteren.

In plaats van constant git status en git branch commando’s uit te voeren, kun je deze essentiële informatie altijd zichtbaar houden in je terminal prompt.

oh-my-posh

Oh-my-push prompt voorbeeld.

Waarom Git informatie toevoegen aan je Bash Prompt?

Wanneer je meerdere git repositories en branches gebruikt gedurende de dag, wordt contextswitchen een aanzienlijke productiviteitsverlies. Een git-bewuste prompt lost meerdere algemene problemen op:

  • Voorkomt branch verwarring: Je weet altijd welke branch je op is voordat je commit
  • Vermindert commando overhead: Geen behoefte om constant git status en git branch uit te voeren
  • Directe visuele feedback: Zie ongecommiteerde wijzigingen, ongevolgde bestanden en upstream status op een blik
  • Minder fouten: Vermijd onbedoelde commits op de verkeerde branch of het pushen van vuil code

Begrijpen van de Bash PS1 Variabele

De bash prompt wordt beheerd door de PS1 omgevingsvariabele. Deze variabele kan bevatten:

  • Letterlijke tekst: Elke karakter die je wilt tonen
  • Escape sequences: Speciale codes die beginnen met \ die dynamische informatie tonen
  • Commando substitutie: Commando’s in $(...) die uitgevoerd en hun uitvoer tonen
  • ANSI kleur codes: Escape sequences die de tekstkleuren veranderen

Algemene PS1 escape sequences zijn:

  • \u - huidige gebruikersnaam
  • \h - hostnaam
  • \w - huidige werkmap
  • \$ - # voor root, $ voor normale gebruiker
  • \t - huidige tijd in 24-uur formaat

Een basis prompt zou er zo uitzien: PS1='\u@\h:\w\$ ' en produceert uitvoer zoals user@hostname:/path/to/dir$ . Voor meer bash fundamentele informatie en escape sequences, zie onze uitgebreide Bash Cheat Sheet.

Methode 1: Gebruik van Git’s ingebouwde git-prompt.sh Script

Git distributies bevatten een helper script genaamd git-prompt.sh dat de __git_ps1 functie biedt. Dit is de meest betrouwbare en functierijke aanpak.

Locatie van git-prompt.sh

Eerst, vind waar het script zich bevindt op je systeem:

# Algemene locaties op Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# Algemene locaties op macOS (met Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# Zoek het als het nodig is
find /usr -name git-prompt.sh 2>/dev/null

Basisconfiguratie

Voeg het volgende toe aan je ~/.bashrc of ~/.bash_profile:

# Source de git-prompt script
source /usr/lib/git-core/git-sh-prompt

# Stel je prompt in om git informatie te bevatten
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

De $(__git_ps1 " (%s)") deel roept de functie aan, en %s wordt vervangen door de huidige branchnaam. De omringende spaties en haakjes vormen het mooi.

Na het bewerken, herlaad je configuratie:

source ~/.bashrc

Geavanceerde git-prompt.sh Opties

Git-prompt.sh wordt krachtig wanneer je zijn optionele functies inschakelt via omgevingsvariabelen:

# Toon ongecommiteerde (*) en gecommitteerde (+) wijzigingen
export GIT_PS1_SHOWDIRTYSTATE=1

# Toon als er gearchiveerde wijzigingen ($)
export GIT_PS1_SHOWSTASHSTATE=1

# Toon als er ongevolgde bestanden (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1

# Toon het verschil tussen HEAD en upstream
# Opties: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# Schakel gekleurde hints in (vereist bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1

# Toon repository status tijdens operaties
# (MERGING, REBASING, BISECTING, etc.)
export GIT_PS1_DESCRIBE_STYLE="default"

Hier is wat de indicatoren betekenen:

  • * - Ongecommitteerde wijzigingen (gewijzigde bestanden niet toegevoegd)
  • + - Gecommitteerde wijzigingen (bestanden toegevoegd maar niet gecommit)
  • $ - Er zijn gearchiveerde wijzigingen
  • % - Er zijn ongevolgde bestanden aanwezig
  • < - Achterstand op de upstream branch
  • > - Vooruit op de upstream branch
  • <> - Afgedwaald van de upstream
  • = - Gelijk aan de upstream

Compleet Voorbeeld van Configuratie

Hier is een uitgebreide ~/.bashrc configuratie:

# 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 git-prompt opties
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

# Kleur definities
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # Groen
COLOR_PATH='\[\033[01;34m\]'      # Blauw
COLOR_GIT='\[\033[01;33m\]'       # Geel

# Stel de prompt in
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "

Methode 2: Handmatige Git Commando Substitutie

Als je geen toegang hebt tot git-prompt.sh of een minimale oplossing wilt, kun je direct git commando’s uitvoeren in je prompt:

# Alleen branch naam
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '

# Branch naam met status indicator
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\]\$ '

Deze aanpak is meer draagbaar maar mist de sofistiek van git-prompt.sh en kan langzamer zijn in grote repositories.

Methode 3: Moderne Prompt Tools

Voor een rijkere ervaring met minimale configuratie, overweeg deze moderne alternatieven:

Starship Prompt

Starship is een snelle, aanpasbare prompt geschreven in Rust die werkt over meerdere shells (bash, zsh, fish, PowerShell).

# Installeer Starship
curl -sS https://starship.rs/install.sh | sh

# Voeg toe aan ~/.bashrc
eval "$(starship init bash)"

Starship detecteert automatisch git repositories en toont:

  • Branchnaam
  • Commit hash wanneer losgekoppeld
  • Repository status (samenvoegen, rebase, etc.)
  • Aantal gewijzigde bestanden
  • Vooruit/achterstand status op upstream
  • En veel meer met aanpasbare iconen

Configureer het via ~/.config/starship.toml:

[git_branch]
symbol = "🌱 "
format = "op [$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 is een kader voor het beheren van bash configuratie met thema’s en plugins:

# Installeer Oh My Bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"

# Bewerk ~/.bashrc om thema in te stellen
OSH_THEME="powerline"

Veel Oh My Bash thema’s bevatten standaard git integratie.

Oh My Posh

Oh My Posh is een moderne, cross-platform prompt engine die werkt met bash, zsh, PowerShell en andere shells. Het biedt mooie, aanpasbare prompts met uitstekende git integratie en gebruikt Nerd Fonts voor icon ondersteuning.

Installatie op Linux

Installeer Oh My Posh met één commando:

# Installeer naar ~/bin of ~/.local/bin (standaard)
curl -s https://ohmyposh.dev/install.sh | bash -s

# Of specifieke installatie map
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

Basisinstelling

Voeg Oh My Posh toe aan je ~/.bashrc:

# Initialiseer Oh My Posh met een thema
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"

Installeren en Gebruiken van Themen

Oh My Posh bevat veel vooraf gemaakte thema’s. Download ze eerst:

# Maak thema map aan
mkdir ~/.poshthemes

# Download alle thema's
curl -s https://ohmyposh.dev/themes.json | \
  jq -r '.[] | .url' | \
  xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'

Populaire thema’s zijn:

  • jandedobbeleer.omp.json - Het persoonlijke thema van de maker met volledige git integratie
  • powerline.omp.json - Classic powerline stijl
  • atomic.omp.json - Minimalistisch met essentiële informatie
  • night-owl.omp.json - Kleurrijke thema met uitgebreide git details

Wissel thema’s door de config pad te veranderen:

eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"

Git Functies

Oh My Posh toont automatisch uitgebreide git informatie:

  • Huidige branchnaam
  • Aantal commits vooruit/achterstand op remote
  • Werktuig status (schone/vuile)
  • Aantal gearchiveerde wijzigingen
  • Samenvoeging/rebase status
  • Tag informatie
  • Commit hash in losgekoppeld HEAD staat

Aangepaste Configuratie

Maak een aangepast thema door een bestaand te kopiëren:

# Kopieer een thema als startpunt
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# Bewerk je thema
nano ~/.mytheme.omp.json

# Gebruik je aangepaste thema
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

Voorbeeld git segment configuratie 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": "…"
  }
}

Font Vereisten

Oh My Posh werkt het beste met Nerd Fonts voor icon ondersteuning:

# Download en installeer een Nerd Font (voorbeeld: 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

Vervolgens configureer je je terminal om de Nerd Font te gebruiken.

Voordelen van Oh My Posh

  • Cross-platform: Dezelfde configuratie werkt op Linux, macOS en Windows
  • Snel: Geschreven in Go voor prestaties
  • Uitbreidbaar: Modulaire segmenten voor git, tijd, pad, talen, cloudproviders, etc.
  • Rijke thema’s: Grote verzameling vooraf gemaakte thema’s
  • Actieve ontwikkeling: Regelmatige updates en verbeteringen
  • Terminal onafhankelijk: Werkt in elke ANSI-compatibele terminal

Bash-git-prompt

Een toegewijde bash prompt tool gericht op git informatie:

# Clone de repository
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1

# Voeg toe aan ~/.bashrc
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
    GIT_PROMPT_ONLY_IN_REPO=1
    source $HOME/.bash-git-prompt/gitprompt.sh
fi

Prestatieoverwegingen in grote repositories

Git status operaties kunnen traag zijn in grote repositories. Hier zijn optimalisatiestrategieën:

Selectief uitschakelen van duurzame functies

# In .bashrc, conditioneel uitschakelen van functies voor grote repos
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # Uitschakelen van dirty state check voor repos boven 100MB
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

Gebruik van Git configuratieopties

Configureer git om statuscontroles te optimaliseren:

# Schakel bestandssysteem monitor in voor snellere statuscontroles
git config core.fsmonitor true
git config core.untrackedCache true

# Voor zeer grote repos, overweeg gedeeltelijke clones
git config core.commitGraph true
git config gc.writeCommitGraph true

Alternatief: Asynchrone prompts

Tools zoals Starship gebruiken asynchrone operaties om promptvertraging te voorkomen. De prompt wordt bijgewerkt na het ophalen van de git informatie, in plaats van te blokkeren.

Probleemoplossing van algemene problemen

Prompt toont geen git informatie

  1. Controleer of git-prompt.sh is ingeladen: Voer type __git_ps1 uit in je terminal. Als het zegt “niet gevonden”, is het script niet geladen.
  2. Controleer bestandsrechten: Zorg dat git-prompt.sh leesbaar is: ls -l /pad/naar/git-prompt.sh
  3. Controleer of je in een git repository bent: Voer git status uit om te bevestigen
  4. Controleer PS1 syntaxis: Zorg dat $(__git_ps1) is opgenomen en correct aangehaald

Kleuren tonen niet

  1. Escape sequence problemen: Kleuren in PS1 moeten worden omringd door \[ \] om line wrap problemen te voorkomen
  2. Terminal ondersteuning: Controleer of je terminal ANSI kleuren ondersteunt: echo -e "\033[31mRode tekst\033[0m"
  3. Reset codes: Eindig altijd kleurreeksen met reset code \033[00m

Prompt breekt line wrap

Wanneer je kleuren gebruikt, moeten niet-afdrukbare escape sequences worden omringd door \[ en \]:

# Fout - veroorzaakt line wrap problemen
PS1="\033[32m\u\033[00m\$ "

# Correct
PS1="\[\033[32m\]\u\[\033[00m\]\$ "

Traag prompt in WSL of netwerk drives

Git operaties op Windows netwerk shares of WSL kunnen traag zijn:

# Uitschakelen van duurzame git-prompt functies op traag bestandssysteem
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Overweeg het gebruik van native Windows Git bash in plaats van WSL voor repositories op Windows drives.

Integratie met ontwikkelingswerkstromen

Een git-bewuste prompt wordt nog krachtiger wanneer gecombineerd met andere shell verbeteringen:

Git alias voor snelle navigatie

Combineer je verbeterde prompt met nuttige git alias om efficiëntie te maximaliseren. Voor een uitgebreide lijst van git commando’s en snelkoppelingen, zie onze GIT commando’s cheat sheet.

# Voeg toe aan ~/.gitconfig of ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

Voorwaardelijke prompt gedrag

# Verschillende prompt kleuren voor verschillende statussen
__git_ps1_colorize() {
    local git_status="$(git status 2>/dev/null)"
    if [[ $git_status =~ "nothing to commit" ]]; then
        echo -e "\[\033[32m\]"  # Groen voor schone
    else
        echo -e "\[\03段\]"  # Rood voor vuil
    fi
}

PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Terminal titelbalk integratie

Update de terminal titel met repository informatie:

PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'

Beste praktijken en aanbevelingen

  1. Houd het leesbaar: Overlaad je prompt niet met te veel informatie
  2. Gebruik kleuren strategisch: Verschillende kleuren voor verschillende statussen (schone vs vuil)
  3. Test in meerdere scenario’s: Controleer of de prompt werkt in reguliere mappen, git repos en tijdens git operaties
  4. Documenteer je configuratie: Voeg opmerkingen toe aan je .bashrc zodat je weet wat elk deel doet
  5. Back-up je configuratie: Version controleer je dotfiles in een git repository. Als je je eigen git server draait, wil je mogelijk Gitea server installeren als lichte zelfgehoste optie
  6. Overweeg je werkstroom: Schakel alleen de functies in die je daadwerkelijk nodig hebt
  7. Gebruik moderne tools wanneer mogelijk: Starship en vergelijkbare tools zijn goed getest en prestatiekrachtig

Voor zelfgehoste git oplossingen, lees over Gitea Backup en Restore om ervoor te zorgen dat je repositories beschermd zijn. Als je geïnteresseerd bent in het automatiseren van je git werkstromen, verkennen we onze GitHub Actions cheat sheet voor uitgebreide CI/CD automatisering.

Andere nuttige artikelen