Lorsque vous versionnez du code en utilisant Git, vous avez la possibilité d'exécuter des scripts spécifiques lors d'évènements du cycle de vie de votre versioning, c'est ce que l'on appelle des "hooks".

Git propose de nombreux hooks, notamment deux qui vont nous intéresser ici :

  • avant un commit local (pre-commit)
  • avant un push vers un serveur distant (pre-push)
Je vous invite à lire la documentation officielle si vous désirez vous renseigner sur tous les hooks disponibles

Le principe est simple, chaque hook est un script qui sera appelé par Git. Si le script en question retourne un code 0 (tout s'est bien passé) alors Git poursuivra son action en cours, si le script retourne un code 1 (erreur), alors l'évènement sera annulé.

Un hook de pre-commit peut par exemple servir à :

  • Être sûr que tous les tests passent bien
  • Exécuter un linter
  • Vérifier le code coverage
  • ...
Selon votre use case, vous pouvez utiliser un hook de pre-commit ou de pre-push, je recommande personnellement de favoriser le premier mais c'est à vous de voir !

Créer un hook pre-commit à la main

Lorsque vous initialisez votre dépôt Git, ce dernier ajoute des scripts d'exemple pour vous vous montrer la marche à suivre dans le dossier /.git/hooks/*.sample

Pour créer votre premier hook de pre-commit, vous pouvez simplement renommer le fichier pre-commit.sample en pre-commit.

Attention pour les utilisateurs de Linux et MacOS, il faudra penser à ajouter les droits d'exécution au fichier.

Le fichier d'exemple contient un script qui vérifie si les noms des fichiers ne contiennent pas de caractères non-ASCII, et annule le commit si c'est le cas, mais libre à vous de créer le votre.

Voilà le template minimal d'un fichier pre-commit :

#!/bin/sh

if [ ... ]
then
  echo "Pre-commit hook failed because..."
  exit 1
fi

echo "Pre-commit hook executed successfully"
exit 0
Une fois votre script fonctionnel, il ne vous restera plus qu'à essayer de créer un commit et voir votre hook s'exécuter !

Créer un hook de pre-commit avec NPM

Je travaille personnellement dans un environnement NodeJS, et je ne suis pas un expert des scripts bash, j'ai donc trouvé une solution pour gérer mon workflow de pre-commit directement avec NPM.

Cela permet en plus de partager mon hook avec les autres développeurs du projet, car sinon le dossier /.git/ n'est pas versionné.

Pour celà, il vous suffit d'installer le paquet NPM appelé "pre-commit" :

$ npm install pre-commit --save-dev

Et il ne vous restera plus qu'à indiquer le nom des scripts qui devront s'exécuter avec succès avant le commit, directement dans le fichier package.json :

{
  ...
  "scripts": {
    "test": "mocha -R spec tests/index.js --exit",
    "coverage": "nyc --reporter=text",
    "format": "prettier --write ./src"
  },
  "pre-commit": [
    "format",
    "test",
    "coverage"
  ],
  ...
}

Attention, si votre hook ne s'exécute pas, veillez bien à avoir installé le module après avoir initialisé votre dépôt Git, sinon il ne trouvera pas le dossier des hooks et échouera silencieusement.

Vous pouvez retrouver la documentation officielle du module directement sur GitHub : https://github.com/observing/pre-commit

J'espère que cet article vous aura été utile, et à bientôt sur le blog !

Les articles les plus populaires du blog

Envie de continuer à lire des articles autour du développement web (entre autres) ? Voici la sélection des articles de mon blog les plus lus par la communauté !

Voir la sélection 🚀

Recevez les articles de la semaine par e-mail pour ne rien manquer !

S'abonner à la newsletter 📧

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage d'expériences et de connaissances.

Aujourd'hui je suis aussi coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et être tenu au courant de mes projets !


Photo par Gunnar Ridderström sur Pexels