git push后本地执行挂钩?

sco*_*chi 63 git githooks

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

Fra*_*mas 49

此问题的另一个解决方案是在调用之前和之后有一个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" "$@"
Run Code Online (Sandbox Code Playgroud)

保存git-push-wh在你的某个地方,PATH然后可以调用它,git push-wh好像你想用钩子推动一样.

  • 这很棒......我使用单独的遥控器:我在我的生产服务器中托管我的代码,一个裸仓库,所以我将[此代码](https://gist.github.com/SaifurRahmanMohsin/0a6d1944cbd7815e58e7)添加到我的[ 〜/ .functions.sh](https://github.com/mathiasbynens/dotfiles)并使用**push origin****push production**它会自动启动我的网站(因为那是在push-post中定义的)推送完成后的浏览器.谢谢! (2认同)

Chr*_*sen 36

Git不支持这种类型的钩子.它不属于 Git的维护者给出的Git钩子正当理由.

上述链接消息中的介绍性评论几乎直接与您的案例有关:

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

PS"单推"提示

  • 有太多的注意事项可以作为完整的解释,但是如果你能够全部解决这个问题,你应该能够处理细节.

pushurl具有"替换"对象存储的本地存储库的额外存储可以为您提供本地执行推送挂钩的低开销方式.但实际上,这种努力远远超过git push upstream && update-web-server(可能是shell别名,git别名或脚本).

  • 相同的信息可在以下网址找到:http://permalink.gmane.org/gmane.comp.version-control.git/71069 (3认同)
  • 请注意,从1.8.2 Git添加了**预推**钩.检查我的答案以查找更多信息. (2认同)

ndb*_*ent 34

我最近遇到了同样的问题.我想要一个钩子,这样我的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)
Run Code Online (Sandbox Code Playgroud)

这会将以下内容添加到.git/config文件中:

[alias]
  xpush = !git push $1 $2 && update-server.sh
Run Code Online (Sandbox Code Playgroud)

现在,如果你键入:

$ git xpush
Run Code Online (Sandbox Code Playgroud)

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

  • 嗯,如果你在一个分支?你做那个xpush?不应该像!git push $ 1 $ 2 && update-server.sh所以你可以指定origin分支? (3认同)

Adr*_*ico 11

从Git 1.8.2开始,在推送操作之前调用了一个新的钩子:pre-push如果脚本返回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

  • 我不是这个答案是好的,它讲述了预推钩,原来的问题是关于后推钩. (32认同)
  • LeventeHolló,预推钩在用户运行`git-push`之后执行,然后git实际推送commit/s.在Git中没有集成其他推送相关钩子. (3认同)

Vic*_*aré 5

实际上可以通过使用reference-transactionhook 来实现 post-push hook。推送完成后,git 将在本地更新远程跟踪分支,触发refs/remotes/REMOTE/BRANCH.

以下是使用此技术的挂钩示例:

#!/bin/bash
set -eu

while read oldvalue newvalue refname
do
    if [ $1 = committed -a $refname = refs/remotes/origin/main ]
    then
        exec .git/hooks/post-push
    fi
done
Run Code Online (Sandbox Code Playgroud)

该脚本必须具有可执行位并放置在.git/hooks/reference-transaction. 钩子在将主分支推送到原点后运行。将您的实际挂钩脚本放入.git/hooks/post-push.