如何在Git/GitHub中强制执行跨分支的指定Commit提交流程
实现分支合并规则强制的方案
方案1:代码托管平台分支保护规则(最易落地)
- 给A、B、C三个分支开启分支保护,禁止直接推送代码,所有变更必须通过PR合入
- 配置B分支的PR准入规则:仅接受源分支为A的PR,同时开启
强制快进合并限制,要求合入B的提交必须包含A分支的所有提交,禁止非快进合并 - 同理配置C分支的PR准入规则:仅接受源分支为B的PR,开启
强制快进合并限制,要求合入C的提交必须包含B分支的所有提交 - 关闭三个分支的合并提交、压缩合并选项,仅保留快进合并一种PR合并模式
方案2:Git原生服务端钩子(私有部署Git场景适用)
在Git服务端的pre-receive钩子中加入校验逻辑,收到推送请求时自动校验分支的上下游依赖关系,不符合规则直接拒绝推送:
校验逻辑核心:验证待合入目标分支的提交,是否是上游分支最新提交的后代,是则允许合入,否则拒绝
示例钩子脚本片段:
#!/bin/bash while read oldrev newrev refname do # 校验B分支推送 if [ $refname = "refs/heads/B" ]; then A_HEAD=$(git rev-parse refs/heads/A) if ! git merge-base --is-ancestor $A_HEAD $newrev; then echo "错误:推送到B分支的提交未包含A分支全量变更,请先将代码合入A后再尝试合入B" exit 1 fi fi # 校验C分支推送 if [ $refname = "refs/heads/C" ]; then B_HEAD=$(git rev-parse refs/heads/B) if ! git merge-base --is-ancestor $B_HEAD $newrev; then echo "错误:推送到C分支的提交未包含B分支全量变更,请先将代码合入B后再尝试合入C" exit 1 fi fi done
配套规则要求
- 所有功能特性分支必须从A分支拉取,开发完成后先提PR合入A,校验通过后再逐级向上提PR合入B、C
- 如出现上下游分支提交分叉的情况,必须先将上游分支的变更同步到下游分支,再提交下游分支的PR
内容的提问来源于stack exchange,提问作者Myles McDonnell
相关产品推荐
相关产品推荐

