Un problème que l’on rencontre souvent lorsque l’on utilise git, est que l’on a du mal à avoir des messages de commits réguliers. On se retrouve souvent au début d’un projet à écrire des messages bien formatés type:

├── Écriture de la migration 'users'
├── Configuration de la base de données
├── Mise en place d'un fichier de configuration pour le projet
├── Initialisation du projet

Puis à la fin du projet nous avons des commits comme:

├── Mise à jour
├── Mise à jour
├── Tout fonctionne !
├── Mise à jour
├── Dernier commit
├── BLBL test 3
├── * Suppression console.log()

Et ça devient très vite l’enfer ! Aussi bien pour nous que pour les collaborateurs du projet. Et retrouver un commit précis dans ce bazar est compliqué à terme.

Introduction

La solution efficace est d’utiliser les ‘git hooks’.

GIT à un système qui lance un script lorsque l’on réalise des actions importantes avec. Les principaux hooks sont:

  • applypatch-msg

  • pre-commit

  • prepare-commit-msg

  • commit-msg

  • post-commit

  • post-checkout

  • pre-receive

  • update

  • post-update

Évidemment il y en a beaucoup d’autres, mais je ne les présenterai pas ici. Je vous conseille de lire la documentation si vous êtes curieux :D

Des hooks peuvent être mis en place côté client ou côté serveur !

Tous ces hooks de base se trouvent dans le répertoire $USER/.git/hooks.

Terminal window
.
├── applypatch-msg.sample
├── commit-msg.sample
├── fsmonitor-watchman.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-push.sample
├── pre-rebase.sample
├── pre-receive.sample
└── update.sample

Voici les hooks génériques que l’on peut utiliser.

Mise en place

Solution 1 - Hooks locaux

La première solution est d’aller là où est votre projet git. Le chemin est .git/hooks/. Ici vous retrouverez la liste des hooks mis en place uniquement pour ce projet courant.

Cette solution permet aussi d’installer un hook côté serveur, en initialisant un projet avec git init --bare, et d’aller également dans .git/hooks/.

Solution 2 - Mettre les scripts dans $HOME/.git/hooks/

La deuxième solution est d’ajouter des hooks dans le dossier $HOME/.git/hooks/. Les hooks sont ajoutés dès la prochaine commande git.

Solution 3 - Mettre les scripts dans un dossier personnalisé

Ma solution de mise en place est la suivante, j’ai ajouté dans le fichier $HOME/.gitconfig les lignes suivantes:

Terminal window
[core]
hooksPath = /home/$HOME/git/hooks

Cette solution a pour avantage d’être plus facilement exportable si vous avons nos hooks dans un endroit spécifique.

Documentation ‘hooksPath’

Cette ligne ajoute le répertoire de hooks. Puis nous pouvons créer le dossier correspondant dans /$HOME/git/hooks (ou dans le répertoire de votre choix).

Utilisation

Ici nous allons parler du hook commit-msg, mais cela fonctionne presque de la même manière pour les autres hooks.

Pour le hook en question, le script se lancera à chaque fois que mon utilisateur lancera un commit. Si ce script sort avec un code de sortie non nul, git abandonne le processus de validation, et le commit sera annulé.

Exemple de hooks

Voilà la partie intéressante ! Voici un exemple de git hooks commit-msg:

#!/bin/bash
msg=`cat $1`
regex="^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50}"
if [[! $msg =~ $regex]]; then
echo "Le regex n'est pas respecté:"
echo "$regex"
exit 1
fi
echo "$msg" > $1

Attention: n’oubliez pas d’ajouter les permissions nécessaires pour que votre hooks soit exécutable avec chmod ug+x .git/hooks/*

Si le message du commit ne correspond pas à l’expression régulière ci-dessus, alors git abandonnera la création du commit.

Ce script est inspiré de la convention de nommage d’AngularJS

Une autre chose rigolote que l’on peut faire avec est d’ajouter des émojis si le message du commit est formaté d’une certaine manière !

Terminal window
msg=`echo "$msg" | sed 's/:tada:/🎉/'`
msg=`echo "$msg" | sed 's/:revert:/⏳/'`
msg=`echo "$msg" | sed 's/:build:/📦/'`
msg=`echo "$msg" | sed 's/:ci:/🤖/'`
msg=`echo "$msg" | sed 's/:docs:/📖/'`
msg=`echo "$msg" | sed 's/:feat:/🌟/'`
msg=`echo "$msg" | sed 's/:fix:/🚑/'`
msg=`echo "$msg" | sed 's/:perf:/⚡/'`
msg=`echo "$msg" | sed 's/:refactor:/🚧/'`
msg=`echo "$msg" | sed 's/:style:/💄/'`
msg=`echo "$msg" | sed 's/:test:/✅/'`

De nombreuses pages sur github encouragent ce système de commit qui rend les choses plus attrayantes et visuelles.

Conclusion

Les hooks vous permettent de lancer des scripts lorsqu’une action git est effectuée. Cela fonctionne aussi bien côté client que serveur.

Vous pouvez utiliser de nombreux événements (cf: doc) afin d’automatiser le plus de tâches possible !

Vous êtes libre d’utiliser ce super pouvoir comme bon vous semble maintenant !


Articles recommandés