githooks-git push后本地执行的钩子?

我已经看过githooks的联机帮助页,但是除非缺少某些内容,否则我看不到本地的,后推式git hook的选项。 在将master分支推送到GitHub存储库后,我想拥有一个更新我的Web服务器上的api文档的工具(我已经为其编写了脚本)。 当然,我可以编写自己的脚本,将git push和api docs结合起来,但感觉有些不雅。

scotchi asked 2019-10-08T05:06:23Z
5个解决方案
47 votes

解决此问题的另一种方法是为git-push-wh提供一个包装程序,该包装程序在2559758939525219319331调用之前和之后执行PATHgit push-wh脚本。 可能的包装可能如下所示:

#!/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" "$@"

在您的PATH中的某个位置另存为git-push-wh,如果您想用钩子推动,则可以将其称为git push-wh

Frank S. Thomas answered 2019-10-08T05:07:20Z
36 votes

Git不支持这种类型的钩子。 它超出了Git钩子的有效原因  由Git的维护者提供。

上面链接消息中的介绍性言论几乎直接针对您的情况:

我不太喜欢钩子   启动操作后采取行动   本地,仅根据本地数据采取行动。   这可能是因为我仍然考虑   git工具构建块适合   更高级的脚本   人们做。

附言 “单推”提示

  • 有太多需要全面解释的警告,但是如果您能弄清楚所有这些,则应该可以处理这些细节。

对于带有“备用”对象存储的本地回购协议,额外的pushurl可以为您提供一种开销较低的方式来本地执行推钩。 但实际上,所做的工作远远超过git push upstream && update-web-server(也许在shell别名,git别名或脚本中)。

Chris Johnsen answered 2019-10-08T05:08:21Z
33 votes

我最近遇到了同一问题。 我想要一个钩子,以便从我的git子模块中进行推送将在'superproject'中提交新的子模块引用。

如Chris所述,最好的方法是仅使用git别名,如下所示:

$ git config alias.xpush '!git push $1 $2 && update-server.sh'
# (remember the backslash before the ! if your shell requires it)

这会将以下内容添加到您的.git / config文件中:

[alias]
  xpush = !git push $1 $2 && update-server.sh

所以现在,如果您键入:

$ git xpush

您的更改将被推送,然后将执行update-server.sh。

ndbroadbent answered 2019-10-08T05:09:14Z
10 votes

从Git 1.8.2开始,在push操作之前调用了一个新的钩子:pre-push如果脚本返回的值不是0,则将取消push操作。

在发行说明中提及:[https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167]

样本:[https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample]

Adrián Deccico answered 2019-10-08T05:06:47Z
3 votes

我为此使用一个函数:

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

compdef部分用于ZSH。

pschmitt answered 2019-10-08T05:09:47Z
translate from https://stackoverflow.com:/questions/1797074/local-executing-hook-after-a-git-push