Aller au contenu

Comment mieux gérer les crochets (hooks) git et les intégrer aux suivis de versions du dépôt

Bonjour,

Lorsque nous travaillons sur des projets de développement, nous apprécions pouvoir compter sur notre gestionnaire de dépôt pour réaliser des opérations automatiquement lorsque se produisent certains événements.

C’est le cas ici pour moi lorsque je commit mes modifications dans ce blog Hugo : un script exécute la compilation et transfère les modifications sur le serveur sans que j’aie à m’en préoccuper.

Nous parlons ici bien sûr des crochets client (côté machine de développement).

Historiquement, et par défaut, nous créons des crochets (hooks) dans le dossier hooks caché dans les méandres du dossier .git.

Deux inconvénients à cela :

  • la plupart des EDI ne nous donnent pas accès facilement à ce dossier (pour nous protéger) ;
  • les fichiers de crochets sont dans un espace non suivi par le gestionnaire de versions.

Je présente ici une méthode simple et pratique pour gérer les crochets gits client.

Création des crochets (hooks) git dans un dossier du projet
#

Nous pouvons créer un dossier hooks dans la racine de notre projet et y créer et éditer nos scripts.

Sans oublier bien sûr de les rendre exécutables avec le chmod u+x qui va bien.

Pour indiquer à git d’utiliser ce dossier en lieu et place du dossier par défaut .git/hooks dans le projet en cours, nous utilisons la commande

1
git config --local core.hooksPath hooks
L’argument --local est généralement omis car c’est le comportement par défaut.

Dorénavant, sans que nous ayons besoin de « bidouiller » comme avant la version 2.9 de git, et sauf mention contraire dans gitignore, nos crochets git (hooks) sont sauvegardés et versionnés avec le reste de notre projet.

Niveaux local, global et system
#

Il est possible de définir des crochets git

  • au niveau local comme nous venons de le voir ;
  • au niveau global et
  • au niveau system (sous réserve de disposer des privilèges associés)

Il est possible d’indiquer un chemin absolu ou relatif.

Nous pouvons ainsi adopter la même convention pour tous nos projets, avec la variante immédiate de la commande au niveau projet :

1
git config --global core.hooksPath hooks

git ira voir dans le dossier hooks du dépôt dans lequel nous nous trouvons lorsque nous l’exécutons.

Quels sont les fichiers impactés ?
#

Même si nous n’avons pas besoin de les éditer, il est bon de savoir où ils sont par défaut dans Debian et Linux généralement :

  • local : .git/config ;
  • global : ~/.gitconfig et
  • system : /etc/gitconfig.

Ces fichiers sont créés si nécessaire (ils n’existent pas s’il n’y a rien à mettre dedans).

Vérifier la configuration qui s’applique
#

La commande simple et laconique qui retourne le paramètre qui s’applique est :

1
git config --get core.hooksPath

Nous obtenons plus d’informations avec :

1
git config --list --show-origin | grep core.hookspath
  • Si plusieurs paramètres existent, ils sont listés ;
  • les niveaux sont indiqués lisiblement via les chemins des fichiers.

Exemple :

1
2
3
file:/etc/gitconfig           core.hookspath=/usr/local/share/git-core/hooks
file:/home/user/.gitconfig    core.hookspath=/home/user/globalhooks
file:.git/config              core.hookspath=hooks

=> C’est hooks (défini dans le cadre du projet) qui s’applique ici.

Dans un tel cas, cela vaut sûrement la peine d’aller voir ce qu’il y a aux niveaux global et system pour savoir si nous avons intérêt à reprendre tout ou partie de ce qui est prévu là-bas au niveau du projet.

Supprimer un paramétrage personnalisé
#

Pour revenir à l’état par défaut de git, ou pour supprimer sélectivement un des paramètres, nous disposons des commandes :

1
2
3
4
5
6
# niveau dépôt
git config --local --unset core.hooksPath
# niveau global
git config --global --unset core.hooksPath
# niveau system
git config --system --unset core.hooksPath

Quel niveau s’applique ?
#

Le niveau le plus proche l’emporte : Local > Global > System > Default.

Si nous avons défini un paramètre au niveau d’un dépôt (local), c’est celui-ci qui s’applique.
Sinon, le paramètre au niveau global et ainsi de suite.

En l’absence de paramétrage spécifique, c’est la valeur par défaut qui s’applique : .git/hooks dans le dépôt en cours.

Désactiver les crochets (hooks)
#

En cas de besoin, il suffit d’indiquer le dossier /dev/null.

Ceci peut être utile lorsque nous voulons exécuter une commande précise sans déclencher les scripts qui devraient en principe être exécutés :

1
git -c core.hooksPath=/dev/null ...

Au plaisir,

Marc JESTIN
https://marcjestin.fr


Documentation officielle : https://git-scm.com/docs/git-config#Documentation/git-config.txt-corehooksPath.