71 votes

Local exécutant le hook après un push git?

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.

54voto

Frank S. Thomas Points 2071

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.

36voto

Chris Johnsen Points 50064

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

36voto

nathan.f77 Points 4941

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

9voto

Adrián Deccico Points 885

À 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

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

3voto

pschmitt Points 1

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.

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