如何在强制推送场景下触发git的post-receive钩子正常生效?
问题原因
首先排除钩子未触发的可能性:post-receive 钩子在强制推送场景下默认会正常执行,你遇到的文件未同步问题,是现有脚本的git checkout命令在分支提交历史被强制改写(amend后force push就属于这类场景)时,不会主动将工作树同步到改写后的最新分支HEAD导致的。
解决方法
第一步:确认钩子权限
先保证钩子文件有可执行权限,执行以下命令配置:chmod +x /var/repo/test.git/hooks/post-receive
第二步:替换钩子脚本内容
将原脚本替换为以下内容,适配历史改写的强制推送场景:
#!/bin/sh # 声明Git环境变量 export GIT_DIR=/var/repo/test.git/ export GIT_WORK_TREE=/var/www/ # 强制同步工作树到dev分支最新提交,无视历史变更 git checkout -f dev git reset --hard refs/heads/dev
可选:钩子触发验证
如果想确认钩子是否正常被触发,可以在脚本开头加入日志打印逻辑:echo "$(date) 收到push事件,钩子执行" >> /tmp/git_post_receive.log
强制推送后查看/tmp/git_post_receive.log文件是否有新增日志即可验证。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

