如何设置GitHub规则仅允许匹配dev-*模式的分支合并到Main
GitHub限制非dev-*源分支PR合入main的实现方式
你可以通过以下三种主流方式实现需求,按实现成本从低到高排列:
方式一:使用GitHub原生规则集(推荐,无需额外代码)
这是目前最简单的实现方案,GitHub免费版、团队版、企业版均支持:
- 进入仓库的
Settings页,在左侧菜单栏找到「Code and automation」分类下的Rules→Rulesets - 点击「New ruleset」选择「Branch ruleset」,规则生效目标设置为
main分支 - 在规则配置页找到「Source branch restrictions」选项,开启后添加允许的源分支模式为
dev-* - 保存并启用规则集即可,后续所有目标为main的PR如果源分支不符合
dev-*格式,会被直接阻止合并
方式二:通过GitHub Actions做自定义校验
如果后续需要叠加更复杂的合并校验规则,可以用自定义工作流实现:
- 在仓库的
.github/workflows目录下新建名为pr-main-source-check.yml的配置文件 - 写入以下工作流配置:
name: 校验合入main的PR源分支格式 on: pull_request: # 仅触发目标分支为main的PR校验 branches: - main types: [opened, synchronize, reopened] jobs: check-branch: runs-on: ubuntu-latest steps: - name: 校验源分支是否匹配dev-*格式 if: ${{ !startsWith(github.head_ref, 'dev-') }} run: | echo "不符合合并规则:仅允许dev-*前缀的分支合入main" exit 1
- 配置生效后,进入main分支的保护规则设置,将该工作流添加到「Required status checks」必填检查列表中,开启「Require branches to be up to date before merging」即可生效
方式三:使用Pre-receive钩子(仅GitHub企业版/自托管实例支持)
如果是企业私有部署的GitHub实例,可以通过服务器端预接收钩子做全局拦截:
- 在GitHub实例的仓库钩子配置中新增pre-receive钩子
- 写入校验逻辑:当推送目标为main分支时,检查源分支前缀是否为
dev-*,不符合则直接拒绝推送请求
内容的提问来源于stack exchange,提问作者SeanCCSmith
相关产品推荐
相关产品推荐

