Passer au contenu
GitTree
Modifications et commits

Utilisez les hooks Git pour vérifier votre travail avant qu'il ne quitte votre ordinateur

Un hook Git est un script que Git exécute tout seul à un moment précis, par exemple juste avant un commit ou un push. Dans Preferences › Hooks, GitTree montre ce qui s'exécute quand, vous permet d'ajouter des hooks à partir de modèles prêts à l'emploi, de les modifier et de les tester, de les désactiver et de les réactiver et de les partager avec votre équipe via le référentiel.

GratuitMis à jour

Fonctionne dans GitTree Gratuit : toutes les fonctionnalités Git locales, sans compte requis.

Sur cette page
  1. Avant de commencer
  2. Où le trouver
  3. Mesures
  4. Résultat attendu
  5. Que sont les crochets et pourquoi les utiliser
  6. Les crochets que vous utiliserez le plus
  7. Modèles prêts à l'emploi
  8. À quoi sert un test
  9. Partagez des hooks avec votre équipe
  10. Passer les hooks pour un commit
  11. Si quelque chose ne va pas
  12. Questions
  13. En rapport

Avant de commencer

  • Un référentiel est ouvert : les hooks appartiennent à un seul référentiel.
  • Le référentiel est fiable. En mode restreint, Git n'exécute aucun de ses hooks ; vous pouvez toujours les lire et les modifier (repository trust).
  • Les hooks sont des scripts shell. Les modèles utilisent le simple sh, que macOS, Windows (via Git for Windows) et Linux fournissent tous.

Où le trouver

  • La boîte de validation : sous le bouton de validation, May run: … répertorie les hooks qu'un commit exécute. Manage Hooks ouvre la page.
  • Tools dans la barre d'outils ou dans la section TOOLS du panneau de gauche : Git hooks.
  • Le menu de l'onglet Dépôt, ou la palette de commandes : Manage Git Hooks…, ou Alt+Shift+H.
  • Preferences (Mod+,) › Hooks. La recherche dans les préférences de « hooks », « pre-commit » ou « husky » le trouve également.
ActionmacOSWindows et Linux
Gérer les hooks Git⌥⇧HAlt+Shift+H
Ouvrir les préférences⌘,Ctrl+,

Mesures

  1. Ouvrir la page Hooks

    Utilisez Manage Hooks sous le bouton de validation ou Alt+Shift+H. Avec plusieurs référentiels ouverts, choisissez-en un dans Repository. La page commence par ce que sont les hooks, un guide How it works en trois étapes et un lien vers cet article.

  2. Lisez ce qui s'exécute quand

    What runs when affiche le flux de validation (pre-commit, prepare-commit-msg, commit-msg, post-commit) et le flux push (pre-push). Chaque étape indique Runs, Off, Not executable ou No hook, et s'il s'agit de Can stop the action ou uniquement de rapports.

    Préférences Hooks pour lumen, avec What runs when et le hook commit-msg marqué comme non exécutable
    La page nomme les hooks que Git peut exécuter lors de la validation et du push, et propose le partage via .githooks.Interface GitTree avec un référentiel de démonstration.
  3. Ajouter un crochet

    Appuyez sur Add Hook…. Sous When it runs, choisissez le crochet ; sous Start from, choisissez un modèle, Git’s sample ou Empty script. L'aperçu Script montre exactement ce qui sera écrit. Create Hook écrit le fichier, prêt à être exécuté, et l'ouvre dans l'éditeur.

  4. Modifier le script

    Edit ouvre le script avec les numéros de ligne. Modifiez-le et appuyez sur Save (ou Mod+S). Si le fichier a changé sur le disque depuis que vous l'avez ouvert, GitTree refuse de l'écraser et conserve votre texte afin que vous puissiez le rouvrir et le comparer.

  5. Testez-le

    Test Run exécute le hook maintenant, comme le ferait Git, sans effectuer de validation ni de push. Pour commit-msg et prepare-commit-msg, saisissez un message à vérifier. La sortie est diffusée et le résultat indique ce que Git ferait : Passed with exit code 0: Git would continue. ou Failed with exit code 1: Git would stop here. Stop met fin à une longue exécution.

  6. Éteignez un crochet ou partagez-le

    Le commutateur à côté d'un hook le désactive en le renommant <name>.disabled, puis le rallume ; rien n'est supprimé. Share Through .githooks place les hooks dans le référentiel de votre équipe (voir ci-dessous).

