Git 🌙
Chapters â–Ÿ 2nd Edition

8.3 Personnalisation de Git - Crochets Git

Crochets Git

Comme de nombreux autres systĂšmes de gestion de version, Git dispose d’un moyen de lancer des scripts personnalisĂ©s quand certaines actions importantes ont lieu. Il y a deux groupes de crochets : ceux cĂŽtĂ© client et ceux cĂŽtĂ© serveur. Les crochets cĂŽtĂ© client concernent les opĂ©rations de client telles que la validation et la fusion. Les crochets cĂŽtĂ© serveur concernent les opĂ©rations de serveur Git telles que la rĂ©ception de commits. Vous pouvez utiliser ces crochets pour toutes sortes de fonctions.

Installation d’un crochet

Les crochets sont tous stockĂ©s dans le sous-rĂ©pertoire hooks du rĂ©pertoire Git. Dans la plupart des projets, c’est .git/hooks. Par dĂ©faut, Git popule ce rĂ©pertoire avec quelques scripts d’exemple dĂ©jĂ  utiles par eux-mĂȘmes ; mais ils servent aussi de documentation sur les paramĂštres de chaque script. Tous les exemples sont des scripts shell avec un peu de Perl mais n’importe quel script exĂ©cutable nommĂ© correctement fonctionnera. Vous pouvez les Ă©crire en Ruby ou Python ou ce que vous voudrez. Pour les versions de Git postĂ©rieures Ă  1.6, ces fichiers crochet d’exemple se terminent en .sample et il faudra les renommer. Pour les versions de Git antĂ©rieures Ă  1.6, les fichiers d’exemple sont nommĂ©s correctement mais ne sont pas exĂ©cutables.

Pour activer un script de crochet, placez un fichier dans le sous-rĂ©pertoire hook de votre rĂ©pertoire Git, nommĂ© correctement et exĂ©cutable. À partir de ce moment, il devrait ĂȘtre appelĂ©. Abordons donc les noms de fichiers de crochet les plus importants.

Crochets cÎté client

Il y a de nombreux crochets cÎté client. Ce chapitre les classe entre crochets de traitement de validation, scripts de traitement par courriel et le reste des scripts cÎté client.

Note

Il est important de noter que les crochets cĂŽtĂ© client ne sont pas copiĂ©s quand le dĂ©pĂŽt est clonĂ©. Si vous avez l’intention d’utiliser ces scripts pour faire respecter une politique de validation, il vaut mieux utiliser des crochets cĂŽtĂ© serveur, comme Exemple de politique gĂ©rĂ©e par Git.

Crochets de traitement de validation

Les quatre premiers crochets ont trait au processus de validation.

Le crochet pre-commit est lancĂ© en premier, avant mĂȘme que vous ne saisissiez le message de validation. Il est utilisĂ© pour inspecter l’instantanĂ© qui est sur le point d’ĂȘtre validĂ©, pour vĂ©rifier si vous avez oubliĂ© quelque chose, pour s’assurer que les tests passent ou pour examiner ce que vous souhaitez inspecter dans le code. Un code de sortie non nul de ce crochet annule la validation, bien que vous puissiez le contourner avec git commit --no-verify. Vous pouvez rĂ©aliser des actions telles qu’une vĂ©rification de style (en utilisant lint ou un Ă©quivalent), d’absence de blancs en fin de ligne (le crochet par dĂ©faut fait exactement cela) ou de documentation des nouvelles mĂ©thodes.

Le crochet prepare-commit-msg est appelĂ© avant que l’éditeur de message de validation ne soit lancĂ© mais aprĂšs que le message par dĂ©faut a Ă©tĂ© crĂ©Ă©. Il vous permet d’éditer le message par dĂ©faut avant que l’auteur ne le voit. Ce crochet accepte quelques options : le chemin du fichier qui contient le message de validation actuel, le type de validation et le SHA-1 du commit si c’est un commit amendĂ©. Ce crochet ne sert gĂ©nĂ©ralement Ă  rien pour les validations normales. Par contre, il est utile pour les validations oĂč le message par dĂ©faut est gĂ©nĂ©rĂ©, tel que les modĂšles de message de validation, les validations de fusion, les commits Ă©crasĂ©s ou amendĂ©s. Vous pouvez l’utiliser en conjonction avec un modĂšle de messages pour insĂ©rer de l’information par programme.

