我看过the githooks manpage,但除非我缺少某些内容,否则我看不到本地的,后推式git hook的选项。在将master分支推送到GitHub存储库后,我想拥有一个更新Web服务器上的api文档的工具(我已经为其编写了脚本)。当然,我可以编写自己的脚本,将git push和api docs结合起来,但感觉有些不雅。
从Git 1.8.2开始,在推入操作之前会调用一个新的钩子:pre-push如果脚本返回的值不是0,则推入操作将被取消。
发行说明中的提及:https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167
[解决此问题的另一种方法是为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不支持这种类型的钩子。它落在valid reasons for a Git hook之外由Git的维护者提供。
以上链接消息中的介绍性言论几乎直接针对您的情况:
我不特别喜欢启动操作后采取行动本地,仅根据本地数据采取行动。这也许是因为我仍然考虑git工具适合的构建基块更高级的脚本人们愿意。
与具有“备用”对象存储的本地存储库相比,额外的pushurl
可以为您提供一种开销较低的方式来本地执行推钩。但是,实际上,所付出的努力远不及git push upstream && update-web-server
(也许在shell别名,git别名或脚本中)。
我最近遇到了同一问题。我想要一个钩子,以便从我的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。
我正在为此使用一个功能:
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。