web-dev-qa-db-fra.com

Crochet d'exécution local après un push git?

J'ai regardé la page de manuel githooks mais à moins que je manque quelque chose, je ne vois pas d'option pour les hooks git locaux post-push. Je voudrais en avoir un qui met à 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 simplement écrire mon propre script qui combine le git Push et les api docs run, mais cela semble quelque peu inélégant.

62
scotchi

Depuis Git 1.8.2, un nouveau hook est invoqué avant l'opération Push: pré-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

11
Adrián Deccico

Une autre solution à ce problème consiste à avoir un wrapper pour git Push qui exécute .git/hooks/pre-Push et .git/hooks/post-Push scripts avant et après le git Push appel. 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é sous git-Push-wh quelque part dans votre PATH, elle peut alors être appelée comme git Push-wh si vous voulez pousser avec des crochets.

49
Frank S. Thomas

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

La remarque liminaire du message lié ci-dessus concerne presque directement votre cas:

Je n'aime pas particulièrement les hooks qui agissent après qu'une opération soit lancée localement et agissent uniquement sur des données locales. C'est peut-être parce que je considère toujours les blocs de construction de git tools plus adaptés aux scripts de niveau supérieur que les autres.

P.S. Un indice "simple pression"

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

Un pushurl supplémentaire dans un dépôt local avec un magasin d'objets "alternatifs" pourrait vous donner un moyen de faible surcharge pour exécuter localement un hook Push. Mais vraiment, l'effort est bien plus que git Push upstream && update-web-server (peut-être dans un alias Shell, un alias git ou un script).

36
Chris Johnsen

J'ai récemment rencontré le même problème. Je voulais un crochet pour qu'un Push de mon sous-module git valide la nouvelle référence de sous-module dans le "superprojet".

Comme Chris l'a mentionné, la meilleure façon est simplement d'utiliser 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é.

33
ndbroadbent

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.

3
pschmitt