Résultat attendu

À partir du prochain commit ou push, Git exécute les hooks marqués Runs. La ligne May run: … de la boîte de validation les nomme, et la sortie d'un hook apparaît sous Hook output lorsqu'il imprime quelque chose ou arrête la validation.

Que sont les crochets et pourquoi les utiliser

Git recherche les fichiers exécutables avec des noms fixes dans le dossier hooks (.git/hooks sauf indication contraire de core.hooksPath) et les exécute aux moments correspondants. Un hook qui s'exécute avant une action, telle que pre-commit ou pre-push, peut l'arrêter en quittant avec un statut différent de zéro. Un hook qui s'exécute après, tel que post-commit ou post-merge, ne peut que signaler.

  • Détectez les erreurs avant qu'elles ne quittent votre ordinateur : échecs de tests, erreurs de peluches, marqueurs de conflit restants et fichiers surdimensionnés.
  • Gardez les messages de validation cohérents, par exemple Conventional Commits ou une clé de problème dans chaque message.
  • Obtenez des commentaires en quelques secondes, au lieu d’attendre l’échec d’une exécution de CI.
  • Donnez à toute l’équipe les mêmes contrôles en conservant les hooks dans le référentiel.

Les crochets que vous utiliserez le plus

Hooks courants côté client
CrochetQuand Git l'exécuteUtilisation typique
pre-commitAvant la création du commitTests de charpie et rapides sur ce qui est indexé ; bloquer les commits sur main
prepare-commit-msgAvant que le message soit écritMettez la clé du problème du nom de la branche dans le message
commit-msgUne fois le message écritVérifiez le format du message, tel que Conventional Commits
post-commitUne fois le commit crééNotifier ou enregistrer ; impossible d'annuler le commit
pre-pushAvant que quoi que ce soit soit envoyé à le dépôt distantExécutez la suite de tests complète ; refuser les poussées vers les branches protégées
post-mergeAprès une fusion ou une extractionDites quand un fichier de verrouillage a été modifié pour que les dépendances soient réinstallées
post-checkoutAprès avoir changé de brancheNettoyer la sortie de build ou actualiser les fichiers générés

Les hooks de serveur tels que pre-receive et update s'exécutent uniquement sur un serveur qui reçoit des push. GitTree les répertorie lorsqu'ils sont présents mais ne les teste jamais.

Modèles prêts à l'emploi

Modèles dans Ajouter un crochet
ModèleCrochetCe que ça fait
Protéger les branches principalespre-commitArrête les commits effectués directement sur main ou master
Attrapez les marqueurs de conflit et les espacespre-commitArrête un commit qui ajoute des marqueurs de conflit restants ou des espaces de fin (git diff --cached --check)
Bloquer les gros fichierspre-commitArrête un commit qui ajoute un fichier de plus de 5 Mo
Ajouter la clé du problèmeprepare-commit-msgCommence chaque message avec la clé de problème dans le nom de la branche, par exemple ABC-123
Conventional Commitscommit-msgNécessite des résumés tels que feat(parser): accept empty lines
Exécuter des tests avant de pousserpre-pushExécute npm test, cargo test, go test, pytest ou make test, et arrête la poussée en cas d'échec
Protéger les branches distantespre-pushArrête de pousser directement vers le principal ou le maître sur le dépôt distant
Rappel de dépendancepost-mergeIndique quand un fichier de verrouillage a été modifié après une extraction ou une fusion

