Visa Git-branch och status i Bash-prompten

Anpassning av Bash-prompten för direkt Git-kontext

Sidinnehåll

En välkonfigurerad bash prompt som visar git-repositoryinformation kan drastiskt förbättra din utvecklingsarbetsflöde.

I stället för att konstant köra git status och git branch-kommandon kan du ha denna kritiska information alltid synlig i din terminalprompt.

oh-my-posh

Exempel på oh-my-posh-prompt.

Varför lägga till gitinformation i din bashprompt?

När du arbetar med flera git-repositoryer och grenar under dagen blir kontextbyten en betydande produktivitetsförlust. En gitmedveten prompt löser flera vanliga problem:

  • Förhindrar grenförvirring: Du kommer alltid veta vilken gren du är på före commit
  • Minskar kommandofördel: Inga behov att konstant köra git status och git branch
  • Omedelbar visuell återkoppling: Se okommita ändringar, oslagna filer och upströmsstatus på ett glimt
  • Färre fel: Undvik att avverka till fel gren eller pusha oren kod

Förstå bash PS1-variabeln

Bashprompten styrs av PS1-miljövariabeln. Den här variabeln kan innehålla:

  • Litteral text: Eventuella tecken du vill visa
  • Escape-sekvenser: Särskilda koder som börjar med \ som visar dynamisk information
  • Kommandosubstitution: Kommandon i $(...) som körs och visar deras utdata
  • ANSI-färgkoder: Escape-sekvenser som ändrar textfärg

Vanliga PS1-escape-sekvenser inkluderar:

  • \u - nuvarande användarnamn
  • \h - värdnamn
  • \w - nuvarande arbetskatalog
  • \$ - # för root, $ för vanlig användare
  • \t - aktuell tid i 24-timmarsformat

En grundläggande prompt kan se ut så här: PS1='\u@\h:\w\$ ' och producerar utdata som user@hostname:/path/to/dir$ . För mer bashgrunder och escape-sekvenser, se vår omfattande Bash Cheat Sheet.

Metod 1: Använda git:s inbyggda git-prompt.sh-skript

Git-distributioner inkluderar ett hjälpskript kallat git-prompt.sh som tillhandahåller funktionen __git_ps1. Detta är den mest tillförlitliga och funktionstunga metoden.

Hitta git-prompt.sh

Först, hitta var skriptet finns på din dator:

# Vanliga platser på Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bashcompletion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# Vanliga platser på macOS (med Homebrew)
/usr/local/etc/bashcompletion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# Sök efter det om det behövs
find /usr -name git-prompt.sh 2>/dev/null

Grundläggande konfiguration

Lägg till följande i din ~/.bashrc eller ~/.bash_profile:

# Källa git-prompt-skriptet
source /usr/lib/git-core/git-sh-prompt

# Ställ in din prompt för att inkludera gitinformation
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Den delen $(__git_ps1 " (%s)") anropar funktionen, och %s ersätts med det aktuella grennamnet. De omgivande utrymmena och parenteserna formaterar det snyggt.

Efter redigering, ladda om din konfiguration:

source ~/.bashrc

Avancerade git-prompt.sh-Alternativ

Git-prompt.sh blir kraftfullare när du aktiverar dess valfria funktioner via miljövariabler:

# Visa okommita (*) och kommita (+) ändringar
export GIT_PS1_SHOWDIRTYSTATE=1

# Visa om det finns sparade ändringar ($)
export GIT_PS1_SHOWSTASHSTATE=1

# Visa om det finns oslagna filer (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1

# Visa skillnaden mellan HEAD och upström
# Alternativ: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# Aktivera färgade tips (kräver bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1

# Visa repositorystatus under operationer
# (MERGING, REBASING, BISECTING, etc.)
export GIT_PS1_DESCRIBE_STYLE="default"

Här är vad indikatorerna betyder:

  • * - Okommita ändringar (modifierade filer som inte är tillagda)
  • + - Kommita ändringar (filer som är tillagda men inte commitade)
  • $ - Sparade ändringar finns
  • % - Osedda filer finns
  • < - Bakom upströmsgrenen
  • > - Föran upströmsgrenen
  • <> - Skiljer sig från upströms
  • = - Samma som upströms

Fullständigt exempel på konfiguration

Här är en omfattande ~/.bashrc-konfiguration:

# Källa 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

# Konfigurera git-promptalternativ
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

