Hooks (pre-commit & pre-push)
💡 Sujet
Les Git Hooks sont des scripts qui s'exécutent automatiquement avant ou après certaines commandes Git (commit, push, merge, etc.).
Ils sont extrêmement utiles pour garantir la qualité du code :
- Si le script réussit (exit code
0), l'action Git continue. - Si le script échoue (exit code
1ou plus), l'action Git est annulée (le commit n'est pas créé ou le push ne part pas).
🛑 Le principe
Les hooks se trouvent dans le dossier .git/hooks/ de votre projet. Ce sont de simples scripts exécutables (Bash, Python, Ruby, etc.).
Pour activer un hook, il suffit de créer un fichier (sans extension) portant le nom de l'événement (ex: pre-commit) et de le rendre exécutable (chmod +x .git/hooks/pre-commit).
🧹 pre-commit : Linting & Formatage
Le hook pre-commit se lance juste avant que le commit ne soit finalisé. C'est l'endroit idéal pour vérifier le style du code (Linter) ou formater automatiquement.
Cas d'usage typique : Empêcher de commiter du code mal indenté ou avec des erreurs de syntaxe.
Exemple de script .git/hooks/pre-commit :
#!/bin/sh
echo "🔍 Exécution du Linter..."
# Lancer votre commande de linter (ex: eslint, flake8, ktlint...)
npm run lint
# Récupérer le code de retour de la commande précédente
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "❌ Échec du Linter. Commit annulé."
exit 1 # Bloque le commit
fi
echo "✅ Linter OK."
exit 0🧪 pre-push : Tests Unitaires
Le hook pre-push se lance juste avant d'envoyer les modifications vers le dépôt distant (origin). Comme les tests unitaires peuvent être longs, il est souvent préférable de les mettre ici plutôt qu'au pre-commit.
Cas d'usage typique : Empêcher de casser la CI/CD ou la branche distante.
Exemple de script .git/hooks/pre-push :
#!/bin/sh
echo "🧪 Exécution des Tests Unitaires..."
# Lancer vos tests (ex: pytest, gradlew test, npm test...)
npm run test
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "❌ Échec des tests. Push annulé."
exit 1 # Bloque le push
fi
echo "✅ Tests OK."
exit 0🔓 Ignorer les hooks (--no-verify)
Parfois, vous avez besoin de commiter un "Work In Progress" (WIP) rapide ou de pusher une branche de test sans passer par toutes les validations.
Vous pouvez contourner les hooks pre-commit et pre-push avec l'option --no-verify (ou -n) :
# Ignorer le pre-commit
git commit -m "wip: save work" --no-verify
# Ignorer le pre-push
git push --no-verify⚠️ Attention : À utiliser avec parcimonie, car vous retirez votre filet de sécurité.
🧩 Résumé
- pre-commit : Idéal pour les Linters et vérifications rapides. Bloque la création du commit si échec.
- pre-push : Idéal pour les Tests Unitaires (plus longs). Bloque l'envoi vers le serveur si échec.
- Blocage : Tout script qui retourne un
exit code != 0annule l'action Git. - Contournement : Utilisez
git commit --no-verifyougit push --no-verifypour forcer l'action.