git推后本地执行钩子?

我已经看过githooks manpage,但除非我失去了一些东西,我没有看到本地,后推git钩子的选项。 我想有一个更新我的Web服务器上的API文件(我已经有一个脚本)后,我把主分支到GitHub回购。 当然,我可以编写自己的脚本,将git push和api docs运行结合起来,但是感觉有点不雅。

从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

解决这个问题的另一个方法是在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 push-wh

Git不支持这种types的钩子。 它不在Git维护者给出的Git钩子的正确理由之外。

上面的链接消息中的介绍性话语几乎直接地说明了你的情况:

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

PS“单推”提示

  • 对于完整的解释有太多的警告,但是如果你能把它全部弄清楚,你应该能够处理细节。

一个额外pushurl本地回购与“alternates”对象存储可能会给你一个低开销的方式来本地执行一个push hook。 但实际上,这个工作远不止git push upstream && update-web-server (也许在shell别名,git别名或脚本中)。

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

正如克里斯提到的,最好的方法是使用一个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 

所以现在,如果你input:

 $ git xpush 

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

我正在使用这个function:

 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。