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