Wyświetl分支 Git & Stan w Bash Prompt

Dostosowanie monity Bash w celu natychmiastowego kontekstu Git

Page content

Poprawnie skonfigurowany bash prompt wyświetlający informacje o repozytorium git może znacząco poprawić Twoją wydajność pracy w środowisku programistycznym.

Zamiast stale uruchamiać polecenia git status i git branch, możesz mieć tę kluczową informację zawsze widoczna w swoim terminalu.

oh-my-posh

Przykład promptu oh-my-push.

Dlaczego warto dodać informacje o repozytorium git do swojego bash promptu?

Kiedy pracujesz z wieloma repozytoriami git i gałęziami w ciągu dnia, przełączanie kontekstu staje się znaczącym problemem dla wydajności. Prompt świadomy gitu rozwiązuje wiele typowych problemów:

  • Zapobiega zamieszaniu gałęzi: Zawsze wiesz, na której gałęzi jesteś przed dokonaniem commitu
  • Zmniejsza obciążenie komend: Nie musisz stale uruchamiać git status i git branch
  • Natychmiastowa wizualna informacja: Widzisz zmiany niezałatwione, pliki niezastrzeżone i status upstream w jednym spojrzeniu
  • Mniej błędów: Unikasz przypadkowego commitowania na złej gałęzi lub przesyłania brudnego kodu

Zrozumienie zmiennej bash PS1

Prompt basha jest kontrolowany przez zmienną środowiskową PS1. Ta zmienna może zawierać:

  • Tekst literały: Dowolne znaki, które chcesz wyświetlić
  • Sekwencje ucieczki: Specjalne kody zaczynające się od \ wyświetlające dynamiczną informację
  • Substytucję komend: Komendy w $(...), które są wykonywane i wyświetlane
  • Kody kolorów ANSI: Sekwencje ucieczki zmieniające kolory tekstu

Powszechne sekwencje ucieczki PS1 obejmują:

  • \u - aktualny użytkownik
  • \h - nazwa hosta
  • \w - aktualny katalog roboczy
  • \$ - # dla użytkownika root, $ dla normalnego użytkownika
  • \t - aktualny czas w formacie 24-godzinnym

Podstawowy prompt może wyglądać tak: PS1='\u@\h:\w\$ ' i generować wynik takie jak user@hostname:/path/to/dir$ . Aby dowiedzieć się więcej o podstawach basha i sekwencjach ucieczki, sprawdź nasz szczegółowy Bash Cheat Sheet.

Metoda 1: Użycie wbudowanego skryptu git-prompt.sh

Dystrybucje git zawierają pomocny skrypt nazywany git-prompt.sh, który dostarcza funkcję __git_ps1. Jest to najbardziej niezawodny i bogaty w funkcje podejście.

Lokalizacja git-prompt.sh

Najpierw znajdź, gdzie znajduje się skrypt na Twoim systemie:

# Typowe lokalizacje na Linuxie
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# Typowe lokalizacje na macOS (z Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# Wyszukaj, jeśli potrzebujesz
find /usr -name git-prompt.sh 2>/dev/null

Podstawowa konfiguracja

Dodaj poniższe wiersze do swojego ~/.bashrc lub ~/.bash_profile:

# Załaduj skrypt git-prompt
source /usr/lib/git-core/git-sh-prompt

# Ustaw prompt wraz z informacjami o git
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Część $(__git_ps1 " (%s)") wywołuje funkcję, a %s zostaje zastąpione nazwą aktualnej gałęzi. Otaczające spacje i nawiasy ładnie formatują wynik.

Po edycji, przeładuj swoją konfigurację:

source ~/.bashrc

Zaawansowane opcje git-prompt.sh

Git-prompt.sh staje się potężnym narzędziem, gdy włączysz swoje opcjonalne funkcje za pomocą zmiennych środowiskowych:

# Pokaż zmiany niezałatwione (*) i załatwione (+)
export GIT_PS1_SHOWDIRTYSTATE=1

# Pokaż, czy istnieją zapisane zmiany ($)
export GIT_PS1_SHOWSTASHSTATE=1

# Pokaż, czy istnieją pliki niezastrzeżone (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1

# Pokaż różnicę między HEAD a upstream
# Opcje: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# Włącz kolorowe wskazówki (wymaga bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1

# Pokaż stan repozytorium podczas operacji
# (MERGING, REBASING, BISECTING, itd.)
export GIT_PS1_DESCRIBE_STYLE="default"

Oto co oznaczają te wskaźniki:

  • * - Niezałatwione zmiany (zmodyfikowane pliki, które nie zostały dodane)
  • + - Załatwione zmiany (pliki dodane, ale nie zaakceptowane)
  • $ - Istnieją zapisane zmiany
  • % - Istnieją pliki niezastrzeżone
  • < - Za daleko od gałęzi upstream
  • > - Za daleko do gałęzi upstream
  • <> - Odchodzi od gałęzi upstream
  • = - Równa się gałęzi upstream

Kompletny przykład konfiguracji

Oto kompletna konfiguracja ~/.bashrc:

# Załaduj 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

# Skonfiguruj opcje 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

