Hinzufügen eines Git-Zweigs an der Bash-Eingabeaufforderung


161

Ich hat versucht , Hinzufügen von Git - Zweigs arbeite ich zur Zeit an (abgemeldeten) an der Bash - Eingabeaufforderung ohne Erfolg .. ( während meines Strompfad zu halten , die zeigt die aktive Verzeichnis / Datei intakt) ich eine Datei .bashrc auf meinem Hause habe, Aber ich habe auch viele Leute gesehen, die die .profile-Datei erwähnt haben.


3
Ich denke, das wäre besser im Unix / Linux-Austausch gefragt.
Cole Busby

Ich habe 10 verschiedene Anleitungen ausprobiert, einige davon haben funktioniert, aber ich habe den Git-Zweig bekommen und das Arbeitsverzeichnis / den Pfad verloren, das ich zuvor hatte.
George Katsanos

Git 1.9.3+ bietet eine interessante Möglichkeit, den Zweig anzuzeigen: siehe meine Antwort unten
VonC

1
@ Cole Busby anscheinend nicht.
George Katsanos

1
@ GeorgeKatsanos vier Jahre sicher zeigte mir: p
Cole Busby

Antworten:


161

Git 1.9.3 oder höher: verwenden __git_ps1

Git bietet ein Shell-Skript namens git-prompt.sh, das eine Funktion enthält __git_ps1, die

druckt Text, der zur Bash-PS1-Eingabeaufforderung hinzugefügt werden soll (einschließlich Filialname)

Die grundlegendste Verwendung ist:

$ __git_ps1
(master)

Es wird auch eine optionale Formatzeichenfolge benötigt:

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

Wie man es bekommt

Kopieren Sie zuerst die Datei an einen Ort (z ~/.git-prompt.sh. B. ).

Option 1: Verwenden Sie eine vorhandene Kopie in Ihrem Dateisystem. Beispiel (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

Option 2: Ziehen Sie das Skript von GitHub .

Fügen Sie als Nächstes die folgende Zeile zu Ihrer hinzu .bashrc/.zshrc:

source ~/.git-prompt.sh

Ändern Sie schließlich Ihren PS1Aufruf __git_ps1als Befehlsersetzung:

Bash:

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

Zsh:

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

git <1.9.3

Aber beachten Sie, dass nur git 1.9.3 (Mai 2014) oder später Sie können sicher , dass die Zweignamen angezeigt werden (!)

Siehe Commit 8976500 von Richard Hansen ( richardhansen) :

Sowohl bash als auch zsh unterziehen den Wert von PS1 einer Parametererweiterung , einer Befehlssubstitution und einer arithmetischen Erweiterung.

PS1Konstruieren Sie so PS1, dass auf eine Variable verwiesen wird, die den Verzweigungsnamen enthält , anstatt den rohen, nicht entkoppelten Zweignamen in den Modus mit zwei oder drei Argumenten aufzunehmen .

Da sich die Shells nicht rekursiv erweitern, wird die Ausführung von willkürlichem Code durch speziell gestaltete Zweignamen wie z

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

Welcher hinterhältige Verstand würde einen solchen Zweig nennen? ;) ( Neben einer Mutter wie in xkcd )

Mehr Beispiele

still_dreaming_1 berichtet in den Kommentaren :

Dies scheint großartig zu funktionieren, wenn Sie eine Farbaufforderung mit xterm(in meinem .bashrc) möchten :

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)\$ ' 

Alles hat eine andere Farbe, einschließlich des Zweigs.

In 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) \$ ' 

3
Wie Sie die Eingabeaufforderung auf den aktuellen Git-Zweig setzen können, wenn Sie sich tatsächlich in einem Git-Repo befinden. Wenn Sie sich also in einem normalen Verzeichnis befinden, wird die normale Eingabeaufforderung angezeigt.
Zubair Alam

