HervéRenault.fr

logo de Git logo de Bash

Mon prompt et git

Indiquer l'état du dépôt git dans le répertoire courant par un simple code de couleur, c'est très pratique. Exemple :

herve@vaio:/var/www/html/herverenault.fr/miscellanées (master) $  

Ce master marron m'indique qu'il y a des modifs sur ma branche. Pour cela, j'utilise ce script de Mike Stewart que j'ai modifié à mon goût :

#!/bin/bash

Normal='\['$( tput sgr0 )'\]'
Yellow='\['$( tput setaf 3 )'\]'
Blue='\['$( tput setaf 6 )'\]'
Bold='\['$( tput bold )'\]'

PS1=$Bold'\u@\h'$Normal':\w$( git branch >/dev/null 2>&1
if [ $? -eq 0 ]; then
    git status | grep "rien à valider" >/dev/null
    if [ $? -eq 0 ]; then
        # Dépôt propre, couleur : bleu comme un ciel pur
        echo -n '$Blue'
    else
        # Dépôt sale, couleur : euh...
        echo -n '$Yellow'
    fi
    echo "$( __git_ps1 " (%s) " )'$Normal'"
# else pas de dépôt
fi )$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

J'aime sa simplicité mais le problème c'est qu'il bloque l'affichage du prompt lorsqu'on est dans un gros répertoire git, le temps qu'il exécute git status. Bien sûr, cela ne se produit plus quand le système a mis en cache les données du git status. Sauf que quand on revient dans le répertoire après avoir passé un peu de temps à faire autre chose, le cache du système ne contient plus ces données, et on attend de nouveau pendant le git status (qui s'exécute à chaque nouvelle ligne de commande dans le terminal).

J'ai donc fait en sorte d'être seulement averti quand j'arrive dans un répertoire qui fait partie d'un dépôt git, grâce à ces deux lignes dans mon .bashrc :

alias gp='source ~/scripts/git-prompt.sh'
PS1='\['$( tput bold )'\]\u@\h\['$( tput sgr0 )'\]:\w\['$( tput bold )'\]$( __git_ps1 " (%s) " )\['$( tput sgr0 )'\]$ '

Ce qui me donne, quand j'arrive dans le même répertoire dans un nouveau terminal :

herve@vaio:/var/www/html/herverenault.fr/miscellanées (master) $  

Ensuite, selon ce que je viens y faire, une modif ou un simple ls par exemple, je peux lancer mon prompt git avec l'alias gp ou pas.