默认启用所有未来分支Pull Requests,实现周期分支自动配置保护
自动配置循环重建的desenv分支:启用PR并设为受保护
嘿,这个自动配置分支的需求我太懂了——多个团队循环创建desenv分支,每次手动设置确实烦死人!我给你分享几个主流Git平台的解决方案,保证一劳永逸:
一、GitLab 解决方案
1. 最简单的方式:通配符分支保护规则
这是最直接的方法,不用写代码就能搞定:
- 进入项目的「设置」→「仓库」→「分支保护」
- 点击「添加分支保护规则」,在「分支名称」里填入匹配你desenv分支的通配符,比如:
- 如果所有团队的desenv分支都是
desenv-<团队名>格式,填desenv-* - 如果是带团队前缀的路径式分支(比如
team-a/desenv),填*/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
相关产品推荐
相关产品推荐