1
@ still_dreaming_1 Sie können Git jedoch sehr einfach aktualisieren oder kompilieren: stackoverflow.com/a/24847953/6309
VonC

1
Dies scheint gut zu funktionieren, wenn Sie eine Farbe und eine Farbaufforderung mit xterm (in von .bashrc) wünschen: 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)\$'Alles hat eine andere Farbe, einschließlich des Zweigs.
still_dreaming_1

5
Diese PS1, die ich gepostet habe, wird in Linux Mint 17.3 Cinnamon 64-Bit nicht mehr korrekt angezeigt, aber dies tut:PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ '
still_dreaming_1

1
Der aktuelle Master befindet sich unter github.com/git/git/blob/master/contrib/completion/git-prompt.sh - Ich denke, wir sollten in der Antwort darauf verweisen, falls in Zukunft ein Exploit gefunden wird. Außerdem: Ich musste dem $ und "in meiner PS1-Zeile entkommen, aber das liegt wahrscheinlich an seiner Komplexität.
ArchimedesMP

57

Befolgen Sie die folgenden Schritte: (Linux)

Bearbeiten Sie die Datei ~/.bashrc, um am Ende die folgenden Zeilen einzugeben (bei Mac wäre die Datei ~/.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\] $ "

Starten Sie nun das neue Terminalfenster und versuchen Sie, ein beliebiges Git-Repo aufzurufen. Der aktuelle Zweig wird mit der Eingabeaufforderung angezeigt.

4 Weitere Informationen - MAC / Linux


Ich denke nicht, dass es notwendig ist, das ~ / .bash_profile anstelle von ~ / .bashrc unter OSX zu ändern.
Bergercookie


1
Für Farbe sollten Sie den "Git-Zweig" in "git -c color.ui = immer verzweigen" in parse_git_branch oben ändern. Es hat dieselbe Farbe wie der Git-Zweig, um den aktuellen Zweig hervorzuheben.
Awatts

Inspiriert von Ihnen, aber ich möchte, dass mein Arbeitsverzeichnis der vollständige Pfad (\ w) mit blauer Hervorhebung ist. Beispiel: gist.github.com/rmharrison/1885ef6bbb0226eb7b42e2135d5eeca2
rmharrison

Für MAC musste ich die Flucht vor dem $ (parse_git_branch) beseitigen, damit dies funktioniert : PS1="\u@\h \W\[\033[32m\]$(parse_git_branch)\[\033[00m\] $ ". Obwohl ich 'export' auch nicht vor PS1 benutze.
Chris

37

1- Wenn Sie keine Bash-Vervollständigung haben ...:sudo apt-get install bash-completion

2- Bearbeiten Sie Ihre .bashrc- Datei und überprüfen (oder hinzufügen):

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

3- ... vor Ihrer Eingabeaufforderungszeile: export PS1='$(__git_ps1) \w\$ '
( __git_ps1 zeigt Ihren Git-Zweig an)

4- tun source .bashrc

EDIT:

Weitere Lesungen: Das Rad nicht neu erfinden


Dies scheint der einzige Weg zu sein, wie es für mich mit einer Homestead / Vagrant-Maschine
funktioniert

Funktioniert gut in Ubuntu 16.04
Frug

Der Link "Das Rad nicht neu erfinden" ist leider defekt.
Taylor R

@ TaylorR Ich habe den Link wiederhergestellt.
VonC

23

So habe ich die Eingabeaufforderung konfiguriert, um den Git-Status anzuzeigen:

Holen Sie sich das Git-Prompt-Skript:

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

Passen Sie Ihre Eingabeaufforderung an und fügen Sie den folgenden Code in Ihre .bashrc-Datei ein:

# 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"

Wenn Sie mehr erfahren möchten, können Sie alle Punktedateien hier herunterladen: https://github.com/jamming/dotfiles


Beste Antwort bisher.
Basil Musa

@Hesam Sie können die PROMPT_BEFOREUmgebungsvariable ändern und entfernen $txtwht\wIch weiß es nicht auswendig, aber ich denke, es macht den Trick
Jaguililla

