合并到main分支时校验app.json更新,应选用哪种Git钩子?
问题
我拥有一个名为my-service的GitHub仓库,为追踪应用版本,我在app.json文件中维护版本信息。我希望每次合并代码到main分支时,都能校验app.json是否已更新(即若该文件未更新则阻止合并)。我研究了Git钩子,考虑过git-commit和git-merge钩子,但认为git-commit并不合适,因为它会在每次提交时触发,不符合我的需求。请问git pre-merge钩子是否是实现该需求的正确选择?
解答
先说明白:Git本身根本没有官方的pre-merge钩子,你说的这类钩子并不是Git原生支持的。
要实现合并到main分支时必须校验app.json是否更新,团队场景下最靠谱的做法是用GitHub的分支保护规则加GitHub Actions:
- 第一步,给main分支开分支保护,要求所有合并必须走Pull Request(PR),而且得通过指定的检查才能合并。
- 第二步,建一个GitHub Actions工作流文件(比如
.github/workflows/check-version.yml),在PR准备合并到main的时候触发,对比PR分支和main分支的app.json内容:name: Check Version Update on: pull_request: branches: [ main ] jobs: check-version: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 2 - name: Check if app.json has been updated run: | # 对比PR分支和main分支的app.json差异 git diff origin/main...HEAD -- app.json # 如果没差异就报错退出 if [ $? -eq 0 ]; then echo "错误:合并到main分支前必须更新app.json!" exit 1 fi - 第三步,在分支保护规则里把这个Actions工作流设为必填检查,这样只要PR里没更新app.json,检查就过不了,自然没法合并。
要是你只想约束自己本地的操作,也可以自定义客户端钩子,但这种方式有大问题:
- 客户端钩子只在你自己电脑上生效,管不了团队里其他人,有人绕过钩子提交的话,照样能合并到main。
- 比如可以在本地
.git/hooks/pre-push钩子加检查,只在推main分支时触发,但也就只能约束你自己而已。
总结:别纠结Git的pre-merge钩子了,用GitHub分支保护+Actions才是团队里最稳妥的方案。
内容的提问来源于stack exchange,提问作者Saturnian
相关产品推荐
相关产品推荐