# Färgdefinitioner
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # Grön
COLOR_PATH='\[\033[01;34m\]'      # Blå
COLOR_GIT='\[\033[01;33m\]'       # Gul

# Ställ in prompten
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "

Metod 2: Manuell git-kommandosubstitution

Om du inte har tillgång till git-prompt.sh eller vill ha en minimal lösning, kan du direkt köra gitkommandon i din prompt:

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

# Grennamn med 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\]\$ '

Detta tillvägagångssätt är mer portabelt men saknar sofistikerade funktioner hos git-prompt.sh och kan vara långsammare i stora repositories.

Metod 3: Moderna promptverktyg

För en rikare upplevelse med minimal konfiguration, överväg dessa moderna alternativ:

Starship Prompt

Starship är en snabb, anpassningsbar prompt skriven i Rust som fungerar över flera shells (bash, zsh, fish, PowerShell).

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

# Lägg till i ~/.bashrc
eval "$(starship init bash)"

Starship identifierar automatiskt git-repositoryer och visar:

  • Grennamn
  • Commit-hash vid frågad status
  • Repositorystatus (förening, omgruppering, etc.)
  • Antal modifierade filer
  • Status för framåt/ bakåt i upströms
  • Och mycket mer med anpassningsbara ikoner

Konfigurera den 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 är ett ramverk för att hantera bashkonfiguration med teman och plugin:

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

# Redigera ~/.bashrc för att ställa in tema
OSH_THEME="powerline"

Många Oh My Bash-teman inkluderar gitintegration som standard.

Oh My Posh

Oh My Posh är ett modern, plattformsoberoende promptverktyg som fungerar med bash, zsh, PowerShell och andra shells. Den tillhandahåller vackra, anpassningsbara prompter med utmärkt gitintegration och använder Nerd Fonts för ikonstöd.

Installation på Linux

Installera Oh My Posh med ett enda kommando:

# Installera till ~/bin eller ~/.local/bin (standard)
curl -s https://ohmyposh.dev/install.sh | bash -s

# Eller specificera en anpassad installationskatalog
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

Grundläggande inställning

Lägg till Oh My Posh i din ~/.bashrc:

# Initiera Oh My Posh med ett tema
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"

Installera och använda teman

Oh My Posh innehåller flera förutfyllda teman. Ladda ner dem först:

# Skapa temakatalog
mkdir ~/.poshthemes

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

Populära teman inkluderar:

  • jandedobbeleer.omp.json - Skaparens personliga tema med full gitintegration
  • powerline.omp.json - Klassisk powerlinestil
  • atomic.omp.json - Minimalistisk med nödvändiga information
  • night-owl.omp.json - Färgrik tema med omfattande gitinformation

Byt teman genom att ändra konfigurationsvägen:

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

Git-funktioner

Oh My Posh visar automatiskt omfattande gitinformation:

  • Aktuell grennamn
  • Antal commits framåt/ bakåt i upströms
  • Arbetsskattstatus (ren/ oren)
  • Antal sparade ändringar
  • Förening/ omgrupperingstillstånd
  • Taginformation
  • Commit-hash i frågad status

Anpassad konfiguration

Skapa en anpassad tema genom att kopiera en befintlig:

# Kopiera en tema som startpunkt
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# Redigera din tema
nano ~/.mytheme.omp.json

# Använd din anpassade tema
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

Exempel på gitsegmentkonfiguration i 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": "…"
  }
}

Fontkrav

Oh My Posh fungerar bäst med Nerd Fonts för ikonstöd:

# Ladda ner och installera en Nerd Font (exempel: 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

Konfigurera sedan din terminal att använda Nerd Font.

Fördelar med Oh My Posh

  • Plattformsoberoende: Samma konfiguration fungerar på Linux, macOS och Windows
  • Snabb: Skrivet i Go för prestanda
  • Utökbar: Modulära segment för git, tid, sökväg, språk, molntjänster, etc.
  • Rika teman: Stor samling förutfyllda teman
  • Aktiv utveckling: Regelbundna uppdateringar och förbättringar
  • Terminalagnostisk: Fungerar i alla ANSI-kompatibla terminaler

Bash-git-prompt

En dedikerad bashpromptverktyg fokuserat på gitinformation:

# Klonar repositoryt
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1

