Git-Verzweigung & Status in der Bash-Eingabeaufforderung anzeigen

Anpassung der Bash-Prompt für den sofortigen Git-Kontext

Inhaltsverzeichnis

Ein gut konfigurierter Bash-Prompt, der Git-Repository-Informationen anzeigt kann Ihren Entwicklungsworkflow erheblich verbessern.

Statt ständig die Befehle git status und git branch auszuführen, können Sie diese kritischen Informationen immer in Ihrer Terminal-Eingabeaufforderung sichtbar haben.

oh-my-posh

Beispiel für einen Oh-my-push-Prompt.

Warum Git-Informationen zu Ihrem Bash-Prompt hinzufügen?

Wenn Sie den ganzen Tag mit mehreren Git-Repositories und -Zweigen arbeiten, wird das Kontextwechseln zu einer erheblichen Produktivitätsbelastung. Ein git-aware-Prompt löst mehrere häufige Probleme:

  • Verhindert Zweigverwirrung: Sie wissen immer, auf welchem Zweig Sie sich befinden, bevor Sie commiten
  • Reduziert Befehlsaufwand: Keine Notwendigkeit, ständig git status und git branch auszuführen
  • Unmittelbare visuelle Rückmeldung: Sehen Sie unveränderte Änderungen, nicht verfolgte Dateien und Upstream-Status auf einen Blick
  • Weniger Fehler: Vermeiden Sie versehentliches Committieren auf den falschen Zweig oder das Pushen von schmutzigem Code

Verständnis der Bash-PS1-Variablen

Die Bash-Eingabeaufforderung wird durch die PS1-Umgebungsvariable gesteuert. Diese Variable kann enthalten:

  • Literale Texte: Jede Zeichen, die Sie anzeigen möchten
  • Escape-Sequenzen: Spezielle Codes, die mit \ beginnen und dynamische Informationen anzeigen
  • Befehlssubstitution: Befehle in $(...), die ausgeführt werden und ihre Ausgabe anzeigen
  • ANSI-Farbcodes: Escape-Sequenzen, die den Text farblich ändern

Häufige PS1-Escape-Sequenzen sind:

  • \u - aktueller Benutzername
  • \h - Hostname
  • \w - aktuelles Arbeitsverzeichnis
  • \$ - # für root, $ für normalen Benutzer
  • \t - aktuelle Zeit im 24-Stunden-Format

Eine grundlegende Eingabeaufforderung könnte so aussehen: PS1='\u@\h:\w\$ ' und die Ausgabe wäre z.B. benutzer@hostname:/pfad/zum/verzeichnis$. Für mehr Bash-Grundlagen und Escape-Sequenzen besuchen Sie unseren umfassenden Bash Cheat Sheet.

Methode 1: Verwendung des eingebauten Git-Skripts git-prompt.sh

Git-Distributionen enthalten ein Hilfsskript namens git-prompt.sh, das die Funktion __git_ps1 bereitstellt. Dies ist der zuverlässigste und funktionsreichste Ansatz.

Auffinden von git-prompt.sh

Zuerst finden Sie heraus, wo sich das Skript auf Ihrem System befindet:

# Häufige Orte auf Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# Häufige Orte auf macOS (mit Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# Suchen Sie danach, falls nötig
find /usr -name git-prompt.sh 2>/dev/null

Grundlegende Konfiguration

Fügen Sie Folgendes zu Ihrer ~/.bashrc oder ~/.bash_profile hinzu:

# Laden Sie das git-prompt-Skript
source /usr/lib/git-core/git-sh-prompt

# Setzen Sie Ihre Eingabeaufforderung, um Git-Informationen zu enthalten
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Der Teil $(__git_ps1 " (%s)") ruft die Funktion auf, und %s wird durch den Namen des aktuellen Zweigs ersetzt. Die umgebenden Leerzeichen und Klammern formatieren es schön.

Nach der Bearbeitung laden Sie Ihre Konfiguration neu:

source ~/.bashrc

Erweitere git-prompt.sh-Optionen

Git-prompt.sh wird leistungsfähig, wenn Sie seine optionalen Funktionen über Umgebungsvariablen aktivieren:

# Zeigt nicht gestagte (*) und gestagte (+) Änderungen an
export GIT_PS1_SHOWDIRTYSTATE=1

