Exécution locale hook après une poussée git?

5 réponses

Depuis git 1.8.2, un nouveau hook est invoqué avant l'opération push: pre-push si le script retourne autre que 0, l'opération push sera annulée.

Mention dans les notes de version: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167

Exemple: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

10
répondu Adrián Deccico 2013-11-27 04:46:46

Une Autre solution à ce problème est un wrapper pour git push qui exécute .git/hooks/pre-push et .git/hooks/post-push scripts avant et après la git push appeler. Un wrapper possible pourrait ressembler à ceci:

#!/bin/sh

GIT_DIR_="$(git rev-parse --git-dir)"
BRANCH="$(git rev-parse --symbolic --abbrev-ref $(git symbolic-ref HEAD))"

PRE_PUSH="$GIT_DIR_/hooks/pre-push"
POST_PUSH="$GIT_DIR_/hooks/post-push"

test -x "$PRE_PUSH" &&
    exec "$PRE_PUSH" "$BRANCH" "$@"

git push "$@"

test $? -eq 0 && test -x "$POST_PUSH" &&
    exec "$POST_PUSH" "$BRANCH" "$@"

Enregistrés comme git-push-wh quelque part dans votre PATH, il peut alors être appelé comme git push-wh si vous voulez aller à l'aide de crochets.

44
répondu Frank S. Thomas 2010-09-28 11:28:31

Ce type de hook n'est pas supporté par Git. Il tombe en dehors des raisons valables pour un crochet Git comme indiqué par le mainteneur de Git.

La remarque introductive dans le message lié ci-dessus parle presque directement de votre cas:

Je n'aime pas particulièrement les crochets qui agir après le lancement d'une opération localement et agir uniquement sur les données locales. C'est peut être parce que je considère toujours git tools blocs de construction appropriés pour scripts de niveau supérieur plus de autre les gens font.

Ps un indice "simple poussée"

  • Il y a trop de mises en garde pour une explication complète, mais si vous pouvez comprendre tout cela, vous devriez être en mesure de traiter les détails.

Un pushurl supplémentaire à un repo local avec un magasin d'objets "alternates"pourrait vous donner un moyen faible d'exécuter localement un crochet push. Mais vraiment, l'effort est beaucoup plus que git push upstream && update-web-server (peut-être dans un alias shell, un alias git ou un script).

35
répondu Chris Johnsen 2009-11-26 08:51:31

J'ai récemment rencontré le même problème. Je voulais un crochet pour qu'une poussée de mon sous-module git commette la nouvelle référence de sous-module dans le 'superproject'.

Comme Chris l'a mentionné, le meilleur moyen est d'utiliser simplement un alias git, comme ceci:

$ git config alias.xpush '!git push $1 $2 && update-server.sh'
# (remember the backslash before the ! if your shell requires it)

Cela ajoute ce qui suit à votre .fichier git / config:

[alias]
  xpush = !git push $1 $2 && update-server.sh

Et maintenant, si vous tapez:

$ git xpush

Vos modifications seront poussées, puis update-server.sh sera exécuté.

31
répondu ndbroadbent 2015-10-14 04:30:25

J'utilise une fonction pour ceci:

current_branch() {
    local ref=$(git symbolic-ref HEAD 2> /dev/null) || return
    echo ${ref#refs/heads/}
}

gp() {
    local post_push="$(git rev-parse --git-dir)/hooks/post-push"
    git push "$@" && {
        [[ -x "$post_push" ]] && "$post_push" "$(current_branch)" "$@"
    }
}
compdef _git gp=git-push

La partie compdef est pour ZSH.

2
répondu pschmitt 2014-05-23 19:20:19