GitHub Rulesets 怎么只限制发布分支
来源:17golang原创
时间:2026-10-05 21:36:35 430浏览 收藏
GitHub Rulesets 只限制发布分支,关键不是先勾保护项,而是先把 Target branches 的目标范围收窄:单层发布分支用 release/*,可能包含多级目录的发布分支用 release/**/*。不要选择 All branches,也不要把 Default branch 当作发布分支范围。这样规则集会保护 release/1.8 一类分支,同时不影响 main、develop 和 feature/login。
官方文档:https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/creating-rulesets-for-a-repository
- 规则集名称:
release-branch-policy。 - 目标模式:单层用
release/*,多层用release/**/*。 - 推荐规则:必须走 Pull Request、必须通过状态检查、禁止强制推送、限制删除。
- 生效状态:配置完成并核对范围后,将 Enforcement status 设为 Active。
先确定发布分支到底有几层
GitHub 的分支规则模式使用 fnmatch 语法。由于路径匹配按目录分隔符处理,* 不会跨过斜杠。因此,release/* 适合 release/1.8、release/2026-10 这样的单层命名,但不会覆盖 release/hotfix/1.8.1。如果团队允许发布分支继续分层,就应改用 release/**/*。
| 分支样例 | release/* | release/**/* |
|---|---|---|
release/1.8 | 命中 | 命中 |
release/hotfix/1.8.1 | 不命中 | 命中 |
main | 不命中 | 不命中 |
develop | 不命中 | 不命中 |
feature/login | 不命中 | 不命中 |
若仓库目前只有单层发布分支,优先使用范围更小的 release/*。只有命名规范确实允许多层目录时,再扩大到 release/**/*,避免未来出现意外命中。
步骤一:新建分支规则集,先保持 Disabled
- 进入目标仓库,依次打开 Settings > Rules > Rulesets。
- 点击 New ruleset > New branch ruleset。
- 在 Ruleset Name 填写
release-branch-policy。 - 配置阶段先把 Enforcement status 保持为 Disabled,完成范围核对后再激活。

这一步的成功状态是:页面顶部显示 release-branch-policy,类型为分支规则集,Enforcement status 仍是 Disabled。Disabled 适合先配置、先核对,不会立即把未完成的规则施加到开发流程。
步骤二:只添加发布分支模式
- 找到 Target branches 区域,点击 Add a target。
- 选择 Include by pattern,不要选 All branches。
- 单层发布分支输入
release/*;需要覆盖多级目录时输入release/**/*。 - 点击 Add inclusion pattern 保存目标模式。

保存后,Target branches 区域应只显示刚添加的包含模式。若同时存在 Default branch、All branches 或过宽的包含模式,先删除多余目标;否则即使保护规则本身正确,也会把范围扩到非发布分支。
步骤三:选择保护项并切换为 Active
在 Rules 区域按团队发布流程启用规则。对多数发布分支,下面四项已经能形成清晰的最小保护集合:
- Require a pull request before merging:发布改动必须经过 Pull Request,而不是直接推送。
- Require status checks to pass before merging:至少添加一个实际存在的 CI 检查;若还要求分支保持最新,也要先选定具体检查。
- Block force pushes:阻止重写发布分支历史。
- Restrict deletions:避免发布分支被随意删除。
不要把 Restrict updates 当作“必须走 PR”的同义项。它会把更新权限收紧到旁路名单中的角色、团队或应用,配置不当时,正常 Pull Request 合并也可能被拦截。只有明确要求“仅发布管理员或部署应用可更新”时才启用,并提前配置对应 Bypass list。
旁路名单应遵循最小权限:只加入发布负责人、发布团队或部署应用。如果希望这些角色仍然留下 Pull Request 记录,可以把旁路方式限制为 For pull requests only。不要为了省事给全部管理员添加宽泛旁路,否则规则表面 Active,关键人员却可以完全绕过。
确认 Target branches、规则和 Bypass list 后,把 Enforcement status 改为 Active,再点击页面底部的 Create。Active 规则集创建后会立即对命中的分支生效。

结果核对:先看命中范围,再看操作限制
回到 Settings > Rules > Rulesets,打开 release-branch-policy。先确认状态为 Active,目标模式没有混入 All branches,再按下表验证。这里的“验证”是检查规则设计是否符合仓库命名,不需要为了测试而修改生产发布分支。
| 核对项 | 期望结果 | 不符合时优先检查 |
|---|---|---|
release/1.8 | 被规则集命中 | Include by pattern 是否保存 |
release/hotfix/1.8.1 | 仅在使用 release/**/* 时命中 | 是否误把 * 当成跨斜杠通配符 |
main、develop | 不被本规则集命中 | 是否同时选了 Default branch 或 All branches |
| 直接推送发布分支 | 按启用规则被阻止 | 旁路名单是否过宽 |
| Pull Request 合并 | 状态检查通过后才可合并 | 是否实际添加了 CI 检查 |
常见异常与修正
多级发布分支没有被保护
原因通常是使用了 release/*。它只覆盖一个斜杠后的单层名称。把目标模式改为 release/**/*,再重新核对单层和多层分支。
main 或 feature 分支也被限制了
先检查本规则集是否误选 All branches、Default branch 或其他过宽模式。如果这里没有问题,再查看仓库中的其他 Rulesets 和 Branch protection rules。GitHub 会聚合同一分支上的多套规则,重叠时以更严格的结果为准,因此影响来源不一定是当前规则集。
勾选状态检查后仍能直接合并
仅打开 Require status checks 还不够,需要在该规则下添加实际的 CI 检查。若没有可选项,先让对应工作流在仓库中成功运行一次,再回到规则集选择检查名称。
发布负责人明明在旁路名单里,仍被要求走 PR
检查旁路模式是否设为 For pull requests only。这个模式允许角色绕过部分限制,但仍要求从 Pull Request 路径进入,适合保留审批和审计记录。如果确实需要完全旁路,应由团队明确批准后再调整。
看不到 Rulesets 或无法激活
先确认当前账号拥有仓库规则管理权限,再核对仓库可见性与所在组织的 GitHub 套餐。Rulesets 的可用范围与仓库类型、个人或组织套餐有关,权限不足时不要改用更宽松的临时分支保护绕过流程。
归档这次规则变更
规则集创建后,建议在仓库运维记录中保存六项信息:规则集名称、目标模式、Enforcement status、启用规则、状态检查名称、旁路角色或应用,以及本次变更原因。以后发布分支命名从单层调整为多层时,就能准确判断是修改 release/*,还是新增一个独立规则集,而不会靠猜测扩大保护范围。
最终判断标准很简单:详情页显示 release-branch-policy 为 Active,目标只含 release/* 或 release/**/*,发布分支受到预期保护,而 main、develop 和普通功能分支不受这套规则集影响。
-
455 收藏
-
124 收藏
-
311 收藏
-
462 收藏
-
485 收藏
-
文章 · 软件教程 | 5小时前 | 开发环境 · vs code · VS Code Docker Compose Dockerfile devcontainer.json Dev Containers368 收藏
-
345 收藏
-
130 收藏
-
199 收藏
-
372 收藏
-
文章 · 软件教程 | 20小时前 | 命令行 · 效率工具 · github · 开发工具 · 软件教程 · 位置参数 命令别名 GitHub CLI gh alias set shell alias404 收藏
-
378 收藏
-
360 收藏
-
395 收藏
-
287 收藏
-
264 收藏
-
409 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习