Le crochet commit-msg accepte un paramĂštre qui est encore le chemin du fichier temporaire qui contient le message de validation actuel. Si ce script sort avec un code de sortie non nul, Git abandonne le processus de validation, ce qui vous permet de vĂ©rifier l’état de votre projet ou du message de validation avant de laisser passer un commit. Dans la derniĂšre section de ce chapitre, l’utilisation de ce crochet permettra de vĂ©rifier que le message de validation est conforme Ă  un format obligatoire.

AprĂšs l’exĂ©cution du processus complet de validation, le crochet post-commit est appelĂ©. Il n’accepte aucun argument mais vous pouvez facilement accĂ©der au dernier commit grĂące Ă  git log -1 HEAD. GĂ©nĂ©ralement, ce script sert Ă  rĂ©aliser des notifications ou des choses similaires.

Crochets de gestion courriel

Vous pouvez rĂ©gler trois crochets cĂŽtĂ© client pour la gestion Ă  base de courriel. Ils sont tous invoquĂ©s par la commande git am, donc si vous n’ĂȘtes pas habituĂ© Ă  utiliser cette commande dans votre mode de gestion, vous pouvez simplement passer la prochaine section. Si vous acceptez des patchs prĂ©parĂ©s par git format-patch par courriel, alors certains de ces crochets peuvent vous ĂȘtre trĂšs utiles.

Le premier crochet lancĂ© est applypatch-msg. Il accepte un seul argument : le nom du fichier temporaire qui contient le message de validation proposĂ©. Git abandonne le patch si ce script sort avec un code non nul. Vous pouvez l’utiliser pour vĂ©rifier que le message de validation est correctement formatĂ© ou pour normaliser le message en l’éditant sur place par script.

Le crochet lancĂ© ensuite lors de l’application de patchs via git am s’appelle pre-applypatch. Il n’accepte aucun argument et son nom est trompeur car il est lancĂ© aprĂšs que le patch a Ă©tĂ© appliquĂ©, ce qui vous permet d’inspecter l’instantanĂ© avant de rĂ©aliser la validation. Vous pouvez lancer des tests ou inspecter l’arborescence active avec ce script. S’il manque quelque chose ou que les tests ne passent pas, un code de sortie non nul annule la commande git am sans valider le patch.

Le dernier crochet lancĂ© pendant l’opĂ©ration git am s’appelle post-applypatch. Vous pouvez l’utiliser pour notifier un groupe ou l’auteur du patch que vous venez de l’appliquer. Vous ne pouvez plus arrĂȘter le processus de validation avec ce script.

Autres crochets cÎté client

Le crochet pre-rebase est invoquĂ© avant que vous ne rebasiez et peut interrompre le processus s’il sort avec un code d’erreur non nul. Vous pouvez utiliser ce crochet pour empĂȘcher de rebaser tout commit qui a dĂ©jĂ  Ă©tĂ© poussĂ©. C’est ce que fait le crochet d’exemple pre-rebase que Git installe, mĂȘme s’il fait des hypothĂšses qui peuvent ne pas correspondre avec votre façon de faire.

Le crochet post-rewrite est lancĂ© par les commandes qui remplacent les commits, comme git commit --amend et git rebase (mais pas par git filter-branch). Son seul argument est la commande qui a dĂ©clenchĂ© la rĂ©Ă©criture, et il reçoit une liste de rĂ©Ă©critures sur stdin. Ce crochet a beaucoup des mĂȘmes utilisations que les crochets post-checkout et post-merge.

AprĂšs avoir effectuĂ© avec succĂšs un git checkout, le crochet post-checkout est lancĂ©. Vous pouvez l’utiliser pour paramĂ©trer correctement votre environnement projet dans votre copie de travail. Cela peut signifier y dĂ©placer des gros fichiers binaires que vous ne souhaitez pas voir en gestion de source, gĂ©nĂ©rer automatiquement la documentation ou quelque chose dans le genre.

Le crochet post-merge s’exĂ©cute Ă  la suite d’une commande merge rĂ©ussie. Vous pouvez l’utiliser pour restaurer certaines donnĂ©es non gĂ©rĂ©es par Git dans la copie de travail telles que les informations de permission. Ce crochet permet mĂȘme de valider la prĂ©sence de fichiers externes au contrĂŽle de Git que vous pourriez souhaiter voir recopiĂ©s lorsque la copie de travail change.

