You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置分支合并规则,仅允许指定分支合并到main分支?

分支合并权限限制配置方案

根据你的需求,要实现「仅允许UAT合并到main、仅允许Dev合并到UAT」的规则,不同Git平台有对应的实现方式,以下是主流平台的配置方法:

GitHub

  1. 通过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阶段失败,无法合并。

  2. 结合分支保护规则增强限制
    进入仓库「Settings」→「Branches」→「Branch protection rules」,分别为main和UAT分支开启:

    • 勾选「Require pull request reviews before merging」
    • 勾选「Require status checks to pass before merging」,并将上面创建的CI工作流添加为必填检查项
      这样能进一步确保只有通过验证的PR才能合并。

GitLab

  1. 通过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
    

    提交后,不符合规则的合并请求会触发流水线失败,阻止合并。

  2. 配置受保护分支权限
    进入仓库「Settings」→「Repository」→「Protected branches」,分别编辑main和UAT分支:

    • 在「Allowed to merge」中仅添加负责合并对应源分支的角色/用户,减少误操作的可能。

通用Git服务器(自定义钩子)

如果使用自建Git服务器,可以通过服务器端的pre-receive钩子拦截不符合规则的合并:

  1. 在服务器的仓库目录下,进入hooks文件夹,创建pre-receive文件
  2. 添加以下脚本内容:
    #!/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
    
  3. 给文件添加执行权限:chmod +x pre-receive
    这样任何不符合规则的推送都会被服务器拦截。

内容的提问来源于stack exchange,提问作者SID__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:05:55