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