Le crochet pre-push est lancĂ© pendant un git push, aprĂšs la mise Ă  jour des rĂ©fĂ©rences distantes mais avant le transfert des objets. Il reçoit le nom et l’emplacement du dĂ©pĂŽt distant en paramĂštre et une liste des rĂ©fĂ©rences qui seront mises Ă  jour sur stdin. Il peut servir Ă  valider un ensemble de mises Ă  jour de rĂ©fĂ©rences avant que la poussĂ©e n’ait rĂ©ellement lieu (la poussĂ©e est abandonnĂ©e sur un code de sortie non nul).

Git lance de temps Ă  autre le ramasse-miettes au cours de son fonctionnement en invoquant git gc --auto. Le crochet pre-auto-gc est invoquĂ© juste avant le dĂ©marrage du ramasse-miettes et peut ĂȘtre utilisĂ© pour vous en notifier ou pour annuler le ramasse-miettes si le moment ne s’y prĂȘte pas.

Crochets cÎté serveur

En complĂ©ment des crochets cĂŽtĂ© client, vous pouvez utiliser comme administrateur systĂšme quelques crochets cĂŽtĂ© serveur pour appliquer quasiment toutes les rĂšgles de votre projet. Ces scripts s’exĂ©cutent avant et aprĂšs chaque poussĂ©e sur le serveur. Les crochets pre peuvent rendre un code d’erreur non nul Ă  tout moment pour rejeter la poussĂ©e et afficher un message d’erreur au client. Vous pouvez mettre en place des rĂšgles aussi complexes que vous le souhaitez.

pre-receive

Le premier script lancĂ© lors de la gestion d’une poussĂ©e depuis un client est pre-receive. Il accepte une liste de rĂ©fĂ©rences lues sur stdin. S’il sort avec un code d’erreur non nul, aucune n’est acceptĂ©e. Vous pouvez utiliser ce crochet pour rĂ©aliser des tests tels que s’assurer que toutes les rĂ©fĂ©rences mises Ă  jour le sont en avance rapide ou pour s’assurer que l’utilisateur dispose bien des droits de crĂ©ation, poussĂ©e, destruction ou de lecture des mises Ă  jour pour tous les fichiers qu’il cherche Ă  mettre Ă  jour dans cette poussĂ©e.

update

Le script update est trĂšs similaire au script pre-receive, Ă  la diffĂ©rence qu’il est lancĂ© une fois par branche qui doit ĂȘtre modifiĂ©e lors de la poussĂ©e. Si la poussĂ©e s’applique Ă  plusieurs branches, pre-receive n’est lancĂ© qu’une fois, tandis qu'`update` est lancĂ© une fois par branche impactĂ©e. Au lieu de lire Ă  partir de stdin, ce script accepte trois arguments : le nom de la rĂ©fĂ©rence (branche), le SHA-1 du commit pointĂ© par la rĂ©fĂ©rence avant la poussĂ©e et le SHA-1 que l’utilisateur est en train de pousser. Si le script update se termine avec un code d’erreur non nul, seule la rĂ©fĂ©rence est rejetĂ©e. Les autres rĂ©fĂ©rences pourront ĂȘtre mises Ă  jour.

post-receive

Le crochet post-receive est lancĂ© aprĂšs l’exĂ©cution complĂšte du processus et peut ĂȘtre utilisĂ© pour mettre Ă  jour d’autres services ou pour notifier des utilisateurs. Il accepte les mĂȘmes donnĂ©es sur stdin que pre-receive. Il peut par exemple envoyer un courriel Ă  une liste de diffusion, notifier un serveur d’intĂ©gration continue ou mettre Ă  jour un systĂšme de suivi de tickets. Il peut aussi analyser les messages de validation Ă  la recherche d’ordres de mise Ă  jour de l’état des tickets. Ce script ne peut pas arrĂȘter le processus de poussĂ©e mais le client n’est pas dĂ©connectĂ© tant qu’il n’a pas terminĂ©. Il faut donc ĂȘtre prudent Ă  ne pas essayer de lui faire rĂ©aliser des actions qui peuvent durer longtemps.

Astuce

Si vous Ă©crivez un script/crochet que d’autres devront lire, prĂ©fĂ©rez les versions longues des drapeaux de ligne de commande ; six mois plus tard, vous nous remercierez.

scroll-to-top