Wyświetl分支 Git & Stan w Bash Prompt
Dostosowanie monity Bash w celu natychmiastowego kontekstu Git
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.

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 statusigit 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 gitempowerline.omp.json- Klasyczny styl powerlineatomic.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
- Sprawdź, czy git-prompt.sh jest załadowany: Uruchom
type __git_ps1w swoim terminalu. Jeśli mówi “nie znaleziono”, skrypt nie jest załadowany. - Sprawdź uprawnienia pliku: Upewnij się, że git-prompt.sh jest czytelny:
ls -l /ścieżka/do/git-prompt.sh - Sprawdź, czy jesteś w repozytorium git: Uruchom
git status, aby potwierdzić - Sprawdź składnię PS1: Upewnij się, że
$(__git_ps1)jest zawarty i poprawnie cytowany
Nie wyświetlanie kolorów
- Problemy z sekwencjami ucieczki: Kolorystyka w PS1 musi być otoczona przez
\[ \], aby uniknąć problemów z opakowaniem linii - Wsparcie terminala: Sprawdź, czy Twój terminal obsługuje kolory ANSI:
echo -e "\033[31mCzerwony tekst\033[0m" - 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
- Zachowaj czytelność: Nie przetłocznij swojego promptu zbyt dużą ilością informacji
- Używaj kolorów strategicznie: Różne kolory dla różnych stanów (czysty vs brudny)
- Testuj w wielu scenariuszach: Sprawdź, czy prompt działa w regularnych katalogach, repozytoriach git i podczas operacji git
- Dokumentuj swoją konfigurację: Dodaj komentarze do swojego .bashrc, aby pamiętać, co robi każda część
- 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ą
- Rozważ swój przepływ pracy: Włącz tylko funkcje, które naprawdę potrzebujesz
- 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
- Oficjalna dokumentacja git na temat git-prompt.sh
- Oficjalna strona Starship Prompt
- Oficjalna dokumentacja Oh My Posh
- Galeria motywów Oh My Posh
- Wiki Bash Hackers - Konfiguracja PS1
- Repozytorium Oh My Bash
- Repozytorium bash-git-prompt
- Oficjalna strona Nerd Fontów
- Referencja kodu ANSI Escape
- Porady dotyczące wydajności git dla dużych repozytoriów