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

默认启用所有未来分支Pull Requests,实现周期分支自动配置保护

自动配置循环重建的desenv分支:启用PR并设为受保护

嘿,这个自动配置分支的需求我太懂了——多个团队循环创建desenv分支,每次手动设置确实烦死人!我给你分享几个主流Git平台的解决方案,保证一劳永逸:

一、GitLab 解决方案

1. 最简单的方式:通配符分支保护规则

这是最直接的方法,不用写代码就能搞定:

  • 进入项目的「设置」→「仓库」→「分支保护」
  • 点击「添加分支保护规则」,在「分支名称」里填入匹配你desenv分支的通配符,比如:
    • 如果所有团队的desenv分支都是desenv-<团队名>格式,填desenv-*
    • 如果是带团队前缀的路径式分支(比如team-a/desenv),填*/desenv
  • 然后勾选你需要的规则:
    • 必选:要求合并请求才能合并、受保护分支
    • 可选:设置合并/推送权限、需要代码审查等
  • 保存后,任何新创建的符合通配符规则的分支,都会自动应用这些保护和PR要求,不管是从release-branch重建还是其他方式创建的。

2. 进阶:CI/CD + API 精准控制(仅允许从release-branch创建的分支生效)

如果需要更严格的控制——只有从release-branch拉取创建的desenv分支才自动配置,可以用GitLab CI/CD配合API实现:

  • 首先在项目的「设置」→「CI/CD」→「变量」里添加一个GITLAB_TOKEN,这个token需要有api和write_repository权限。
  • 在项目根目录创建.gitlab-ci.yml,添加以下作业:
auto-protect-desenv:
  stage: .pre
  script:
    - |
      # 检查当前分支是否是desenv类型分支
      if [[ "$CI_COMMIT_BRANCH" == desenv-* ]]; then
        # 获取当前分支的父分支(确认是否来自release-branch)
        git fetch origin release-branch
        PARENT_BRANCH_HASH=$(git merge-base --fork-point origin/release-branch "$CI_COMMIT_BRANCH")
        RELEASE_BRANCH_HASH=$(git rev-parse origin/release-branch)
        
        if [[ "$PARENT_BRANCH_HASH" == "$RELEASE_BRANCH_HASH" ]]; then
          # 调用GitLab API设置分支保护和PR要求
          curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
            "$CI_API_V4_URL/projects/$CI_PROJECT_ID/protected_branches" \
            --form "name=$CI_COMMIT_BRANCH" \
            --form "merge_access_level=40" \ # 40代表开发者权限,可按需调整
            --form "push_access_level=40" \
            --form "require_pull_request_before_merge=true"
          echo "成功为分支 $CI_COMMIT_BRANCH 配置保护规则和PR要求!"
        else
          echo "分支 $CI_COMMIT_BRANCH 不是从release-branch创建的,跳过配置"
        fi
      fi
  only:
    - branches
  except:
    - tags

这个流水线会在任何分支创建时触发,自动检查分支类型和来源,符合条件的就自动配置。

二、GitHub 解决方案

1. 最简单的方式:通配符分支保护规则

和GitLab类似,GitHub也支持通配符分支保护:

  • 进入仓库的「Settings」→「Branches」→「Branch protection rules」
  • 点击「Add rule」,在「Branch name pattern」里填入通配符,比如desenv-*或*/desenv
  • 勾选必要的规则:
    • 必选:Require a pull request before merging、Protect matching branches
    • 可选:设置需要的批准数、状态检查等
  • 保存后,新创建的匹配分支会自动应用这些规则。

2. 进阶:GitHub Actions 精准控制

如果需要校验分支来源,可以用GitHub Actions实现:

  • 在仓库的.github/workflows目录下创建auto-protect-desenv.yml文件:
name: Auto Protect Desenv Branches
on:
  create:
    branches:
      - desenv-* # 匹配你的desenv分支格式

jobs:
  validate-and-protect:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0 # 拉取所有历史,方便检查分支来源

      - name: Verify branch comes from release-branch
        id: verify-source
        run: |
          # 获取release-branch的哈希值
          RELEASE_HASH=$(git rev-parse origin/release-branch)
          # 获取当前分支的父分支哈希值
          PARENT_HASH=$(git merge-base --fork-point origin/release-branch "${GITHUB_REF#refs/heads/}")
          
          if [[ "$PARENT_HASH" == "$RELEASE_HASH" ]]; then
            echo "is_valid=true" >> $GITHUB_OUTPUT
          else
            echo "is_valid=false" >> $GITHUB_OUTPUT
          fi

      - name: Apply branch protection
        if: steps.verify-source.outputs.is_valid == 'true'
        uses: actions/github-script@v6
        with:
          script: |
            const branchName = context.ref.replace('refs/heads/', '');
            await github.rest.repos.updateBranchProtection({
              owner: context.repo.owner,
              repo: context.repo.repo,
              branch: branchName,
              required_pull_request_reviews: { required_approving_review_count: 1 },
              enforce_admins: true,
              allow_force_pushes: false,
              allow_deletions: false,
              required_conversation_resolution: true
            });
            console.log(`Successfully protected branch ${branchName}`);

这个Action会在创建desenv分支时自动触发,校验是否来自release-branch,符合条件就自动配置分支保护和PR要求。

注意事项

  • 通配符规则要精准,避免误匹配其他分支;如果是多团队分支,建议用带团队前缀的规则(比如team-a/desenv-*)
  • API/Action使用的token需要足够的权限,GitLab的token要确保有分支修改权限,GitHub的GITHUB_TOKEN默认在Actions中拥有仓库的读写权限
  • 如果是跨多个仓库的需求,可以把这些配置做成模板,方便团队快速复用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:09:21