Dodanie gałęzi git w wierszu polecenia Bash

161

Próbowałem dodać gałąź git, nad którą obecnie pracuję (wyewidencjonowany) w wierszu polecenia bash bez powodzenia ... ( zachowując moją bieżącą ścieżkę, która pokazuje nienaruszony aktywny katalog / plik ) Mam plik .bashrc w moim domu, ale widziałem też wiele osób wspominających o pliku .profile ..

George Katsanos
źródło
3
Myślę, że lepiej byłoby o to zapytać w wymianie unix / linux.
Cole Busby
Wypróbowałem 10 różnych poradników, niektóre z nich działały, ale udało mi się zdobyć gałąź git i zgubiłem katalog roboczy / ścieżkę, które miałem wcześniej ..
George Katsanos
Git 1.9.3+ oferuje interesujący sposób wyświetlania gałęzi: zobacz moją odpowiedź poniżej
VonC,
1
@cole busby najwyraźniej nie.
George Katsanos,
1
@GeorgeKatsanos cztery lata na pewno pokazały mi: p
Cole Busby

Odpowiedzi:

161

git 1.9.3 lub nowszy: użyj __git_ps1

Git udostępnia skrypt powłoki o nazwie git-prompt.sh, który zawiera funkcję __git_ps1that

drukuje tekst do dodania do zachęty bash PS1 (zawiera nazwę gałęzi)

Jego najbardziej podstawowe zastosowanie to:

$ __git_ps1
(master)

Pobiera również opcjonalny ciąg formatu:

$ __git_ps1 'git:[%s]'
git:[master]

Jak to zdobyć

Najpierw skopiuj plik gdzieś (np ~/.git-prompt.sh .).

Opcja 1: użyj istniejącej kopii w systemie plików. Przykład (Mac OS X 10.15):

$ find / -name 'git-prompt.sh' -type f -print -quit 2>/dev/null
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

Opcja 2: pobierz skrypt z GitHub .

Następnie dodaj następujący wiersz do swojego .bashrc/.zshrc:

source ~/.git-prompt.sh

Wreszcie zmień swój PS1telefon__git_ps1 jako podstawianie poleceń:

Grzmotnąć:

PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

Zsh:

setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '

git <1.9.3

Ale pamiętaj, że tylko git 1.9.3 (maj 2014) lub nowszy pozwala na bezpieczne wyświetlanie nazwy tej gałęzi (!)

Zobacz commit 8976500 autorstwa Richarda Hansena ( richardhansen) :

Zarówno bash, jak i zsh poddają wartość PS1 interpretacji parametrów , podstawianiu poleceń i interpretacji wyrażeń arytmetycznych.

Zamiast dołączać nieprzetworzoną nazwę gałęzi bez znaku zmiany znaczenia, PS1gdy działa w trybie dwu- lub trzyargumentowym, skonstruuj, PS1aby odwołać się do zmiennej, która zawiera nazwę gałęzi.

Ponieważ powłoki nie rozwijają się rekurencyjnie, pozwala to uniknąć wykonywania dowolnego kodu przez specjalnie spreparowane nazwy gałęzi, takie jak

'$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)'.

Jaki przebiegły umysł nazwałby taką gałąź? ;) ( Obok mamy jak w xkcd )

Więcej przykładów

still_dreaming_1 raporty w komentarzach :

Wydaje się, że działa świetnie, jeśli chcesz wyświetlić monit o kolorze z xterm(w moim .bashrc):

PS1='\[\e]0;\u@\h: \w\a\]\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\03‌​3[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ ' 

Wszystko ma inny kolor, łącznie z gałęzią.

W Linux Mint 17.3 Cinnamon 64-bit:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ ' 
VonC
źródło
3
jak ustawić monit na bieżącą gałąź git, gdy faktycznie jesteś w repozytorium git. Więc jeśli jesteś w normalnym katalogu, wyświetla normalny znak zachęty.
Zubair Alam
1
@ still_dreaming_1 możesz jednak bardzo łatwo zaktualizować lub skompilować git: stackoverflow.com/a/24847953/6309
VonC
1
Wygląda na to, że działa świetnie, jeśli chcesz, aby kolorowa podpowiedź w xterm (w .bashrc): PS1='\[\e]0;\u@\h: \w\a\]\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$'Wszystko ma inny kolor, w tym gałąź.
still_dreaming_1
5
To PS1, które opublikowałem, nie wyświetla się już poprawnie w Linux Mint 17.3 Cinnamon 64-bit, ale tak się dzieje:PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ '
still_dreaming_1
1
Obecny master znajduje się na github.com/git/git/blob/master/contrib/completion/git-prompt.sh - myślę, że powinniśmy linkować do tego w odpowiedzi, na wypadek znalezienia exploita w przyszłości? Ponadto: musiałem uciec od $ i "w mojej linii PS1, ale to prawdopodobnie ze względu na jej złożoność.
ArchimedesMP
57