# Zeigt an, ob es gestapelte Änderungen ($) gibt
export GIT_PS1_SHOWSTASHSTATE=1

# Zeigt an, ob es nicht verfolgte Dateien (%) gibt
export GIT_PS1_SHOWUNTRACKEDFILES=1

# Zeigt die Differenz zwischen HEAD und Upstream an
# Optionen: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# Aktiviert farbige Hinweise (erfordert bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1

# Zeigt den Repository-Status während der Operationen an
# (MERGING, REBASING, BISECTING, etc.)
export GIT_PS1_DESCRIBE_STYLE="default"

Hier ist die Bedeutung der Indikatoren:

  • * - Nicht gestagte Änderungen (geänderte Dateien, die nicht hinzugefügt wurden)
  • + - Gestagte Änderungen (Dateien, die hinzugefügt, aber nicht commited wurden)
  • $ - Gestapelte Änderungen existieren
  • % - Nicht verfolgte Dateien vorhanden
  • < - Hinter dem Upstream-Zweig
  • > - Vor dem Upstream-Zweig
  • <> - Divergiert vom Upstream
  • = - Gleich wie Upstream

Vollständige Beispielkonfiguration

Hier ist eine umfassende ~/.bashrc-Konfiguration:

# Laden Sie 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

# Konfigurieren Sie die git-prompt-Optionen
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

# Farbdefinitionen
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # Grün
COLOR_PATH='\[\033[01;34m\]'      # Blau
COLOR_GIT='\[\033[01;33m\]'       # Gelb

# Setzen Sie die Eingabeaufforderung
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "

Methode 2: Manuelle Git-Befehlssubstitution

Wenn Sie keinen Zugriff auf git-prompt.sh haben oder eine minimale Lösung wünschen, können Sie Git-Befehle direkt in Ihrer Eingabeaufforderung ausführen:

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

# Zweigname mit Statusindikator
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\]\$ '

Dieser Ansatz ist portabler, aber er fehlt an der Eleganz von git-prompt.sh und kann in großen Repositories langsamer sein.

Methode 3: Moderne Prompt-Tools

Für ein reichhaltigeres Erlebnis mit minimaler Konfiguration sollten Sie diese modernen Alternativen in Betracht ziehen:

Starship Prompt

Starship ist ein schneller, anpassbarer Prompt, der in Rust geschrieben ist und mit mehreren Shells (bash, zsh, fish, PowerShell) funktioniert.

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

# Fügen Sie es zu ~/.bashrc hinzu
eval "$(starship init bash)"

Starship erkennt automatisch Git-Repositorys und zeigt an:

  • Branch-Name
  • Commit-Hash bei abgetrenntem Zustand
  • Repository-Status (Merge, Rebase usw.)
  • Anzahl der geänderten Dateien
  • Status vor/nach dem Upstream
  • Und vieles mehr mit anpassbaren Symbolen

Konfigurieren Sie es über ~/.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 ist ein Framework zur Verwaltung der Bash-Konfiguration mit Themen und Plugins:

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

# Bearbeiten Sie ~/.bashrc, um das Thema zu setzen
OSH_THEME="powerline"

Viele Oh My Bash-Themen enthalten standardmäßig Git-Integration.

Oh My Posh

Oh My Posh ist ein modernes, plattformübergreifendes Prompt-Engine, das mit bash, zsh, PowerShell und anderen Shells funktioniert. Es bietet schöne, anpassbare Prompts mit hervorragender Git-Integration und verwendet Nerd Fonts für die Symbolunterstützung.

Installation auf Linux

Installieren Sie Oh My Posh mit einem einzigen Befehl:

# Installieren Sie in ~/bin oder ~/.local/bin (Standard)
curl -s https://ohmyposh.dev/install.sh | bash -s

# Oder geben Sie ein benutzerdefiniertes Installationsverzeichnis an
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

Grundlegende Einrichtung

Fügen Sie Oh My Posh zu Ihrer ~/.bashrc hinzu:

# Initialisieren Sie Oh My Posh mit einem Thema
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"

Installieren und Verwenden von Themen

Oh My Posh enthält zahlreiche vorgefertigte Themen. Laden Sie sie zuerst herunter:

