我看过the githooks manpage但除非我遗漏了一些内容,否则我看不到本地推后git挂钩的选项。在将主分支推送到GitHub仓库之后,我想有一个更新我的Web服务器上的api文档(我已经有一个脚本)。当然我可以编写自己的脚本,它结合了git push和api docs run,但感觉有些不雅。
答案 0 :(得分:47)
此问题的另一个解决方案是拥有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
。
答案 1 :(得分:36)
Git不支持这种类型的挂钩。它落在valid reasons for a Git hook之外 由Git的维护者给出。
上述链接信息中的介绍性评论几乎直接与您的案例有关:
我并不特别喜欢钩子 在启动操作后执行操作 本地并仅对本地数据采取行动。 这可能是因为我还在考虑 适合的git工具构建块 更高级别的脚本比其他更多 人们这样做。
对具有“替代”对象存储的本地存储的额外pushurl
可以为您提供本地执行推送钩子的低开销方式。但实际上,这项工作远远超过git push upstream && update-web-server
(可能是shell别名,git别名或脚本)。
答案 2 :(得分:33)
我最近遇到了同样的问题。我想要一个钩子,这样我的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。
答案 3 :(得分:10)
从Git 1.8.2开始,在推送操作之前调用了一个新钩子:预推送如果脚本返回0以外,则推送操作将被取消。
在发行说明中提及:https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167
答案 4 :(得分: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。
答案 5 :(得分:1)
只需创建一个顶部带有睡眠的 pre-push
挂钩即可。确保睡眠时间足够长,以便根据您的网络连接速度将提交上传到上游服务器。理想情况下添加一个 &
以在后台运行您的脚本:
(sleep 30 && .git/hooks/post-push) &