J'ai consulté la page de manuel githooks, mais à moins que quelque chose ne me manque, je ne vois pas d'option pour les crochets Git locaux post-push. J'aimerais en avoir un qui mette à jour les documents api sur mon serveur Web (pour lequel j'ai déjà un script) après avoir poussé la branche principale vers le référentiel GitHub. Bien sûr, je pourrais juste écrire mon propre script qui combine le git push et les api docs exécutés, mais cela me semble un peu inélégant.
Réponses
Trop de publicités? Une autre solution à ce problème consiste à utiliser un wrapper pour git push
qui exécute les scripts .git/hooks/pre-push
et .git/hooks/post-push
avant et après l'appel git push
. 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é en tant que git-push-wh
quelque part dans votre PATH
, il peut alors être appelé en tant que git push-wh
si vous souhaitez pousser avec des hooks.
Ce type de crochet n'est pas pris en charge par Git. Il est en dehors de la des raisons valables pour un Git crochet donnée par Git est responsable.
La remarque introductive dans le ci-dessus liés message parle presque directement à votre cas:
Je n'aime pas particulièrement les crochets qui loi après qu'une opération est lancée localement et agir uniquement sur les données locales. C'est peut-être parce que je considère toujours git outils de blocs de construction adapté pour niveau supérieur script plus que les autres les gens font.
P. S. Un "Simple Pression Sur" Hint
- Il y a trop de mises en garde pour une explication complète, mais si vous pouvez comprendre ce que vous devriez être en mesure de traiter avec les détails.
Un extra - pushurl
d'un local repo avec un "suppléants" des objets de magasins peut vous donner un faible surcoût moyen d'localement exécute un push de crochet. Mais vraiment, l'effort est beaucoup plus qu' git push upstream && update-web-server
(peut-être dans un shell alias, alias git, ou un script).
Je suis récemment tombé sur le même problème. Je voulais un crochet pour qu'une poussée de mon sous-module git valide la nouvelle référence de sous-module dans le "superprojet".
Comme Chris l'a mentionné, le meilleur moyen consiste simplement à utiliser un alias git, comme ceci:
$ git config alias.xpush \!git push origin master && 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 origin master && update-server.sh
Et maintenant, si vous tapez:
$ git xpush
vos modifications seront poussées, puis update-server.sh sera exécuté.
À partir de Git 1.8.2 il y a un nouveau crochet invoquée avant l'opération push: pré-push Si le script retourne autres que 0 la poussée de l'opération sera annulée.
Mention dans les notes de version: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167
J'utilise une fonction pour cela:
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.