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