我看过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好像你想用钩子推动一样.
Chr*_*sen 36
Git不支持这种类型的钩子.它不属于 Git的维护者给出的Git钩子的正当理由.
上述链接消息中的介绍性评论几乎直接与您的案例有关:
我并不特别喜欢在本地启动操作后仅执行本地数据的挂钩.这可能是因为我仍然认为git工具构建块比其他人更适合更高级别的脚本.
pushurl具有"替换"对象存储的本地存储库的额外存储可以为您提供本地执行推送挂钩的低开销方式.但实际上,这种努力远远超过git push upstream && update-web-server(可能是shell别名,git别名或脚本).
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.
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
实际上可以通过使用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.