71

我查看了 githooks 联机帮助页,但除非我遗漏了某些内容,否则我看不到本地、推送后 git 钩子的选项。在将主分支推送到 GitHub 存储库后,我想要一个更新我的 Web 服务器上的 api 文档(我已经有一个脚本)。当然,我可以编写自己的脚本,结合 git push 和 api 文档运行,但这感觉有点不雅。

4

7 回答 7

54

这个问题的另一个解决方案是在调用之前和之后有一个git push执行.git/hooks/pre-push.git/hooks/post-push脚本的包装器。git 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好像你想用钩子推送一样。

于 2010-09-28T11:28:31.657 回答
36

Git 不支持这种类型的钩子。它不属于 Git 维护者给出的Git 钩子的正当理由。

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

我不特别喜欢在本地启动操作后仅作用于本地数据的钩子。这可能是因为我仍然认为 git 工具构建块比其他人更适合更高级别的脚本。

PS“单推”提示

  • 有太多的警告需要完整的解释,但如果你能弄清楚,你应该能够处理细节。

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

于 2009-11-25T20:05:15.707 回答
36

我最近遇到了同样的问题。我想要一个钩子,以便来自我的 git 子模块的推送将在“超级项目”中提交新的子模块引用。

正如 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 将被执行。

于 2010-08-12T10:09:17.193 回答
7

从 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

于 2013-11-27T04:46:46.260 回答
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。

于 2014-05-23T18:53:20.107 回答
0

只需在顶部创建一个pre-push带有 sleep 的钩子。根据您的网络连接速度,确保睡眠时间足够长,以便将提交上传到上游服务器。理想情况下添加一个&在后台运行你的脚本:

(sleep 30 && .git/hooks/post-push) &
于 2021-05-25T04:28:35.990 回答
0

实际上可以通过使用钩子来实现后推reference-transaction钩子。推送完成后,git 将在本地更新远程跟踪分支,在refs/remotes/REMOTE/BRANCH.

于 2022-02-18T15:35:41.623 回答