# Definicje kolorów
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # Zielony
COLOR_PATH='\[\033[01;34m\]'      # Niebieski
COLOR_GIT='\[\033[01;33m\]'       # Żółty

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

Metoda 2: Ręczna podstawienie komend git

Jeśli nie masz dostępu do git-prompt.sh lub chcesz rozwiązanie minimalne, możesz bezpośrednio wykonać komendy git w swoim prompt:

# Tylko nazwa gałęzi
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '

# Nazwa gałęzi z wskaźnikiem statusu
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\]\$ '

Ten podejście jest bardziej przenośny, ale brakuje zaawansowanych funkcji git-prompt.sh i może być wolniejszy w dużych repozytoriach.

Metoda 3: Nowoczesne narzędzia do promptów

Aby uzyskać bogatsze doświadczenie z minimalną konfiguracją, rozważ następujące nowoczesne alternatywy:

Starship Prompt

Starship to szybki, personalizowalny prompt napisany w Rust, który działa w wielu powłokach (bash, zsh, fish, PowerShell).

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

# Dodaj do ~/.bashrc
eval "$(starship init bash)"

Starship automatycznie wykrywa repozytoria git i wyświetla:

  • Nazwę gałęzi
  • Hash commitu, gdy nie jest przytwierdzony
  • Stan repozytorium (merge, rebase, itd.)
  • Liczbę zmodyfikowanych plików
  • Stan wyprzedzania/odstępowania od gałęzi upstream
  • I wiele więcej z wykorzystaniem personalizowalnych ikon

Skonfiguruj przez ~/.config/starship.toml:

[git_branch]
symbol = "🌱 "
format = "na [$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 to framework do zarządzania konfiguracją basha z tematami i wtyczkami:

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

# Edytuj ~/.bashrc, aby ustawić temat
OSH_THEME="powerline"

Wiele tematów Oh My Bash zawiera integrację z gitem domyślnie.

Oh My Posh

Oh My Posh to nowoczesny, krzyżowy silnik promptu, który działa z bashem, zsh, PowerShell i innymi powłokami. Zapewnia piękne, personalizowalne prompty z doskonałą integracją z gitem i korzysta z Nerd Fontów do wsparcia ikon.

Instalacja na Linuxie

Zainstaluj Oh My Posh jednym poleceniem:

# Zainstaluj do ~/bin lub ~/.local/bin (domyślnie)
curl -s https://ohmyposh.dev/install.sh | bash -s

# Lub określ katalog instalacji
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

Podstawowa konfiguracja

Dodaj Oh My Posh do swojego ~/.bashrc:

# Inicjalizuj Oh My Posh z użyciem motywu
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"

Instalacja i użycie motywów

Oh My Posh zawiera wiele gotowych motywów. Pobierz je najpierw:

# Utwórz katalog motywów
mkdir ~/.poshthemes

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

Popularne motywy obejmują:

  • jandedobbeleer.omp.json - Motyw twórcy z pełną integracją z gitem
  • powerline.omp.json - Klasyczny styl powerline
  • atomic.omp.json - Minimalistyczny z istotną informacją
  • night-owl.omp.json - Kolorowy motyw z szerokim zakresem informacji o git

Zmień motyw zmieniając ścieżkę konfiguracji:

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

Funkcje git

Oh My Posh automatycznie wyświetla szczegółowe informacje o git:

  • Aktualna nazwa gałęzi
  • Liczba commitów wyprzedzających/odstępujących od gałęzi upstream
  • Stan katalogu roboczego (czytelny/brudny)
  • Liczba zapisanych zmian
  • Stan merge/rebase
  • Informacje o tagach
  • Hash commitu w stanie detached HEAD

Niestandardowa konfiguracja

Utwórz niestandardowy motyw kopiując istniejący:

# Skopiuj motyw jako punkt wyjścia
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# Edytuj swój motyw
nano ~/.mytheme.omp.json

# Użyj swojego niestandardowego motywu
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

Przykład konfiguracji segmentu git w 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": "…"
  }
}

Wymagania dotyczące czcionek

Oh My Posh działa najlepiej z Nerd Fontami dla wsparcia ikon:

# Pobierz i zainstaluj Nerd Font (przykład: 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

Następnie skonfiguruj swój terminal, aby używał Nerd Fontu.

Zalety Oh My Posh

  • Krzyżowa platformowość: Taka sama konfiguracja działa na Linuxie, macOS i Windowsie
  • Szybkość: Napisany w Go dla wydajności
  • Rozszerzalność: Modułowe segmenty dla git, czasu, ścieżki, języków, dostawców chmurowych itd.
  • Bogate motywy: Duża kolekcja gotowych motywów
  • Aktywne rozwijanie: Regularne aktualizacje i poprawki
  • Agnozja terminala: Działa w dowolnym terminalu zgodnym z ANSI

Bash-git-prompt

Dedykowane narzędzie do promptu basha skupiające się na informacjach o git:

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

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

Rozważenia dotyczące wydajności w dużych repozytoriach

Operacje git status mogą być wolne w dużych repozytoriach. Oto strategie optymalizacji:

Wyłącz drogie funkcje selektywnie