# Erstellen Sie ein Themenverzeichnis
mkdir ~/.poshthemes

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

Beliebte Themen sind:

  • jandedobbeleer.omp.json - Das persönliche Thema des Erstellers mit voller Git-Integration
  • powerline.omp.json - Klassischer Powerline-Stil
  • atomic.omp.json - Minimalistisch mit wesentlichen Informationen
  • night-owl.omp.json - Farbreiches Thema mit umfangreichen Git-Details

Wechseln Sie die Themen, indem Sie den Konfigurationspfad ändern:

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

Git-Funktionen

Oh My Posh zeigt automatisch umfassende Git-Informationen an:

  • Aktueller Branch-Name
  • Commit-Zählungen vor/nach dem Remote
  • Arbeitsverzeichnis-Status (sauber/schmutzig)
  • Stash-Zählung
  • Merge/Rebase-Status
  • Tag-Informationen
  • Commit-Hash im abgetrennten HEAD-Zustand

Benutzerdefinierte Konfiguration

Erstellen Sie ein benutzerdefiniertes Thema, indem Sie ein vorhandenes kopieren:

# Kopieren Sie ein Thema als Ausgangspunkt
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# Bearbeiten Sie Ihr Thema
nano ~/.mytheme.omp.json

# Verwenden Sie Ihr benutzerdefiniertes Thema
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

Beispiel für die Git-Segment-Konfiguration 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": "…"
  }
}

Schriftartanforderungen

Oh My Posh funktioniert am besten mit Nerd Fonts für die Symbolunterstützung:

# Laden und installieren Sie eine Nerd Font (Beispiel: 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

Konfigurieren Sie dann Ihr Terminal, um die Nerd Font zu verwenden.

Vorteile von Oh My Posh

  • Plattformübergreifend: Gleiche Konfiguration funktioniert auf Linux, macOS und Windows
  • Schnell: In Go für Leistung geschrieben
  • Erweiterbar: Modulare Segmente für Git, Zeit, Pfad, Sprachen, Cloud-Anbieter usw.
  • Reiche Themen: Große Sammlung von vorgefertigten Themen
  • Aktive Entwicklung: Regelmäßige Updates und Verbesserungen
  • Terminal-unabhängig: Funktioniert in jedem ANSI-kompatiblen Terminal

Bash-git-prompt

Ein dediziertes Bash-Prompt-Tool, das sich auf Git-Informationen konzentriert:

# Klonen Sie das Repository
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1

# Fügen Sie es zu ~/.bashrc hinzu
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
    GIT_PROMPT_ONLY_IN_REPO=1
    source $HOME/.bash-git-prompt/gitprompt.sh
fi

Leistungsüberlegungen in großen Repositorys

Git-Status-Operationen können in großen Repositorys langsam sein. Hier sind Optimierungsstrategien:

Deaktivieren Sie teure Funktionen selektiv

# In .bashrc, deaktivieren Sie Funktionen bedingt für große Repos
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # Deaktivieren Sie die Dirty-State-Prüfung für Repos über 100MB
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

Verwenden Sie Git-Konfigurationsoptionen

Konfigurieren Sie Git, um Statusprüfungen zu optimieren:

# Aktivieren Sie den Dateisystem-Monitor für schnellere Statusprüfungen
git config core.fsmonitor true
git config core.untrackedCache true

# Für sehr große Repos, überlegen Sie sich partielle Klone
git config core.commitGraph true
git config gc.writeCommitGraph true

Alternative: Asynchrone Prompts

Tools wie Starship verwenden asynchrone Operationen, um Verzögerungen im Prompt zu verhindern. Der Prompt wird aktualisiert, nachdem die Git-Informationen abgerufen wurden, anstatt zu blockieren.

Fehlerbehebung bei häufigen Problemen

Prompt zeigt keine Git-Informationen an

  1. Überprüfen Sie, ob git-prompt.sh geladen ist: Führen Sie type __git_ps1 in Ihrem Terminal aus. Wenn es “not found” sagt, ist das Skript nicht geladen.
  2. Überprüfen Sie die Dateiberechtigungen: Stellen Sie sicher, dass git-prompt.sh lesbar ist: ls -l /path/to/git-prompt.sh
  3. Überprüfen Sie, ob Sie sich in einem Git-Repository befinden: Führen Sie git status aus, um dies zu bestätigen
  4. Überprüfen Sie die PS1-Syntax: Stellen Sie sicher, dass $(__git_ps1) enthalten und richtig in Anführungszeichen gesetzt ist

