Afficher la branche git courante dans le prompt

Pour tous mes projets, j'utilise le gestionnaire de sources Git, que ce soit simplement en local ou couplé avec un dépôt distant. Je l'utilise principalement dans le terminal et, je dois bien l'avouer, il m'arrive de temps en temps de faire des modifications sur la mauvaise branche, ce qui est particulièrement agaçant. Dans certaines situations, je dois même annuler mes modifications, switcher vers la bonne branche, et appliquer de nouveau mes modifications aux fichiers impactés. Pénible !

Pour m'éviter ce genre de mésaventure, je viens de modifier mon invite de commande pour qu'elle m'affiche le nom de la branche courante lorsque je suis dans un dépôt Git : comme ça, plus de risques d'erreurs !


Comment on fait ?

Vous allez voir, c'est finalement assez simple. La variable $PS1 est la variable d'environnement qui contient la valeur du "prompt", l'invite de commande qui s'affiche lorsque vous ouvrez un terminal. Nous allons simplement modifier sa valeur pour afficher le nom de la branche courante lorsque l'on est placés dans un dépôt git.

J'utilise bash, et je vais donc faire toutes les modifications à venir dans mon fichier .bashrc. Si vous utilisez un autre shell, il est probable que les modifications doivent se faire ailleurs, et portent sur d'autres variables : je vous laisse creuser ! Pour ceux qui comme moi utilisent bash, éditons notre fichier ~/.bashrc et ajoutons-y la fonction suivante :

1
2
3
4
5
6
7
8
parse_git_branch() 
{
  local BRANCH=$(git symbolic-ref HEAD --short 2> /dev/null)
  if [[ ! -z "$BRANCH" ]]
  then
    echo "($BRANCH)"
  fi
}

La commande git symbolic-ref HEAD --short affiche le nom de la branche sur laquelle vous vous trouvez, et on utilise 2> /dev/null pour masquer les erreurs potentielles (notamment si vous lancez cette commande en dehors d'un dépôt). Si le nom de branche n'est pas vide, alors cette fonction l'affiche entre parenthèses.

Maintenant qu'on a créé cette fonction, il suffit de l'appeler dans notre PS1. Dans votre .bashrc, éditez votre variable $PS1 pour y insérer un appel à cette fonction :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# (...)

# PROMPT COLOURS
BLACK='\e[0;30m'      # Black - Regular
RED='\e[0;31m'        # Red
GREEN='\e[0;32m'      # Green
YELLOW='\e[0;33m'     # Yellow
BLUE='\e[0;34m'       # Blue
PURPLE='\e[0;35m'     # Purple
CYAN='\e[0;36m'       # Cyan
WHITE='\e[0;37m'      # White
BLACK_BOLD='\e[1;30m'   # Black - Bold
RED_BOLD='\e[1;31m'     # Red - Bold
GREEN_BOLD='\e[1;32m'   # Green - Bold
YELLOW_BOLD='\e[1;33m'  # Yellow - Bold
BLUE_BOLD='\e[1;34m'    # Blue - Bold
PURPLE_BOLD='\e[1;35m'  # Purple - Bold
CYAN_BOLD='\e[1;36m'    # Cyan - Bold
WHITE_BOLD='\e[1;37m'   # White - Bold
RESET='\e[0m'         # Text Reset

#
# DEFINING THE PROMPT
#

export PS1="\n${WHITE_BOLD}\u : \w ${YELLOW}**\$(parse_git_branch)**${WHITE_BOLD}\n${RESET}"

Ce qui vous donnera un magnifique prompt comme celui-là :

Mon prompt en image - iTerm Mac OS

Bien entendu, pour les couleurs et le reste du contenu du prompt, je vous laisse seul maître à bord. Sur le même principe, vous pouvez afficher dans votre prompt d'autres informations en lien avec git. Je vous laisse vous référer aux liens en fin d'articles si vous souhaitez en faire davantage.

Note: Vous avez pu remarquer que le $ situé devant l'appel à la fonction est précédé d'un backslash. Pourquoi ? Tout simplement pour que ladite fonction soit interprétée à chaque fois : en l'absence du backslash, la fonction n'est évaluée qu'au chargement du .bashrc, et les changements de branche que vous ferez ensuite ne seront donc pas répercutés sur votre prompt (ça n'aurait alors aucun intérêt). Voir cette discussion sur Stack Overflow pour plus d'informations.


Références