web-dev-qa-db-fra.com

le script pour montrer que la branche git dans bash ne fonctionne plus sur Ubuntu 18.04

Dans mon installation de 16.04, j’ai mis ceci dans mon fichier ~/.bashrc:

#Show git branch in commandline
parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[00m\]\$(parse_git_branch)\[\033[00m\] $ "

Il a montré une invite comme ceci:

user:~/myrepo (master) $

Mais quand je fais la même chose le 18 avril, l’invite ressemble à ceci:

user:~/myrepo $ 

Comment puis-je le faire fonctionner dans 18.04?

$ printf "%q\n" "$PS1" "$Prompt_COMMAND" "$0" "$Shell"
\\\[\\033\[01\;32m\\\]\\u:\\\[\\033\[01\;34m\\\]\\w\\\[\\033\[00m\\\]\$\(parse_git_branch\)\\\[\\033\[00m\\\]\ \$\ 
''
bash
/bin/bash

J'utilise sed (GNU sed) 4.4 et GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu). Ceci est une "nouvelle" installation, il n'y a donc rien de plus dans .bashrc.

3
Felix Rosén

La solution était assez simple.

Je mets un amont, met en scène un commit et le pousse. Après cela a fonctionné.

Je pensais que le script utilisait en quelque sorte le dossier .git généré avec git init. Depuis, cela fonctionne sur les branches qui n’ont pas d’amont.

2
Felix Rosén

Bien que vous ayez déjà résolu le problème, j'aimerais vous présenter la solution déjà fournie avec git:

Avec git, le fichier /usr/lib/git-core/git-sh-Prompt est installé. Il y a des années, il figurait dans le répertoire contrib mais, entre-temps, il a été intégré aux chemins officiels. Le fichier n'est pas destiné à être exécuté (en fait, il n'a pas d'indicateur x) mais plutôt source à partir du .bashrc. Il définit certaines fonctions pour gérer une jolie invite, la plus importante étant __git_ps1.

Vous pouvez ajouter les lignes suivantes à votre .bashrc:

source /usr/lib/git-core/git-sh-Prompt
export PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[00m\]\$(__git_ps1)\[\033[00m\] $ "

Le haut du fichier /usr/lib/git-core/git-sh-Prompt donne une description de ce qui peut encore être fait. Ma version dit 1) Copy this file to somewhere (e.g. ~/.git-Prompt.sh). mais ce n'est pas nécessaire (l'instruction est obsolète).

Vous pouvez également définir certaines variables d'environnement pour modifier le comportement de la fonction. J'utilise par exemple

export GIT_PS1_SHOWDIRTYSTATE=yes

Le résultat ressemble alors à:

# clean
pduck:~/oss/rsyslog (master) $ 

ou

# dirty
pduck:~/oss/rsyslog (master *) $ 

ou

# something added to index
pduck:~/oss/rsyslog (master +) $ 

ou

# in a completely fresh repo
pduck:~/oss/xxx (master #) $ 

Btw: Le moyen "approprié" d'obtenir la branche actuelle n'est pas d'analyser la sortie de git branch car cela pourrait changer avec les nouvelles versions de git. git branch est une commande dite porcelaine qui signifie que sa sortie est agréable et jolie mais qu'il n'est pas garanti qu'elle reste identique avec les différentes versions. Les gars git recommandent donc plomberie des outils de script. Avec plomberie, la branche actuelle peut être déterminée avec

if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    current_branch=$(git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD)
else
    current_branch=""
fi

La première affectation fonctionne si HEAD est une référence symbolique (c'est-à-dire qu'une branche ou une balise est extraite). Si vous avez extrait quelque chose qui n'a pas d'étiquette (par exemple git checkout HEAD^^), cela échoue et nous utilisons git rev-parse --short HEAD à la place pour afficher le SHA1. if vérifie si nous sommes dans un répertoire de travail git (car sinon les commandes n'ont aucun sens).

7
PerlDuck