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