Help us learn about your current experience with the documentation. Take the survey.
保护规则与权限
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
保护规则控制对分支的访问,并决定当多个规则同时应用于同一分支时会发生什么。 它们帮助您为仓库分支实施适当的安全措施。这些规则涵盖:
- 权限级别、优先级和规则冲突。
- 跨多个匹配规则的强制推送权限。
- 代码所有者审批。
- 群组与项目之间的保护设置。
规则行为
当一个分支匹配多个保护规则时,会应用以下行为:
- 群组规则应用于群组中的所有项目,并且不能从项目设置中修改。 更多信息,请参阅跨群组和项目的规则。
- 当一个分支匹配多个规则时,最宽松的规则生效。然而, 代码所有者审批使用最严格的规则。
- 像
main这样的确切分支名称不会覆盖像m*这样的通配符模式。
推送与合并权限
当分支被保护时,默认行为会强制执行以下限制:
| 操作 | 谁可以执行 |
|---|---|
| 保护分支 | 至少需要 Maintainer 角色。 |
| 推送到分支 | 拥有 Allowed 权限的任何人。(1) |
| 强制推送到分支 | 无人。 |
| 删除分支 | 无人。(2) |
- 拥有 Developer 角色的用户可以在群组中创建项目,但可能不被允许初始推送到默认分支。
- 无人能使用 Git 命令删除受保护的分支,但拥有至少 Maintainer 角色的用户可以从 UI 或 API删除受保护的分支。
强制推送权限
强制推送权限遵循相同的“最宽松规则生效”逻辑。例如,考虑包含通配符的以下规则:
| 分支名称模式 | 允许强制推送 |
|---|---|
v1.x |
是 |
v1.* |
否 |
v* |
否 |
名为 v1.x 的分支匹配所有三个分支名称模式:v1.x、v1.* 和 v*。
由于最宽松的选项决定了行为,因此分支 v1.x 的最终权限为:
- 允许强制推送:在三个设置中,
Yes是最宽松的,并因此控制了分支的行为。 尽管该分支也匹配了v1.x和v*(它们各自有更严格的权限),但任何可以推送到此分支的用户也可以强制推送。
代码所有者审批
- Tier: Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
与推送和合并权限以及强制推送权限不同,代码所有者审批使用最严格的规则。 如果一个分支受多个规则保护,那么只要任何适用的规则启用了需要代码所有者审批,就需要代码所有者审批。 更多信息,请参阅要求代码所有者审批。
例如,考虑以下规则:
| 分支名称模式 | 需要代码所有者审批 |
|---|---|
v1.x |
是 |
v1.* |
否 |
v* |
否 |
名为 v1.x 的分支匹配所有三个分支名称模式:v1.x、v1.* 和 v*。
因为至少有一个规则(v1.x)要求代码所有者审批,所以所有合并到此分支的请求都必须在合并前获得 Code Owner 的批准。
跨群组和项目的规则
分支保护规则可以在群组和项目中同时设置:
- 群组规则应用于群组中的所有项目,并且不能从项目设置中修改。
- 项目规则仅适用于该特定项目。
当同时存在匹配某个分支的群组和项目规则时:
- 所有匹配的规则会被一起评估。
- 对于大多数设置,最宽松的规则生效。
- 对于代码所有者审批,最严格的规则生效。
您无法从项目设置中编辑或删除群组规则,但可以为同一分支添加额外的项目规则。例如:
- 一个针对
main的群组规则禁止强制推送。 - 您可以添加一个允许强制推送的
main项目规则。 - 两条规则都存在,但对于强制推送设置,更宽松的项目规则会生效。
多分支规则示例
以下示例展示了不同规则如何影响分支保护。
允许合并
这是一个确切分支名称不会覆盖更宽松的通配符模式的示例。
| 分支模式 | 允许合并 |
|---|---|
release-v1.0 |
无人 |
release* |
Maintainer |
* |
Developer + Maintainer |
- 分支
release-v1.0匹配所有三个模式。最宽松的规则生效:- 允许合并:Developer + Maintainer 可以合并(来自
*规则)。
- 允许合并:Developer + Maintainer 可以合并(来自
允许推送与合并
这是一个多个分支规则如何应用于不同分支名称的示例。
| 分支模式 | 允许合并 | 允许推送与合并 |
|---|---|---|
main |
Maintainer | 无人 |
m* |
Developer + Maintainer | Developer + Maintainer |
r* |
无人 | 无人 |
- 分支
main匹配两个模式(main和m*)。最宽松的规则生效:- 允许合并:Developer + Maintainer 可以合并(来自
m*规则)。 - 允许推送与合并:Developer + Maintainer 可以推送(来自
m*规则)。
- 允许合并:Developer + Maintainer 可以合并(来自
- 分支
release-v1.0匹配一个模式:- 允许合并:无人可以合并(来自
r*规则)。 - 允许推送与合并:无人可以推送(来自
r*规则)。
- 允许合并:无人可以合并(来自
代码所有者要求
代码所有者审批与其他分支保护设置的工作方式不同。当多个规则匹配时,最严格的规则生效,而不是最宽松的规则。
| 分支模式 | 需要代码所有者审批 |
|---|---|
production |
是 |
prod* |
否 |
p* |
是 |
- 分支
production匹配所有三个模式。最严格的规则生效:- 代码所有者审批:需要(来自
production和p*规则)。
- 代码所有者审批:需要(来自
- 分支
product-v1.0匹配两个模式(prod*和p*)。最严格的规则生效:- 代码所有者审批:需要(来自
p*规则)。
- 代码所有者审批:需要(来自
确保严格保护
为确保严格保护不被更宽松的模式覆盖,请将所有匹配的模式配置为相同的严格设置。
| 分支模式 | 允许合并 | 允许推送与合并 |
|---|---|---|
production |
Maintainer | 无人 |
prod* |
Maintainer | 无人 |
p* |
Maintainer | 无人 |
* |
Maintainer | 无人 |
现在,分支 production 具有严格的推送权限,因为所有匹配的规则都指定了无人可以推送。