# W .bashrc, warunkowo wyłącz funkcje dla dużych repozytoriów
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # Wyłącz sprawdzanie stanu brudnego dla repozytoriów powyżej 100MB
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

Użyj opcji konfiguracji git

Skonfiguruj git, aby zoptymalizować sprawdzanie stanu:

# Włącz monitor systemu plików dla szybszych sprawdzeń stanu
git config core.fsmonitor true
git config core.untrackedCache true

# Dla bardzo dużych repozytoriów, rozważ częściowe klonowanie
git config core.commitGraph true
git config gc.writeCommitGraph true

Alternatywa: Asynchroniczne prompty

Narzędzia takie jak Starship korzystają z operacji asynchronicznych, aby zapobiec opóźnieniom w promptach. Prompt aktualizuje się po pobraniu informacji git, zamiast blokować.

Rozwiązywanie typowych problemów

Prompt nie wyświetla informacji o git

  1. Sprawdź, czy git-prompt.sh jest załadowany: Uruchom type __git_ps1 w swoim terminalu. Jeśli mówi “nie znaleziono”, skrypt nie jest załadowany.
  2. Sprawdź uprawnienia pliku: Upewnij się, że git-prompt.sh jest czytelny: ls -l /ścieżka/do/git-prompt.sh
  3. Sprawdź, czy jesteś w repozytorium git: Uruchom git status, aby potwierdzić
  4. Sprawdź składnię PS1: Upewnij się, że $(__git_ps1) jest zawarty i poprawnie cytowany

Nie wyświetlanie kolorów

  1. Problemy z sekwencjami ucieczki: Kolorystyka w PS1 musi być otoczona przez \[ \], aby uniknąć problemów z opakowaniem linii
  2. Wsparcie terminala: Sprawdź, czy Twój terminal obsługuje kolory ANSI: echo -e "\033[31mCzerwony tekst\033[0m"
  3. Kody resetu: Zawsze kończ sekwencje kolorów kodem resetu \033[00m

Prompt rozbija opakowanie linii

Gdy używasz kolorów, nieliterowe sekwencje ucieczki muszą być otoczone przez \[ i \]:

# Zły - powoduje problemy z opakowaniem linii
PS1="\033[32m\u\033[00m\$ "

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

Wolny prompt w WSL lub na sieciowych dyskach

Operacje git na udziałach sieciowych lub w WSL mogą być wolne:

# Wyłącz drogie funkcje git-prompt na wolnych systemach plików
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Zastanów się nad użyciem natywnego Windowsowego Git basha zamiast WSL dla repozytoriów na dyskach Windows.

Integracja z przepływami pracy deweloperskimi

Prompt świadomy git staje się jeszcze bardziej potężny, gdy jest połączony z innymi wzmocnieniami powłoki:

Aliasy git dla szybkiego nawigowania

Połącz swój wzmocniony prompt z użytecznymi aliasami git, aby maksymalnie wykorzystać wydajność. Aby uzyskać pełną listę poleceń git i skrótów, zobacz nasz GIT commands cheatsheet.

# Dodaj do ~/.gitconfig lub ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

Warunkowe zachowanie promptu

# Różne kolory promptu dla różnych stanów
__git_ps1_colorize() {
    local git_status="$(git status 2>/dev/null)"
    if [[ $git_status =~ "nothing to commit" ]]; then
        echo -e "\[\033[32m\]"  # Zielony dla czystego
    else
        echo -e "\[\03线31m\]"  # Czerwony dla brudnego
    fi
}

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

Integracja z paskiem tytułowym terminala

Zaktualizuj tytuł terminala z informacjami o repozytorium:

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

Najlepsze praktyki i rekomendacje

  1. Zachowaj czytelność: Nie przetłocznij swojego promptu zbyt dużą ilością informacji
  2. Używaj kolorów strategicznie: Różne kolory dla różnych stanów (czysty vs brudny)
  3. Testuj w wielu scenariuszach: Sprawdź, czy prompt działa w regularnych katalogach, repozytoriach git i podczas operacji git
  4. Dokumentuj swoją konfigurację: Dodaj komentarze do swojego .bashrc, aby pamiętać, co robi każda część
  5. Zachowaj kopię zapasową swojej konfiguracji: Wersjonuj swoje dotfiles w repozytorium git. Jeśli uruchamiasz własny serwer git, możesz chcieć poznać instalację Gitea jako lekką opcję samoobsługową
  6. Rozważ swój przepływ pracy: Włącz tylko funkcje, które naprawdę potrzebujesz
  7. Używaj nowoczesnych narzędzi, jeśli to możliwe: Starship i podobne narzędzia są dobrze przetestowane i wydajne

Aby uzyskać samodzielne rozwiązania git, dowiedz się o backupie i odzyskiwaniu Gitea, aby upewnić się, że Twoje repozytoria są chronione. Jeśli jesteś zainteresowany automatyzacją swoich przepływów pracy git, eksploruj nasz cheatsheet GitHub Actions.

Przydatne linki

Inne przydatne artykuły

Subskrybuj

Otrzymuj nowe wpisy o systemach, infrastrukturze i inżynierii AI.