web-dev-qa-db-fra.com

Les scripts de hook Git peuvent-ils être gérés avec le référentiel?

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?

281
Pat Notz

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

134
mipadi

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

175
Max Shenfield

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.

12
kilianc

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.

4
cattail

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

4
yuranos87

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.

3
Mike de Klerk

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.

1
Empus

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:

  1. Détecter et prévenir fusion de secrets .
  2. Appliquer la bonne configuration utilisateur Git .
  3. Appliquer intégration du ticket Jira - mentionner le numéro du ticket dans le nom de la demande d'extraction/le message de validation.

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

1
Shimon Tolts

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/

1
Shane Gannon

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:

  • Déclenchez manuellement le crochet pour vérifier si tout va bien même avant une validation ou un Push. Si vous appelez simplement votre script (option a ou b), le tour est joué.
  • Déclenchez les points d'ancrage sur le CI, de sorte que vous n'avez pas besoin de réécrire les mêmes contrôles pour le CI, ce serait simplement 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 faire des appels système et 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 Nice au référentiel pour remplacer les hooks par défaut par ceux appropriés.
  • Avoir des assistants globaux, comme un contrôle 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 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.

0
Lovato

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.

0
ericsoco