Ajout d'une branche git sur l'invite de commande Bash


161

J'ai essayé d'ajouter la branche git sur laquelle je travaille actuellement (extrait) à l'invite bash sans succès .. ( tout en gardant mon chemin actuel qui montre le répertoire / fichier actif intact) J'ai un fichier .bashrc sur ma maison, mais j'ai aussi vu beaucoup de gens mentionner le fichier .profile ..


3
je pense que ce serait mieux demandé dans l'échange unix / linux.
Cole Buspar

J'ai essayé 10 tutoriels différents, certains d'entre eux ont fonctionné mais j'ai la branche git et j'ai perdu le répertoire / chemin de travail que j'avais auparavant ..
George Katsanos

Git 1.9.3+ apporte un moyen intéressant d'afficher la branche: voir ma réponse ci
VonC

1
@cole busby apparemment pas.
George Katsanos

1
@GeorgeKatsanos quatre ans m'ont certainement montré: p
Cole Buspar

Réponses:


161

git 1.9.3 ou version ultérieure: utilisez __git_ps1

Git fournit un script shell appelé git-prompt.sh, qui inclut une fonction __git_ps1qui

imprime le texte à ajouter à l'invite bash PS1 (comprend le nom de la branche)

Son utilisation la plus basique est:

$ __git_ps1
(master)

Il prend également une chaîne de format facultative:

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

Comment l'obtenir

Copiez d'abord le fichier quelque part (par exemple ~/.git-prompt.sh).

Option 1: utilisez une copie existante sur votre système de fichiers. Exemple (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: tirez le script de GitHub .

Ensuite, ajoutez la ligne suivante à votre .bashrc/.zshrc:

source ~/.git-prompt.sh

Enfin, changez votre PS1appel __git_ps1en substitution de commande:

Frapper:

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

Zsh:

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

git <1.9.3

Mais notez que seul git 1.9.3 (mai 2014) ou version ultérieure vous permet d' afficher en toute sécurité ce nom de branche (!)

Voir commit 8976500 de Richard Hansen ( richardhansen) :

Bash et zsh soumettent la valeur de PS1 à l' expansion des paramètres , à la substitution de commandes et à l'expansion arithmétique.

Plutôt que d'inclure le nom de branche brut et sans échappement PS1lors de l'exécution en mode à deux ou trois arguments, construisez PS1pour référencer une variable contenant le nom de la branche.

Étant donné que les shells ne se développent pas de manière récursive, cela évite l'exécution de code arbitraire par des noms de branche spécialement conçus tels que

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

Quel esprit sournois nommerait une branche comme ça? ;) ( À côté d'une maman comme dans xkcd )

Plus d'exemples

rapports still_dreaming_1 dans les commentaires :

Cela semble fonctionner très bien si vous voulez une invite de couleur avec xterm(dans mon .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)\$ ' 

Tout est d'une couleur différente, y compris la branche.

Dans Linux Mint 17.3 Cinnamon 64 bits:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ ' 

3
comment vous pouvez définir l'invite sur la branche git actuelle lorsque vous êtes réellement dans un dépôt git. Donc, si vous êtes dans un répertoire normal, il affiche une invite normale.
Zubair Alam

1
@ still_dreaming_1, vous pouvez mettre à jour ou compiler git très facilement: stackoverflow.com/a/24847953/6309
VonC

1
Cela semble fonctionner très bien si vous voulez une couleur une invite de couleur avec xterm (par .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)\$'Tout est d'une couleur différente, y compris la branche.
still_dreaming_1

5
Cette PS1 que j'ai postée ne s'affiche plus correctement pour moi dans Linux Mint 17.3 Cinnamon 64 bits, mais c'est le cas:PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ '
still_dreaming_1

1
Le maître actuel est à github.com/git/git/blob/master/contrib/completion/git-prompt.sh - je pense que nous devrions établir un lien vers cela dans la réponse, au cas où un exploit serait trouvé dans le futur? Aussi: j'ai dû échapper au $ et "dans ma ligne PS1, mais c'est probablement dû à sa complexité.
ArchimedesMP

57

Suivez les étapes ci-dessous: (Linux)

Modifier le fichier ~/.bashrc, pour entrer les lignes suivantes à sa fin (dans le cas, sur Mac, le fichier serait ~/.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\] $ "

Maintenant, démarrez la nouvelle fenêtre de terminal et essayez d'entrer dans n'importe quel git-repo. La branche actuelle serait affichée, avec l'invite.

4 Plus d'informations - MAC / Linux


Je ne pense pas qu'il soit nécessaire de changer le ~ / .bash_profile au lieu de ~ / .bashrc sous OSX.
bergercookie


1
Pour la couleur, envisagez de changer la "branche git" en "git -c color.ui = toujours branche" dans parse_git_branch ci-dessus. Il a la même couleur que la branche git utilise pour mettre en évidence la branche actuelle.
awatts

Inspiré par vous, mais j'aime que mon répertoire de travail soit le chemin complet (\ w) avec une surbrillance bleue. Exemple: gist.github.com/rmharrison/1885ef6bbb0226eb7b42e2135d5eeca2
rmharrison

Pour MAC je devais éliminer l'évasion avant $ (parse_git_branch) pour obtenir ce travail si: PS1="\u@\h \W\[\033[32m\]$(parse_git_branch)\[\033[00m\] $ ". Bien que je n'utilise pas non plus «exporter» devant PS1.
Chris

37

1- Si vous n'avez pas de bash-completion ...:sudo apt-get install bash-completion

2- Editez votre fichier .bashrc et vérifiez (ou ajoutez):

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

3- ... avant votre ligne d'invite: export PS1='$(__git_ps1) \w\$ '
( __git_ps1 affichera votre branche git)

4- faire source .bashrc

ÉDITER :

Lectures supplémentaires: Ne réinventez pas la roue


cela semble être la seule façon dont cela fonctionne pour moi en utilisant une ferme / machine vagabonde
Iannazzi

Fonctionne très bien dans ubuntu 16.04
Frug

Le lien «Ne réinventez pas la roue» est malheureusement rompu.
Taylor R

@TaylorR J'ai restauré le lien.
VonC

23

Voici comment j'ai configuré l'invite pour afficher l'état de Git:

Obtenez le script git-prompt:

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

Et personnalisez votre invite en ajoutant le code suivant dans votre fichier .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"

Si vous voulez en savoir plus, vous pouvez obtenir tous les fichiers dotfiles ici: https://github.com/jamming/dotfiles


Meilleure réponse à ce jour.
Basil Musa

@Hesam Vous pouvez changer la PROMPT_BEFOREvariable d'environnement et supprimer le $txtwht\wJe ne le connais pas par cœur, mais je suppose que cela fait l'affaire
jaguililla

1
Cela fonctionne sur mon mac mais affiche le nom de la branche comme (master * $% =)
Ajak6

Ces symboles ressemblent à l'état de la branche, c'est-à-dire: $signifie qu'il y a des modifications cachées, et =signifie que le dernier commit a été poussé vers la branche distante suivie
jaguililla


3

Dans un premier temps, ouvrez votre profil Bash dans votre répertoire personnel. Le moyen le plus simple d'ouvrir et de modifier votre bash_profile à l' aide de votre éditeur par défaut.

Par exemple, je l'ouvre en utilisant le code VS en utilisant cette commande: code .bash_profile.

Ensuite, collez simplement les codes suivants dans votre 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\] $ "

