Nous aimerions créer quelques scripts de base que nous pourrons tous partager, par exemple pour le pré-formatage des messages de validation. Git a des scripts de hook pour cela qui sont normalement stockés sous <project>/.git/hooks/
. Cependant, ces scripts ne sont pas propagés lorsque les utilisateurs font un clone et ils ne sont pas contrôlés par la version.
Existe-t-il un bon moyen d'aider tout le monde à obtenir les bons scripts de hook? Puis-je simplement faire en sorte que ces scripts de raccordement pointent vers des scripts à contrôle de version dans mon référentiel?
Théoriquement, vous pouvez créer un répertoire hooks
(ou le nom de votre choix) dans le répertoire de votre projet avec tous les scripts, puis les associer à .git/hooks
. Bien entendu, chaque personne ayant cloné le référentiel devrait configurer ces liens symboliques (bien que vous puissiez être vraiment chic et avoir un script de déploiement que le cloneur pourrait exécuter pour les configurer de manière semi-automatique).
Pour faire le lien symbolique sur * nix, tout ce que vous avez à faire est:
root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"
utilisation ln -sf
si vous êtes prêt à écraser le contenu de .git/hooks
Dans Git 2.9 , l'option de configuration core.hooksPath
spécifie un répertoire de points d'ancrage personnalisé.
Déplacez vos crochets vers un répertoire hooks
suivi dans votre référentiel. Ensuite, configurez chaque instance du référentiel pour utiliser le suivi hooks
au lieu de $GIT_DIR/hooks
:
git config core.hooksPath hooks
En général, le chemin peut être absolu ou relatif au répertoire dans lequel les hooks sont exécutés (généralement la racine de l’arbre de travail; voir la section DESCRIPTION de man githooks
).
Si votre projet est un projet JavaScript et que vous utilisez npm
comme gestionnaire de paquets, vous pouvez utiliser shared-git-hooks pour appliquer des githooks sur npm install
.
Que diriez-vous de git-hooks , il route .git/hooks
appeler dans le script sous le répertoire du projet githooks
.
Il existe également de nombreuses fonctionnalités pour vous permettre de minimiser les liens de copie et de lien symbolique.
La plupart des langages de programmation modernes, ou plutôt leurs outils de construction, supportent les plugins pour gérer les hooks git. Cela signifie que tout ce que vous avez à faire est de configurer votre package.json, pom.xml, etc., et tout membre de votre équipe n'aura d'autre choix que de s'y conformer à moins de modifier le fichier de construction. Le plugin ajoutera du contenu au répertoire .git pour vous.
Exemples:
Nous utilisons des solutions Visual Studio (et donc des projets) comportant des événements pré et post-build. J'ajoute un projet supplémentaire appelé 'GitHookDeployer'. Le projet modifie lui-même un fichier dans l'événement de post-génération. Ce fichier est configuré pour être copié dans le répertoire de construction. Ainsi, le projet est construit à chaque fois et n'est jamais ignoré. Dans l'événement de construction, il s'assure également que tous les hooks Git sont en place.
Notez qu'il ne s'agit pas d'une solution générale, car certains projets n'ont bien entendu rien à construire.
Vous pouvez transformer votre dossier hooks en un autre référentiel git et le lier en tant que sous-module ... Cela ne vaut le coup que si vous avez beaucoup de membres et que les hooks sont modifiés régulièrement.
Vous pouvez utiliser une solution gérée pour la gestion des points d'ancrage avant la validation, par exemple pré-validation . Ou une solution centralisée pour les git-hooks côté serveur comme Datree.io . Il a des politiques intégrées comme:
Il ne remplacera pas tous vos points d'ancrage, mais il pourrait aider vos développeurs à résoudre les problèmes les plus évidents sans avoir à installer des points d'ancrage sur tous les ordinateurs/référents de développeurs.
Disclaimer: Je suis l'un des fondateurs de Datrees
Pour les utilisateurs de Nodejs , une solution simple consiste à mettre à jour package.json avec
{
"name": "name",
"version": "0.0.1",
......
"scripts": {
"preinstall": "git config core.hooksPath hooks",
Le préinstallation sera exécuté avant
npm installer
et redirige git pour rechercher des points d'ancrage dans le répertoire .\hooks (ou le nom de votre choix). Ce répertoire doit imiter . \. Git\hooks en termes de nom de fichier (moins le .sample) et de structure.
Imagine Maven et les autres outils de compilation auront un équivalent de préinstallation.
Cela devrait également fonctionner sur toutes les plateformes.
Si vous avez besoin de plus d’informations, voyez https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/
Idéalement, les hooks sont écrits en bash, si vous suivez les exemples de fichiers. Mais vous pouvez l'écrire dans n'importe quelle langue disponible et assurez-vous simplement qu'il possède le drapeau exécutable.
Ainsi, vous pouvez écrire un code Python ou Go pour atteindre vos objectifs et le placer dans le dossier des crochets. Cela fonctionnera, mais il ne sera pas géré avec le référentiel.
Deux options
a) Scripts multiples
Vous pouvez coder vos crochets dans votre aide et ajouter un petit fragment de code à ces crochets pour appeler votre script parfait, comme ceci:
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js
b) Script unique
Une option plus cool consiste à ajouter un seul script pour les gouverner tous, au lieu de plusieurs. Donc, vous créez un hooks/mysuperhook.go et pointez chaque hook que vous voulez avoir.
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)
Le paramètre fournira à votre script quel hook a été déclenché et vous pouvez le différencier dans votre code. Pourquoi? Parfois, vous voudrez peut-être exécuter le même contrôle pour commit et Push, par exemple.
Et ensuite?
Ensuite, vous voudrez peut-être disposer de fonctionnalités supplémentaires, telles que:
Cela peut-il être plus simple?
Oui, il existe plusieurs outils pour vous aider à gérer les git-hooks. Chacun d'entre eux est conçu pour aborder le problème sous un angle différent, et vous devrez peut-être tous les comprendre pour choisir celui qui vous convient le mieux, à vous ou à votre équipe. GitHooks.com propose de nombreux ouvrages sur l’accrochage et plusieurs outils disponibles à ce jour.
À ce jour, 21 projets y sont répertoriés avec différentes stratégies pour gérer les hooks git. Certains ne le font que pour un seul crochet, d'autres pour une langue spécifique, etc.
L'un de ces outils, que j'ai écrit et proposé gratuitement en tant que projet opensource, s'appelle hooks4git . Il est écrit en Python (parce que je l’aime bien)), mais l’idée est de gérer tous les éléments énumérés ci-dessus dans un seul fichier de configuration appelé .hooks4git.ini, qui réside dans votre référentiel et peut appeler n'importe quel utilisateur. script que vous souhaitez appeler, dans n'importe quelle langue.
Utiliser des hameçons Git est absolument fantastique, mais la façon dont ils sont proposés ne fait généralement qu’écarter les gens.
pre-commit
facilite les choses pour les hooks de pré-validation. Ne répond pas à la question du PO sur la gestion des hooks git arbitraires, mais les hooks de pré-validation sont probablement les plus fréquemment utilisés à des fins de qualité du code.