git push后本地执行钩子吗?

问题描述 投票:66回答:5

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

git githooks
5个回答
11
投票

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

发行说明中的​​提及: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


50
投票

[解决此问题的另一种方法是为git push提供一个包装,该包装在.git/hooks/pre-push调用之前和之后执行.git/hooks/post-pushgit push脚本。可能的包装可能看起来像这样:

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

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


36
投票

Git不支持这种类型的钩子。它落在valid reasons for a Git hook之外由Git的维护者提供。

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

我不特别喜欢启动操作后采取行动本地,仅根据本地数据采取行动。这也许是因为我仍然考虑git工具适合的构建基块更高级的脚本人们愿意。

P.S。 “单按”提示

  • 有太多警告需要详细说明,但是如果您能理解所有内容,则应该能够处理详细信息。

与具有“备用”对象存储的本地存储库相比,额外的pushurl可以为您提供一种开销较低的方式来本地执行推钩。但是,实际上,所付出的努力远不及git push upstream && update-web-server(也许在shell别名,git别名或脚本中)。


35
投票

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

正如克里斯所说,最好的方法是只使用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。


3
投票

我正在为此使用一个功能:

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。

© www.soinside.com 2019 - 2024. All rights reserved.