Question

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 raccordement 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?

Était-ce utile?

La solution

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 créer un lien symbolique entre eux dans .git/hooks. Bien entendu, chaque personne ayant cloné le référentiel devra 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"

utilisez ln -sf si vous êtes prêt à écraser ce qu'il y a dedans <=>

Autres conseils

Dans Git 2.9 , le L’option de configuration core.hooksPath spécifie un répertoire de points d'ancrage personnalisés.

Déplacez vos points d'ancrage vers un répertoire hooks suivi dans votre référentiel. Ensuite, configurez chaque instance du référentiel pour utiliser le suivi $GIT_DIR/hooks au lieu de man githooks:

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 <=> ).

Si votre projet est un projet JavaScript et que vous utilisez npm en tant que gestionnaire de packages, vous pouvez utiliser shared. -git-hooks pour appliquer des githooks sur npm install.

Que diriez-vous de git-hooks , il route .git/hooks invoquer dans le script sous répertoire du projet githooks.

De nombreuses fonctionnalités vous permettent également de réduire au minimum 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:

https://github.com/olukyrich/githook-maven-plugin

https://www.npmjs.com/package/git-hooks

Nous utilisons des solutions Visual Studio (et donc des projets) comportant des événements avant et après la construction. J'ajoute un projet supplémentaire nommé '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 de crochets en un autre dépôt git et le lier en tant que sous-module ... Je suppose que cela vaut la peine que si vous avez beaucoup de membres et que les crochets sont changés régulièrement.

Vous pouvez utiliser une solution gérée pour la gestion des hooks avant la validation, telle que avant la validation . Vous pouvez également utiliser une solution centralisée pour les git-hooks côté serveur, tels que Datree.io . Il a des politiques intégrées telles que:

  1. Détecter et empêcher la la fusion de secrets .
  2. Appliquer la configuration de l'utilisateur Git appropriée.
  3. Appliquez la intégration du ticket Jira - Mentionnez le numéro de ticket dans le nom de la requête / le message de validation.

Il ne remplacera pas tous vos crochets, mais il pourrait aider vos développeurs à résoudre les problèmes les plus évidents sans avoir à installer des crochets à chaque configuration. développeurs ordinateur / repo.

Avertissement: Je suis l’un des fondateurs de Datrees

pre-commit simplifie la tâche pour les points d'ancrage pré-commit. 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.

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.

Vous pouvez donc é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 suit:

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

b) Un seul script

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 le hook qui a été déclenché et vous pourrez le différencier dans votre code. Pourquoi? Parfois, vous voudrez peut-être exécuter la même vérification pour les commandes commit et push, par exemple.

Et ensuite?

Ensuite, vous voudrez peut-être disposer de fonctionnalités supplémentaires, telles que:

  • Déclenchez manuellement le crochet pour vérifier si tout va bien même avant une validation ou une transmission. Si vous appelez simplement votre script (option a ou b), le tour est joué.
  • Déclenchez les points d'ancrage sur CI, vous n'avez donc pas besoin de réécrire les mêmes vérifications pour CI, il s'agirait simplement d'appeler les déclencheurs commit et push, par exemple. La même chose que ci-dessus devrait le résoudre.
  • Appelez des outils externes, tels qu'un validateur de démarques ou un validateur YAML. Vous pouvez effectuer des appels système et vous devez gérer STDOUT et STDERR.
  • Assurez-vous que tous les développeurs disposent d’un moyen simple d’installer les hooks. Il faut donc ajouter un script intéressant au référentiel pour remplacer les hooks par défaut par ceux qui conviennent
  • Avoir des assistants globaux, comme un chèque pour bloquer les commits de développer et de maîtriser les branches, sans avoir à l'ajouter à chaque référentiel. Vous pouvez le résoudre en ayant un autre référentiel avec des scripts globaux.

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 nombreuses lectures sur le hook, ainsi que plusieurs outils disponibles aujourd'hui.

À ce jour, 21 projets 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 script que vous voulez appeler, dans n’importe quel langage. .

L'utilisation de git hooks est absolument fantastique, mais la manière dont ils sont proposés éloigne généralement les utilisateurs.

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", 

La préinstallation sera exécutée avant

  

installer npm

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 construction auront un équivalent de préinstallation .

Cela devrait également fonctionner sur toutes les plateformes.

Si vous avez besoin d'informations supplémentaires, consultez https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top