我查看了 githooks 联机帮助页,但除非我遗漏了某些内容,否则我看不到本地、推送后 git 钩子的选项。在将主分支推送到 GitHub 存储库后,我想要一个更新我的 Web 服务器上的 api 文档(我已经有一个脚本)。当然,我可以编写自己的脚本,结合 git push 和 api 文档运行,但这感觉有点不雅。
7 回答
这个问题的另一个解决方案是在调用之前和之后有一个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
好像你想用钩子推送一样。
Git 不支持这种类型的钩子。它不属于 Git 维护者给出的Git 钩子的正当理由。
上述链接消息中的介绍性评论几乎直接针对您的情况:
我不特别喜欢在本地启动操作后仅作用于本地数据的钩子。这可能是因为我仍然认为 git 工具构建块比其他人更适合更高级别的脚本。
PS“单推”提示
- 有太多的警告需要完整的解释,但如果你能弄清楚,你应该能够处理细节。
具有“备用”对象存储的本地 repo的额外pushurl
功能可以为您提供一种低开销的方式来本地执行推送挂钩。但实际上,所付出的努力远不止git push upstream && update-web-server
(可能在 shell 别名、git 别名或脚本中)。
我最近遇到了同样的问题。我想要一个钩子,以便来自我的 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 将被执行。
从 Git 1.8.2 开始,在推送操作之前调用了一个新的钩子:pre-push如果脚本返回的不是 0,推送操作将被取消。
在发行说明中提及:https ://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167
我为此使用了一个函数:
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。
只需在顶部创建一个pre-push
带有 sleep 的钩子。根据您的网络连接速度,确保睡眠时间足够长,以便将提交上传到上游服务器。理想情况下添加一个&
在后台运行你的脚本:
(sleep 30 && .git/hooks/post-push) &
实际上可以通过使用钩子来实现后推reference-transaction
钩子。推送完成后,git 将在本地更新远程跟踪分支,在refs/remotes/REMOTE/BRANCH
.