73 votes

Crochet de pré-commit Git distant/partagé

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

5 votes

Si vous voulez application de la loi utiliser un crochet de mise à jour dans le dépôt central. Si le hook fait une vérification par-commit, vous pouvez toujours fournir un hook pre-commit ; les développeurs l'adopteront probablement volontairement, afin qu'ils puissent savoir immédiatement s'ils ont fait quelque chose de mal, plutôt que d'attendre jusqu'à ce qu'ils essaient de pousser.

1 votes

54voto

VonC Points 414372

Je ne pense pas, car les crochets ne sont pas clonés.
Peut-être que si ce hook script est lui-même versionné, et ensuite lié (lien symbolique) dans les serveurs clones (à condition que leur OS supporte cette fonctionnalité de lien).

Ou peut-être que si les crochets font partie d'une répertoire des modèles git utilisé pour la création des clones (cela garantirait seulement leur présence dans le repo du clone, cela ne garantirait pas qu'ils soient réellement utilisés et exécutés).

Mais je ne pense pas qu'il existe un moyen "central" de faire respecter 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 dépôt git d'avoir des crochets forcés distribués avec le dépôt.
Mon clone est mon référentiel . Je devrais pouvoir utiliser git comme je le souhaite, y compris choisir d'exécuter ou non les hooks.
(Et du point de vue de la sécurité, ce serait vraiment un peu effrayant - personne ne devrait avoir la possibilité de me forcer à exécuter certains scripts chaque fois que je lance 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 repo spécialisé donné.
Par exemple, vous ne pousseriez pas directement vers le dépôt central, mais d'abord vers un dépôt d'assurance qualité qui n'accepterait votre livraison que si elle respecte certaines règles. Si c'est le cas, alors le repo QA poussera votre commit vers le repo 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 de faire respecter localement une construction privée qui fonctionne avant de les pousser n'importe où.

7 votes

Je pense que cela va vraiment à l'encontre de l'idée d'un dépôt git d'avoir des crochets forcés distribués avec le dépôt. Mon clone est mon le dépôt. Je devrais pouvoir utiliser git dessus comme je le souhaite, y compris choisir d'exécuter ou non les hooks. (Et d'un point de vue sécurité, ce serait vraiment un peu effrayant - personne ne devrait avoir la possibilité de me forcer à exécuter certains scripts chaque fois que j'exécute certaines commandes git).

1 votes

@Jefromi : tu sais ce qui est effrayant ? Quand j'ai tapé le commentaire, avant de soumettre ma réponse modifiée, j'ai commencé à taper "ajouter...", et FireFox sur mon ordinateur m'a proposé : "ajouter le commentaire de Jefromi". Ce n'est pas la première fois que j'en arrive là, évidemment ;)

0 votes

Note à moi-même : voir aussi stackoverflow.com/questions/3209208/

9voto

Jens Timmerman Points 1448

Vous ne pouvez pas avoir le hook pre-commit forcé sur les dépôts locaux des peuples, mais dans votre dépôt central vous pouvez toujours exécuter un hook de pré-réception.

F. ex J'avais besoin de m'assurer que les messages de commit obéissaient à certaines règles (pour l'intégration trac etc.) J'ai donc utilisé le hook de pré-réception suivant, qui vérifie tous les messages commit poussés vers le dépôt central, et refuse le push s'il n'est pas welformé.

#!/bin/sh
while read rev\_old rev\_new ref
do
    MALFORMED="$(git rev-list --oneline $rev\_old..$rev\_new | egrep -v '#\[0-9\]+' |  awk '{print $1}' )"
    if \[ x"$MALFORMED" != x \]
    then
        echo Invallid commit message on $MALFORMED
        exit 1
    fi
done

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

8voto

superluminary Points 5496

Oui et non.

Si vous écrivez du JavaScript le meilleur moyen de le faire est de recourir à Husky. Husky a un postInstall script qui va configurer et gérer vos githooks. Vous pouvez ensuite configurer precommit et prepush script dans votre package.json ou un husky dotfile.

Vous pouvez l'utiliser pour exécuter des scripts arbitraires. En général, je yarn lint y yarn test prepush.


Si vous n'utilisez pas JavaScript ou vous ne pouvez pas utiliser Husky, vous pouvez cloner les commit hooks sur les machines des développeurs et les enregistrer dans un repo, mais vous ne pouvez pas forcer les développeurs à les exécuter.

Pour enregistrer vos crochets, créez un hooks quelque part dans votre dépôt. Ensuite, mettez vos hooks là au lieu de l'habituel .git/hooks répertoire. C'est la partie que vous pouvez faire respecter.

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

git config core.hooksPath hooks

Maintenant, tous les hooks du dossier hooks fonctionneront comme prévu.

7voto

bstpierre Points 12616

Est-ce qu'un hook pre-commit peut être scripté sur ce dépôt principal et être appliqué sur tous les clones de celui-ci ?

De githooks(5) :

    **pre-commit**
      This hook is invoked by git commit, and can be bypassed with
      --no-verify option.

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

De plus, comme le répertoire .git/hooks n'est pas cloné, il ne semble pas y avoir de mécanisme pour le pousser vers le client.

2voto

Andrew Wagner Points 1958

En supposant que vous avez du code source dans votre dépôt git auquel est associé un système de construction, vous pouvez configurer le système de construction pour mettre en place le hook pre-commit, c'est-à-dire en déplaçant ou en liant un hook pre-commit qui ~est versionné.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X