La fonction

parse_git_branch ()

récupérera le nom de la branche et ensuite via PS1, vous pourrez l'afficher dans votre terminal.

Ici,

\ u = Nom d'utilisateur

@ = Texte statique

\ h = Nom de l'ordinateur

\ w = Répertoire actuel

$ = Texte statique

Vous pouvez modifier ou supprimer ces variables pour plus de personnalisation.


Si vous utilisez Git pour la première fois dans le terminal ou immédiatement après la configuration, peut-être que parfois vous ne pouvez pas voir le nom de la branche.

Si vous rencontrez ce problème, ne vous inquiétez pas. Dans ce cas, créez simplement un exemple de référentiel et validez-le après quelques modifications. Lorsque la commande commit s'exécutera une fois, le terminal trouvera la branche git à partir de là.


Capture d'écran: Git Branch dans le 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\] $"

Pour refléter les dernières modifications, exécutez la commande suivante

source ~/.bashrc

Production:-

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

0

Si vous utilisez la coquille de poisson, c'est assez simple. Le poisson est une coquille interactive qui contient de nombreux goodies. Vous pouvez l'installer en utilisant apt-get.

sudo apt-get install fish

vous pouvez ensuite modifier le paramètre d'invite en utilisant

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

allez maintenant http://localhost:8001/ ouvrir l'onglet d'invite et choisissez l'option classique + git

entrez la description de l'image ici

Cliquez maintenant sur le bouton d'invite d'utilisation et vous êtes prêt.


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, ne mets vraiment pas d'échappées terminales nues là-dedans; utiliser tputcomme toute personne sensée.
Toby Speight

0

Suivez les étapes ci-dessous pour afficher le nom de la branche de votre dépôt GIT dans le terminal ubuntu:

step1: ouvrez le terminal et modifiez .bashrc à l'aide de la commande suivante.

vi .bashrc

étape2: ajoutez la ligne suivante à la fin du fichier .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\] $ "

étape3: source .bashrc dans le répertoire racine (home) en faisant:

/ dossier racine: ~ $ source .bashrc

Étape 4: Redémarrez et ouvrez le terminal et vérifiez le cmd. Accédez au chemin du répertoire de votre dépôt GIt et vous avez terminé. :)


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

ajoutez le code suivant à la fin de votre ~ / .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


-1

J'ai essayé un petit script en python qui va dans un dossier bin .... fichier '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 "-"

Rendez-le exécutable et tout

Ensuite, ajustez l'invite bash en conséquence comme:

\u:\w--[$(gitprompt)] \$ 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.