git push后本地执行挂钩?

时间:2009-11-25 13:58:16

标签: git githooks

我看过the githooks manpage但除非我遗漏了一些内容,否则我看不到本地推后git挂钩的选项。在将主分支推送到GitHub仓库之后,我想有一个更新我的Web服务器上的api文档(我已经有一个脚本)。当然我可以编写自己的脚本,它结合了git push和api docs run,但感觉有些不雅。

6 个答案:

答案 0 :(得分:47)

此问题的另一个解决方案是拥有git push的包装器,在.git/hooks/pre-push调用之前和之后执行.git/hooks/post-pushgit 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工具构建块   更高级别的脚本比其他更多   人们这样做。

P.S。 “单推”提示

  • 有太多的注意事项需要完整的解释,但如果你能全面了解,你应该能够处理细节。

对具有“替代”对象存储的本地存储的额外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

示例:https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

答案 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) &