git push后本地执行钩子?


71

我看过githooks的联机帮助页,但是除非我丢失了什么,否则我看不到本地的,后推式git hooks的选项。在将master分支推送到GitHub存储库后,我想拥有一个更新Web服务器上的api文档的工具(我已经为其编写了脚本)。当然,我可以编写自己的脚本,将git push和api docs结合起来,但是感觉有些不雅。


post-update这种情况下可以触发钩子对吗?
Agnibha

Answers:


10

从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


41
我不认为这个答案是一个好答案,它说明了前推钩,而最初的问题是关于后推钩。
LeventeHolló'16

3
LeventeHolló,在用户运行之后git-push和git实际推送提交之前执行预推送挂钩。Git中没有集成其他与推送相关的挂钩。
阿德里安Deccico

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就像您要使用钩子推动一样。


3
这真是太棒了……我使用单独的远程控制器:我托管代码的地方,生产服务器中的裸仓库,所以我将此代码添加到〜/ .functions.sh中,并使用** push origin ** ** push production **推送完成后,它将自动在我的浏览器中启动网站(因为它在push-post中定义)。谢谢!
赛富尔·拉赫曼·莫辛

要解决此问题,当前代码在git工作树中不起作用,只需更改3行即可:`GIT_DIR _ =“ $(git rev-parse --git-path hooks)” PRE_PUSH =“ $ {GIT_DIR _} / pre-push” POST_PUSH = “ $ {GIT_DIR _} / post-push”“
KaszpiR19年

36

我最近遇到了同一问题。我想要一个钩子,以便从我的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
嗯,如果您在分支机构呢?然后你做那个xpush?应该不是!git push $ 1 $ 2 && update-server.sh这样的东西,以便您可以指定origin分支吗?
Jlbelmonte 2011年

需要注意的是覆盖现有的命令是不可能的了Git的别名,看stackoverflow.com/questions/3538774/...
brillout

36

Git不支持这种类型的钩子。它超出了 Git维护者给出的Git钩子有效原因

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

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

PS A“单按”提示

  • 有太多需要全面解释的警告,但是如果您能弄清楚所有这些,则应该能够处理这些细节。

pushurl具有“备用”对象存储的本地存储库的额外内容可以为您提供一种开销较低的方式来本地执行推钩。但实际上,所做的工作远远不止于此git push upstream && update-web-server(可能是在shell别名,git别名或脚本中)。


3
可以在以下位置找到相同的信息:permalink.gmane.org/gmane.comp.version-control.git/71069
JakubNarębski09年

2
请注意,从1.8.2开始,Git添加了一个预推钩子。检查我的答案以查找更多信息。
阿德里安Deccico

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.