1
Es funktioniert auf meinem Mac, zeigt aber den
Filialnamen

Diese Symbole ähneln dem Status des Zweigs, dh: $bedeutet, dass Änderungen =
gespeichert


3

Öffnen Sie zunächst Ihr Bash-Profil in Ihrem Home-Verzeichnis. Der einfachste Weg, um Ihre zu öffnen und zu bearbeiten bash_profile mit Ihrem Standardeditor .

Zum Beispiel öffne ich es mit dem VS-Code mit folgendem Befehl: code .bash_profile.

Fügen Sie dann einfach die folgenden Codes in Ihren Bash ein.

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\] $ "

Die Funktion

parse_git_branch ()

ruft den Filialnamen ab und kann ihn dann über PS1 in Ihrem Terminal anzeigen.

Hier,

\ u = Benutzername

@ = Statischer Text

\ h = Computername

\ w = Aktuelles Verzeichnis

$ = Statischer Text

Sie können diese Variablen für weitere Anpassungen ändern oder entfernen.


Wenn Sie Git zum ersten Mal im Terminal oder unmittelbar nach der Konfiguration verwenden, können Sie den Zweignamen manchmal nicht sehen.

Wenn Sie dieses Problem bekommen, machen Sie sich keine Sorgen. In diesem Fall erstellen Sie einfach ein Beispiel-Repository und schreiben es nach einigen Änderungen fest. Wenn der Commit-Befehl einmal ausgeführt wird, findet das Terminal von da an einen Git-Zweig.


Screenshot: Git Branch im Terminal


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\] $"

Führen Sie den folgenden Befehl aus, um die letzten Änderungen wiederzugeben

source ~/.bashrc

Ausgabe:-

chandrakant@NDL41104 ~/Chandrakant/CodeBase/LaravelApp (development) $

0

Wenn Sie die Fischschale verwenden, ist es ziemlich einfach. Fisch ist eine interaktive Schale, die viele Leckereien enthält. Sie können es mit installieren apt-get.

sudo apt-get install fish

Sie können dann die Eingabeaufforderungseinstellung mit ändern

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

gehen jetzt auf http://localhost:8001/ die Aufforderung Tab zu öffnen , und wählen Sie die klassische + git Option

Geben Sie hier die Bildbeschreibung ein

Klicken Sie nun auf die Schaltfläche Eingabeaufforderung verwenden und Sie sind fertig.


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\$ '

Eww, leg wirklich keine nackten Terminalfluchten hinein; Verwenden Sie tputwie jede gesunde Person.
Toby Speight

0

Führen Sie die folgenden Schritte aus, um den Namen des Zweigs Ihres GIT-Repos im Ubuntu-Terminal anzuzeigen:

Schritt 1: Öffnen Sie das Terminal und bearbeiten Sie .bashrc mit dem folgenden Befehl.

vi .bashrc

Schritt 2: Fügen Sie am Ende der .bashrc-Datei die folgende Zeile hinzu:

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\] $ "

Schritt 3: Quell .bashrc im Stammverzeichnis (Home), indem Sie Folgendes tun:

/ rootfolder: ~ $ source .bashrc

Schritt 4: Starten Sie das Terminal neu, öffnen Sie es und überprüfen Sie das cmd. Navigieren Sie zu Ihrem GIt-Repo-Verzeichnispfad und Sie sind fertig. :) :)


0
root:~/project#  -> root:~/project(dev)# 

Fügen Sie den folgenden Code am Ende Ihres ~ / .bashrc hinzu

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


-1

Ich habe ein kleines Skript in Python ausprobiert, das sich in einem bin-Ordner befindet .... 'gitprompt'-Datei

#!/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 "-"

Mach es ausführbar und so

Passen Sie dann die Bash-Eingabeaufforderung wie folgt an:

\u:\w--[$(gitprompt)] \$ 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.