# Lägg till i ~/.bashrc
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
    GIT_PROMPT_ONLY_IN_REPO=1
    source $HOME/.bash-git-prompt/gitprompt.sh
fi

Prestandaöverväganden i stora repositories

Gitstatusoperationer kan vara långsamma i stora repositories. Här är optimeringsstrategier:

Inaktivera dyra funktioner selektivt

# I .bashrc, inaktivera funktioner för stora repos selektivt
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # Inaktivera oren statuscheck för repos över 100MB
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

Använd Git-konfigurationsalternativ

Konfigurera git för att optimera statuskontroller:

# Aktivera filsystemmonitor för snabbare statuskontroller
git config core.fsmonitor true
git config core.untrackedCache true

# För mycket stora repos, överväg delade kloner
git config core.commitGraph true
git config gc.writeCommitGraph true

Alternativ: Asynkrona prompter

Verktyg som Starship använder asynkrona operationer för att förhindra promptförsening. Prompten uppdateras efter att gitinformationen hämtats, snarare än att blockera.

Felsökning av vanliga problem

Prompten visar inte gitinformation

  1. Verifiera att git-prompt.sh är källad: Kör type __git_ps1 i din terminal. Om det säger “not found”, är skriptet inte laddat.
  2. Kontrollera filrättigheter: Se till att git-prompt.sh är läsbar: ls -l /path/to/git-prompt.sh
  3. Kontrollera att du är i en git-repository: Kör git status för att bekräfta
  4. Kontrollera PS1-syntaxen: Se till att $(__git_ps1) ingår och är korrekt citat

Färger visar inte

  1. Escape-sekvensproblem: Färger i PS1 måste omges av \[ \] för att undvika linjeförpackningsproblem
  2. Terminalstöd: Verifiera att din terminal stöder ANSI-färger: echo -e "\033[31mRöd text\033[0m"
  3. Återställningskoder: Alltid sluta färgsekvenser med återställningskod \033[00m

Prompten bryter linjeförpackning

När du använder färger måste icke-skrivbara escape-sekvenser omges av \[ och \]:

# Fel - orsakar linjeförpackningsproblem
PS1="\033[32m\u\033[00m\$ "

# Rätt
PS1="\[\033[32m\]\u\[\033[00m\]\$ "

Långsam prompt i WSL eller nätverksdrivor

Gitoperationer på Windows-nätverksdelar eller WSL kan vara långsamma:

# Inaktivera dyra git-promptfunktioner på långsamma filsystem
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Överväg att använda Windows-bash för git i stället för WSL för repos på Windows-drivar.

Integration med utvecklingsarbetsflöden

En gitmedveten prompt blir ännu kraftfullare när den kombineras med andra shellförbättringar:

Git-aliaser för snabb navigering

Kombinera din förbättrade prompt med användbara gitaliaser för att maximera effektivitet. För en omfattande lista på gitkommandon och snabbtangent, se vår GIT kommandon cheatsheet.

# Lägg till i ~/.gitconfig eller ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

Villkorlig promptbeteende

# Olika promptfärger för olika tillstånd
__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 ren
    else
        echo -e "\[\033[31m\]"  # Röd för oren
    fi
}

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

Terminaltitelbarintegration

Uppdatera terminalens titel med repositoryinformation:

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

Rekommendationer och bästa praxis

  1. Håll det läsbara: Fyll inte din prompt med för mycket information
  2. Använd färger strategiskt: Olika färger för olika tillstånd (ren vs oren)
  3. Testa i flera scenarier: Verifiera att prompten fungerar i vanliga kataloger, git-repositoryer och under gitoperationer
  4. Dokumentera din konfiguration: Kommentera din .bashrc så att du minns vad varje del gör
  5. Säkerhetskopiera din konfiguration: Versionskontrollera dina dotfiles i en git-repository. Om du kör din egen git-server, kan du vilja utforska Gitea server installation som en lättviktig självvärdbar lösning
  6. Överväg ditt arbetsflöde: Aktivera endast funktioner du faktiskt behöver
  7. Använd moderna verktyg när det är möjligt: Starship och liknande verktyg är vältestade och presterar bra

För självvärdbara gitlösningar, läs om Gitea Backup och Restore för att säkerställa att dina repositoryer är skyddade. Om du är intresserad av att automatisera dina gitarbetsflöden, utforska vår GitHub Actions cheatsheet.

Några användbara länkar

Andra användbara artiklar