如何配置分支合并规则,仅允许指定分支合并到main分支?
分支合并权限限制配置方案
根据你的需求,要实现「仅允许UAT合并到main、仅允许Dev合并到UAT」的规则,不同Git平台有对应的实现方式,以下是主流平台的配置方法:
GitHub
通过GitHub Actions验证PR源分支
这是最直接的方式,创建两个工作流文件分别限制main和UAT分支的合并来源:- 针对main分支,在仓库
.github/workflows/validate-main-pr.yml中添加:name: Validate PR to Main on: pull_request: branches: [main] jobs: check-source: runs-on: ubuntu-latest steps: - name: Verify source branch if: github.head_ref != 'UAT' run: | echo "❌ 错误:仅允许UAT分支合并到main分支" exit 1 - 针对UAT分支,在仓库
.github/workflows/validate-uat-pr.yml中添加:name: Validate PR to UAT on: pull_request: branches: [UAT] jobs: check-source: runs-on: ubuntu-latest steps: - name: Verify source branch if: github.head_ref != 'Dev' run: | echo "❌ 错误:仅允许Dev分支合并到UAT分支" exit 1
提交这两个文件后,任何不符合规则的PR都会在CI阶段失败,无法合并。
- 针对main分支,在仓库
结合分支保护规则增强限制
进入仓库「Settings」→「Branches」→「Branch protection rules」,分别为main和UAT分支开启:- 勾选「Require pull request reviews before merging」
- 勾选「Require status checks to pass before merging」,并将上面创建的CI工作流添加为必填检查项
这样能进一步确保只有通过验证的PR才能合并。
GitLab
通过CI/CD流水线验证
在仓库根目录创建.gitlab-ci.yml文件,添加分支验证逻辑:validate_pr_source: stage: pre-merge rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' script: - | if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "UAT" ]; then echo "❌ 错误:仅允许UAT分支合并到main分支" exit 1 fi - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "UAT"' script: - | if [ "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" != "Dev" ]; then echo "❌ 错误:仅允许Dev分支合并到UAT分支" exit 1 fi提交后,不符合规则的合并请求会触发流水线失败,阻止合并。
配置受保护分支权限
进入仓库「Settings」→「Repository」→「Protected branches」,分别编辑main和UAT分支:- 在「Allowed to merge」中仅添加负责合并对应源分支的角色/用户,减少误操作的可能。
通用Git服务器(自定义钩子)
如果使用自建Git服务器,可以通过服务器端的pre-receive钩子拦截不符合规则的合并:
- 在服务器的仓库目录下,进入
hooks文件夹,创建pre-receive文件 - 添加以下脚本内容:
#!/bin/bash while read oldrev newrev refname; do target_branch=$(git rev-parse --symbolic --abbrev-ref "$refname") # 检查合并到main的源分支 if [ "$target_branch" = "main" ]; then merge_source=$(git show "$newrev" --pretty=format:%P | awk '{print $2}') merge_source_branch=$(git name-rev "$merge_source" | awk '{print $2}') if [[ "$merge_source_branch" != "UAT" ]]; then echo "❌ 错误:仅允许UAT分支合并到main分支" exit 1 fi # 检查合并到UAT的源分支 elif [ "$target_branch" = "UAT" ]; then merge_source=$(git show "$newrev" --pretty=format:%P | awk '{print $2}') merge_source_branch=$(git name-rev "$merge_source" | awk '{print $2}') if [[ "$merge_source_branch" != "Dev" ]]; then echo "❌ 错误:仅允许Dev分支合并到UAT分支" exit 1 fi fi done exit 0 - 给文件添加执行权限:
chmod +x pre-receive
这样任何不符合规则的推送都会被服务器拦截。
内容的提问来源于stack exchange,提问作者SID__
相关产品推荐
相关产品推荐

