web-dev-qa-db-fra.com

Crochet de pré-validation Git distant/partagé

Avec un référentiel officiel unique comme distant et plusieurs référentiels locaux clonés à partir de celui-ci, un hook de pré-validation peut-il être scripté sur ce référentiel principal et appliqué sur tous ses clones?

62
Samer Buna

Je ne pense pas, car les crochets ne sont pas clonés.
Peut-être si ce script de raccordement est lui-même versionné, puis un lien vers (lien symbolique) dans les serveurs de clonage (à condition que leur système d'exploitation prenne en charge cette fonctionnalité de lien).

Ou peut-être que si les crochets font partie d'un répertoire git template utilisé pour créer les clones (cela assurerait uniquement leur présence dans le référentiel de clone, cela ne garantirait pas qu'ils sont réellement utilisés et exécutés).

Mais je ne pense pas qu’il existe un moyen "central" d’imposer un commit.


Comme Jefromi l'explique encore plus clairement dans les commentaires (c'est moi qui souligne):

Je pense que cela va vraiment à l’encontre de l’idée d’un référentiel git d’avoir des hooks imposés distribués avec le repo.
Mon clone est mon référentiel. Je devrais pouvoir utiliser git comme bon me semble, y compris choisir de lancer ou non des hooks.
(Et du point de vue de la sécurité, ce serait vraiment effrayant - personne ne devrait avoir la capacité de me forcer à exécuter certains scripts chaque fois que j'exécute certaines commandes git.)

Je suis d'accord avec ce commentaire et je n'ai vu que des moyens d'appliquer des règles appliquées localement, dans un référentiel spécialisé donné.
Par exemple, vous n’allez pas directement au référentiel central, mais vous le feriez tout d’abord à un référentiel QA qui accepterait votre commit uniquement s’il suit certaines règles. Si tel est le cas, le référentiel QA envoie votre validation au référentiel central.

Une autre illustration directement dérivée de ce que je viens de mentionner serait " Intégration continue sans serveur avec Git ", un moyen d’appliquer une version privée localement privée qui fonctionne avant de les transférer ailleurs.

48
VonC

Vous ne pouvez pas forcer le hook de pré-validation sur les référentiels locaux, mais dans votre référentiel central, vous pouvez toujours exécuter un hook de pré-réception.

F. ex, je devais m'assurer que les messages de validation respectaient certaines règles (pour l'intégration de trac, etc.) ce n'est pas welformed.

 #!/bin/sh 
 en lisant rev_old rev_new ref 
 do 
 MALFORMED = "$ (git rev-list --oneline $ rev_old .. $ rev_new | egrep -v '# [0-9] +' | awk '{print $ 1}')" 
 si [x "$ MALFORMED"! = x] 
 puis
 echo Invallid commit message sur $ MALFORMED 
 sortie 1 
 fi 
 fait 

pour plus d'informations, voir f.ex https://git-scm.com/book/fr/v2/Customizing-Git-Git-Hooks

8
Jens Timmerman

un hook de pré-validation peut-il être scripté sur ce référentiel principal et appliqué sur tous ses clones?

De githooks(5):

pré-commit
 Ce hook est appelé par git commit et peut être contourné avec 
 Option --no-verify .

Puisque le crochet peut facilement être contourné, il semble que la réponse à votre question est "non".

De plus, étant donné que le répertoire .git/hooks n'est pas cloné, il ne semble pas exister de mécanisme permettant de l'envoyer au client.

7
bstpierre

Oui et non.

Si vous écrivez JavaScript , la meilleure façon de le faire est d'utiliser Husky. Husky a un script postInstall qui va configurer et gérer vos githooks. Vous pouvez ensuite configurer les scripts precommit et prepush dans votre package.json.

Vous pouvez l'utiliser pour exécuter des scripts arbitraires. Je typiquement npm run lint et npm test prepush


Si vous n'utilisez pas JavaScript , ou si vous ne pouvez pas utiliser Husky, vous pouvez cloner des raccords de validation sur des machines de développement et les archiver dans un référentiel, mais vous ne pouvez pas obliger les développeurs à les exécuter.

Pour vérifier vos points d'ancrage, créez un répertoire hooks quelque part dans votre référentiel. Placez ensuite vos crochets à la place du répertoire .git/hooks habituel. C'est la partie que vous pouvez appliquer.

L'autre partie dépend de la bonne volonté du développeur. Pour définir votre dossier de hooks comme hooksPath, chaque développeur doit exécuter:

git config core.hooksPath hooks

Maintenant, tous les crochets dans le dossier des crochets fonctionneront comme prévu.

5
superluminary

En supposant que votre référentiel git contienne du code source associé à un système de construction, vous pouvez configurer le système de construction de manière à configurer le hook de pré-validation, c'est-à-dire en déplaçant ou en reliant un hook de pré-commit ayant fait l'objet d'une version.

Je n'ai pas encore essayé. Je suis venu ici en cherchant une meilleure solution sur Google. 

2
Andrew Wagner

Je crée un nouveau fichier: pre-commit-hook.sh

#!/usr/bin/env bash
CHANGES=$(git whatchanged ..Origin)

if [ ! -z "${CHANGES}" ]; then
    echo "There are changes in remote repository. Please pull from remote branch first."
    exit 1;
fi

exit 0;

Et voici comment je m'engage envers Git:

bash pre-commit-hook.sh && git commit -m "<Commit message>"
0
Vishrant