Chaque modèle est un script ordinaire avec ses paramètres en haut, tels que PROTECTED="main master" ou TEST_COMMAND="". Modifiez-les dans l'éditeur pour les adapter à votre projet.

À quoi sert un test

GitTree exécute le hook via git hook run, afin que Git le trouve et le démarre exactement comme il le ferait lors de l'action réelle, y compris core.hooksPath. Le hook reçoit une entrée inventée :

  • pre-commit, pre-merge-commit, post-commit et pre-auto-gc : aucun argument.
  • commit-msg et prepare-commit-msg : un fichier temporaire contenant le message que vous avez tapé, supprimé par la suite.
  • pre-push : le nom et l'URL de votre dépôt distant push, sans branche sur son entrée.
  • post-merge : 0, comme après une fusion normale.

Partagez des hooks avec votre équipe

Les hooks dans .git/hooks ne sont jamais validés, donc chaque clone a le sien. Share Through .githooks les copie dans un dossier .githooks du référentiel et y définit core.hooksPath dans la configuration de ce référentiel. Validez le dossier ; chaque coéquipier l'exécute ensuite une fois après le clonage :

git config core.hooksPath .githooks

Use This Clone’s Own Hooks supprime à nouveau ce paramètre. Le dossier .githooks et vos hooks dans .git/hooks restent là où ils se trouvent.

Passer les hooks pour un commit

Ouvrez Commit Options dans la zone de validation et activez Skip Hooks (--no-verify). Git ignore ensuite pre-commit et commit-msg pour ce commit ; prepare-commit-msg et post-commit sont toujours exécutés, et la ligne sous le bouton de validation l'indique. Pour arrêter un hook plus longtemps, désactivez-le sur la page Hooks.

Si quelque chose ne va pas

Un hook affiche Not executable et ne s'exécute jamais.

Sur macOS et Linux, Git ignore un fichier hook sans l'autorisation d'exécution. Appuyez sur Make Executable ; GitTree l'ajoute uniquement là où le fichier est lisible.

"Le hook a changé sur le disque depuis son ouverture ; rouvrez-le pour voir le nouveau contenu."

Un autre programme ou un gestionnaire de hooks a réécrit le fichier. Fermez l'éditeur, rouvrez-le et appliquez votre modification au nouveau contenu.

"Ce hook est un lien. GitTree n'écrit jamais via un lien ; modifiez le fichier vers lequel il pointe."

Le hook est un lien symbolique, souvent créé par un gestionnaire de hook. Modifiez le fichier vers lequel il pointe ou la configuration de cet outil.

Le script fonctionne sur macOS mais échoue sur Linux avec des erreurs « mauvais interprète » ou \ .

Le fichier comporte Windows fins de ligne (CRLF). L'éditeur met en garde contre eux ; enregistrez le script avec les fins de ligne LF.

Test Run est grisé.

Sa raison est à côté du bouton : faites confiance au référentiel, activez le hook, rendez-le exécutable ou notez que ce hook ne reçoit des entrées que pendant l'opération réelle de Git.

Questions

Les hooks font-ils partie du plan Free ?

Oui. La gestion, l'édition, l'exécution de tests et le partage des hooks s'effectuent via Git local et ne nécessitent aucun compte d'hébergement.

Est-ce que GitTree supprime un hook lorsque je le désactive ?

Non. La désactivation renomme le fichier en <name>.disabled ; la mise sous tension le renomme. GitTree ne supprime jamais un hook.

Un hook que je crée sera-t-il validé ?

Pas tant qu'il est dans .git/hooks. Utilisez Share Through .githooks pour conserver les hooks dans le référentiel, où ils sont validés comme n'importe quel autre fichier.

Un hook peut-il être écrit en Node.js ou en Python ?

Oui. Git exécute le fichier avec le programme sur sa première ligne, tel que #!/usr/bin/env node ; l'éditeur affiche ce programme comme Runs with node. Le programme doit être installé sur chaque ordinateur qui exécute le hook.