Farben werden nicht angezeigt

  1. Escape-Sequenz-Probleme: Farben in PS1 müssen in \[ \] eingekapselt werden, um Probleme mit der Zeilenumbrüche zu verhindern
  2. Terminal-Unterstützung: Überprüfen Sie, ob Ihr Terminal ANSI-Farben unterstützt: echo -e "\033[31mRed Text\033[0m"
  3. Reset-Codes: Beenden Sie immer Farbsequenzen mit dem Reset-Code \033[00m

Prompt bricht die Zeilenumbrüche

Wenn Farben verwendet werden, müssen nicht druckbare Escape-Sequenzen in \[ und \] eingekapselt werden:

# Falsch - verursacht Zeilenumbrüche-Probleme
PS1="\033[32m\u\033[00m\$ "

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

Langsamer Prompt in WSL oder Netzwerk-Laufwerken

Git-Operationen auf Windows-Netzwerkfreigaben oder WSL können langsam sein:

# Deaktivieren Sie teure git-prompt-Funktionen auf langsamen Dateisystemen
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Überlegen Sie, ob Sie die native Windows Git Bash anstelle von WSL für Repositorys auf Windows-Laufwerken verwenden.

Integration in Entwicklungsworkflows

Ein git-bewusster Prompt wird noch mächtiger, wenn er mit anderen Shell-Erweiterungen kombiniert wird:

Git-Aliase für schnelle Navigation

Kombinieren Sie Ihren verbesserten Prompt mit nützlichen Git-Aliasen, um die Effizienz zu maximieren. Für eine umfassende Liste von Git-Befehlen und Shortcuts sehen Sie unseren GIT-Befehle-Cheatsheet.

# Fügen Sie es zu ~/.gitconfig oder ~/.bashrc hinzu
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

Bedingtes Prompt-Verhalten

# Unterschiedliche Prompt-Farben für unterschiedliche Zustände
__git_ps1_colorize() {
    local git_status="$(git status 2>/dev/null)"
    if [[ $git_status =~ "nothing to commit" ]]; then
        echo -e "\[\033[32m\]"  # Grün für sauber
    else
        echo -e "\[\033[31m\]"  # Rot für schmutzig
    fi
}

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

Integration des Terminal-Titelbalkens

Aktualisieren Sie den Terminal-Titel mit Repository-Informationen:

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

Best Practices und Empfehlungen

  1. Halten Sie es lesbar: Überladen Sie Ihren Prompt nicht mit zu vielen Informationen
  2. Verwenden Sie Farben strategisch: Unterschiedliche Farben für unterschiedliche Zustände (sauber vs. schmutzig)
  3. Testen Sie in verschiedenen Szenarien: Überprüfen Sie, ob der Prompt in regulären Verzeichnissen, Git-Repositorys und während Git-Operationen funktioniert
  4. Dokumentieren Sie Ihre Konfiguration: Kommentieren Sie Ihre .bashrc, damit Sie wissen, was jeder Teil tut
  5. Sichern Sie Ihre Konfiguration: Versionskontrolle Ihrer Dotfiles in einem Git-Repository. Wenn Sie Ihren eigenen Git-Server betreiben, möchten Sie möglicherweise Gitea Server Installation als eine leichtgewichtige selbstgehostete Option erkunden
  6. Berücksichtigen Sie Ihren Workflow: Aktivieren Sie nur die Funktionen, die Sie tatsächlich benötigen
  7. Verwenden Sie moderne Tools, wenn möglich: Starship und ähnliche Tools sind gut getestet und leistungsfähig

Für selbstgehostete Git-Lösungen erfahren Sie mehr über Gitea Backup und Wiederherstellung, um sicherzustellen, dass Ihre Repositorys geschützt sind. Wenn Sie an der Automatisierung Ihrer Git-Workflows interessiert sind, erkunden Sie unseren GitHub Actions Cheatsheet.

Andere nützliche Artikel