Wykonaj poniższe czynności: (Linux)

Edytuj plik ~/.bashrc, aby wprowadzić następujące wiersze na jego końcu (w przypadku komputerów Mac plik będzie ~/.bash_profile)

# Git branch in prompt.
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Teraz uruchom nowe okno terminala i spróbuj wejść do dowolnego repozytorium git. Bieżąca gałąź zostanie wyświetlona wraz z monitem.

4 Więcej informacji - MAC / Linux

parasrish
źródło
Nie sądzę, aby konieczna była zmiana ~ / .bash_profile zamiast ~ / .bashrc na OSX.
bergercookie
1
W przypadku koloru rozważ zmianę „git branch” na „git -c color.ui = always branch” w parse_git_branch powyżej. Ma ten sam kolor, którego używa git branch do podświetlenia bieżącej gałęzi.
awatts
Zainspirowany przez Ciebie, ale podoba mi się, że moim katalogiem roboczym jest pełna ścieżka (\ w) z niebieskim podświetleniem. Przykład: gist.github.com/rmharrison/1885ef6bbb0226eb7b42e2135d5eeca2
rmharrison
Dla MAC Musiałem zlikwidować ucieczkę przed $ (parse_git_branch), aby uzyskać to do pracy tak: PS1="\u@\h \W\[\033[32m\]$(parse_git_branch)\[\033[00m\] $ ". Chociaż nie używam „eksportu” również przed PS1.
Chris
37

1- Jeśli nie masz uzupełniania basha ...:sudo apt-get install bash-completion

2- Edytuj swój plik .bashrc i sprawdź (lub dodaj):

if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

3- ... przed wierszem zachęty: export PS1='$(__git_ps1) \w\$ '
( __git_ps1 pokaże twoją gałąź git)

4- zrobić source .bashrc

EDYTOWAĆ :

Dalsze lektury: Nie odkrywaj koła na nowo

Eric Lavoie
źródło
to wydaje się być jedynym sposobem to działa na mnie za pomocą Homestead / Vagrant maszynę
Iannazzi
Działa dobrze w ubuntu 16.04
Frug
Łącze „Don't Reinvent the Wheel” jest niestety zepsute.
Taylor R
@TaylorR Przywróciłem link.
VonC
23

Oto jak skonfigurowałem monit, aby wyświetlić stan Git:

Pobierz skrypt zachęty git:

curl -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh

I dostosuj monit, dodając następujący kod w pliku .bashrc:

# Load Git functions
source ~/.git-prompt.sh

# Syntactic sugar for ANSI escape sequences
txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
badgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

# Prompt variables
PROMPT_BEFORE="$txtcyn\u@\h $txtwht\w$txtrst"
PROMPT_AFTER="\\n\\\$ "

# Prompt command
PROMPT_COMMAND='__git_ps1 "$PROMPT_BEFORE" "$PROMPT_AFTER"'

# Git prompt features (read ~/.git-prompt.sh for reference)
export GIT_PS1_SHOWDIRTYSTATE="true"
export GIT_PS1_SHOWSTASHSTATE="true"
export GIT_PS1_SHOWUNTRACKEDFILES="true"
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS="true"

Jeśli chcesz dowiedzieć się więcej, możesz pobrać wszystkie dotfiles tutaj: https://github.com/jamming/dotfiles

jaguililla
źródło
Jak dotąd najlepsza odpowiedź.
Basil Musa
@Hesam Możesz zmienić PROMPT_BEFOREzmienną środowiskową i usunąć na $txtwht\wpamięć nie wiem, ale myślę, że to
załatwia
1
Działa na moim Macu, ale pokazuje nazwę gałęzi, taką jak (master * $% =)
Ajak6
Symbole te przypominają stan gałęzi, tj .: $oznacza, że ​​są ukryte zmiany i =oznacza, że ​​najnowszy commit został wypchnięty do zdalnie śledzonej gałęzi
jaguililla
3

