Prompt Bash pour GIT
J’utilise GIT depuis quelques mois, et je trouve ça vraiment génial. Si vous ne connaissez pas, ou peu, vous ne pouvez pas ne pas lire le livre Pro Git (sous licence cc-by-nc-sa). Les explications très claires permettent en quelques heures de maîtriser toutes les fonctions de base, et d’être à l’aise avec la gestion des branches (et bien plus encore).
Branches visibles
Le but de ce billet est de répondre à un problème particulier : par manque d’attention, il m’est arrivé plusieurs fois de commiter des changements sur une mauvaise branche (j’étais persuadé d’être sur une branche, en fait j’étais sur une autre). Ce n’est pas très grave (on peut s’en sortir), mais c’est pénible.
Je souhaiterais donc avoir le nom de la branche dans le prompt bash.
Des solutions existent déjà : le paquet git
embarque même un script qui répond au besoin. Certains utilisent aussi des scripts personnalisés. Mais aucun de ceux que j’ai trouvés ne me convenait. J’ai donc écrit mon propre script.
Mes prompts
Version simple
J’ai commencé par une version simple, qui ajoute en couleur @nomdelabranche
à la fin du prompt. Un exemple vaut mieux qu’un long discours :
rom@rom-laptop:~/dev$ cd myproject/ rom@rom-laptop:~/dev/myproject@master$ git checkout testing Switched to branch 'testing' rom@rom-laptop:~/dev/myproject@testing$ cd img rom@rom-laptop:~/dev/myproject/img@testing$
Dans une arborescence ayant plusieurs projets GIT imbriqués (dans le cas de l’utilisation de sous-modules), la branche des projets parents n’est pas affichée :
rom@rom-laptop:~/dev$ cd mybigproject/ rom@rom-laptop:~/dev/mybigproject@master$ cd submodule/ rom@rom-laptop:~/dev/mybigproject/submodule@master$ git checkout exp Switched to branch 'exp' rom@rom-laptop:~/dev/mybigproject/submodule@exp$ cd .. rom@rom-laptop:~/dev/mybigproject@master$
Version améliorée
Dans cette version simple, le nom de la branche est toujours affiché à la fin. Cela ne me convient pas, je le voudrais toujours à la racine du projet en question. C’est ce que permet la version améliorée.
Voici le résultat avec les mêmes commandes :
rom@rom-laptop:~/dev$ cd myproject/ rom@rom-laptop:~/dev/myproject@master$ git checkout testing Switched to branch 'testing' rom@rom-laptop:~/dev/myproject@testing$ cd img rom@rom-laptop:~/dev/myproject@testing/img$
Et avec des sous-modules, la branche des projets parents est affichée :
rom@rom-laptop:~/dev$ cd mybigproject/ rom@rom-laptop:~/dev/mybigproject@master$ cd submodule/ rom@rom-laptop:~/dev/mybigproject@master/submodule@master$ git checkout exp Switched to branch 'exp' rom@rom-laptop:~/dev/mybigproject@master/submodule@exp$ cd .. rom@rom-laptop:~/dev/mybigproject@master$
Script
Le script, sous licence WTFPL, est disponible sur un dépôt git :
git clone http://git.rom1v.com/gitbashprompt.git
(ou sur github)
Une fois cloné, éditez le fichier ~/.bashrc
pour remplacer l’initialisation de la variable PS1
:
PS1='${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ '
par :
. your_cloned_repo/gitbashprompt
Pour tester, ouvrir un nouveau terminal.
Conclusion
Tout d’abord, je suis content d’avoir exactement le comportement que je souhaitais pour mon GIT.
Ensuite, j’ai découvert le fonctionnement du prompt, avec notamment les subtilités d’échappement de caractères de la variable PS1
et la prise en compte des caractères de contrôle « \\[
» et « \\]
».
Enfin, je me suis enfin décidé à étudier la gestion des couleurs de Bash (qui, à première vue, est assez repoussante, il faut bien l’avouer). Mes scripts seront donc plus jolis à l’avenir