Najpierw otwórz swój profil Bash w katalogu domowym. Najłatwiejszy sposób otwierania i edytowania profilu bash_profile przy użyciu domyślnego edytora.

Na przykład otwieram go za pomocą VS Code za pomocą tego polecenia: code .bash_profile.

Następnie po prostu wklej następujące kody do swojego Bash.

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Funkcja

parse_git_branch ()

pobierze nazwę oddziału, a następnie przez PS1 możesz pokazać ją w swoim terminalu.

Tutaj,

\ u = nazwa użytkownika

@ = Tekst statyczny

\ h = Nazwa komputera

\ w = Bieżący katalog

$ = Tekst statyczny

Możesz zmienić lub usunąć te zmienne, aby lepiej dostosować je.


Jeśli używasz Gita po raz pierwszy w terminalu lub zaraz po konfiguracji, być może czasami nie możesz zobaczyć nazwy gałęzi.

Jeśli napotkasz ten problem, nie martw się. W takim przypadku wystarczy utworzyć przykładowe repozytorium i zatwierdzić je po wprowadzeniu pewnych zmian. Kiedy polecenie commit zostanie wykonane raz, terminal znajdzie od tego momentu gałąź git.


Zrzut ekranu: Git Branch w Terminalu

IFTEKHAR I ASIF
źródło
2
vim ~/.bash

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $"

Aby odzwierciedlić najnowsze zmiany, uruchom następujące polecenie

source ~/.bashrc

Wynik:-

chandrakant@NDL41104 ~/Chandrakant/CodeBase/LaravelApp (development) $
Chandrakant Ganji
źródło
0

Jeśli używasz muszli rybnej, jest to całkiem proste. fish to interaktywna skorupa, która zawiera wiele gadżetów. Możesz go zainstalować za pomocą apt-get.

sudo apt-get install fish

możesz następnie zmienić ustawienie monitu za pomocą

> fish_config 
Web config started at 'http://localhost:8001/'. Hit enter to stop.
Created new window in existing browser session.

teraz przejdź do http://localhost:8001/ otwarcia zakładki zachęty i wybierz opcję klasyczną + git

wprowadź opis obrazu tutaj

Teraz kliknij przycisk zachęty do użycia i gotowe.

Shasak
źródło
0
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]$(parse_git_branch)\n\$ '
xyz
źródło
Eww, naprawdę nie umieszczaj tam nagich ucieczek terminalowych; używać tputjak każda rozsądna osoba.
Toby Speight,
0

Wykonaj poniższe kroki, aby wyświetlić nazwę oddziału repozytorium GIT w terminalu Ubuntu:

step1: otwórz terminal i edytuj .bashrc za pomocą następującego polecenia.

vi .bashrc

step2: dodaj następujący wiersz na końcu pliku .bashrc:

parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' }

export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

krok 3: source .bashrc w katalogu głównym (domowym), wykonując:

/ rootfolder: ~ $ source .bashrc

Krok 4: Uruchom ponownie i otwórz terminal i sprawdź cmd. Przejdź do ścieżki katalogu repozytorium GIt i gotowe. :)

BinDev
źródło
0
root:~/project#  -> root:~/project(dev)# 

dodaj następujący kod na końcu twojego ~ / .bashrc

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
Ali Alp
źródło
0

Oto prosta, czysta wersja, której używam: link

wprowadź opis obrazu tutaj

kfcobrien
źródło
-1

Wypróbowałem mały skrypt w Pythonie, który trafia do folderu bin .... plik „gitprompt”

#!/usr/bin/env python
import subprocess, os
s = os.path.join(os.getcwd(), '.git')
def cut(cmd):
    ret=''
    half=0
    record = False
    for c in cmd:
        if c == "\n":
            if not (record):
                pass
            else:
                break
        if (record) and c!="\n":
            ret = ret + c
        if c=='*':
            half=0.5
        if c==' ':
            if half == 0.5:
                half = 1
        if half == 1:
            record = True
    return ret
if (os.path.isdir(s)):
    out = subprocess.check_output("git branch",shell=True)
    print cut(out)
else:
    print "-"

Niech to będzie wykonywalne i takie tam

Następnie dostosuj odpowiednio monit bash, na przykład:

\u:\w--[$(gitprompt)] \$ 
Love_for_CODE
źródło