受保护分支

  • Tier: 基础版,专业版,旗舰版
  • Offering: JihuLab.com, 私有化部署

极狐GitLab 中的受保护分支对分支实施特定权限,以确保代码稳定性和质量。受保护分支:

  • 控制哪些用户可以合并和推送代码更改。
  • 防止意外删除关键分支。
  • 强制执行代码审查和审批流程。
  • 管理代码所有者审批和 CODEOWNERS 文件限制。
  • 调节强制推送权限以维护提交历史。
  • 通过 UI 和受保护分支 API控制访问。

您的存储库的默认分支默认是受保护的。

谁可以修改受保护分支#

History
    • 分支推送权限变更,要求极狐GitLab 管理员在极狐GitLab 16.0 中也拥有允许权限。

当分支受保护时,默认行为在分支上强制执行这些限制。

操作谁可以执行
保护分支至少是维护者角色。
推送到分支任何拥有允许权限的人。(1)
强制推送到分支无人。
删除分支无人。(2)
  1. 拥有开发者角色的用户可以在群组中创建项目,但可能不允许最初推送到默认分支
  2. 无人可以使用 Git 命令删除受保护分支,但至少拥有维护者角色的用户可以从 UI 或 API 删除受保护分支

您可以实施合并请求审批策略,以防止受保护分支被取消保护或删除。

当分支匹配多个规则时#

当分支匹配多个规则时,最宽松的规则决定分支的保护级别。例如,考虑这些规则,其中包括通配符:

分支名称模式允许合并允许推送和合并
v1.x维护者维护者
v1.*维护者 + 开发者维护者
v*无人无人

分支名为 v1.x 是所有三个分支名称模式的大小写敏感匹配:v1.xv1.*v*。由于最宽松的选项决定行为,分支 v1.x 的结果权限为:

  • 允许合并: 在三个设置中,维护者 + 开发者 是最宽松的,并因此控制分支行为。即使分支也匹配 v1.xv*(每个都有更严格的权限),开发者角色的用户可以合并到分支。
  • 允许推送和合并: 在三个设置中,维护者 是最宽松的,并因此控制分支行为。即使匹配 v* 的分支设置为 无人,也匹配 v1.xv1.* 的分支获得更宽松的 维护者 权限。

要确保规则控制分支的行为,所有其他匹配的模式必须应用更少或同样宽松的规则。

如果您想确保 无人 被允许推送到分支 v1.x,每个匹配 v1.x 的模式必须将 允许推送和合并 设置为 无人,如下所示:

分支名称模式允许合并允许推送和合并
v1.x维护者无人
v1.*维护者 + 开发者无人
v*无人无人

设置默认分支保护级别#

管理员可以在管理员区域设置默认分支保护级别

添加保护到现有分支#

为群组中的所有项目或仅为一个项目配置受保护分支。

对于一个项目#

先决条件:

  • 您必须至少拥有维护者角色。
  • 当授予群组允许合并允许推送和合并权限到受保护分支时,项目必须可以访问并与群组共享。有关更多信息,请参阅共享项目

要保护分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。

  2. 选择设置 > 存储库

  3. 展开受保护分支

  4. 选择添加受保护分支

  5. 分支下拉列表中,选择您要保护的分支。

  6. 允许合并列表中,选择可以合并到此分支的角色。

  7. 允许推送和合并列表中,选择可以推送到此分支的角色。

在极狐GitLab 专业版和旗舰版中,您还可以添加群组或个人用户到允许合并允许推送和合并

  1. 选择保护

受保护分支显示在受保护分支列表中。

对于群组中的所有项目#

  • Tier: Premium, Ultimate
  • Offering: 极狐GitLab 私有化部署
History
    • 在极狐GitLab 15.9 中引入,使用名为 group_protected_branches功能标志。默认禁用。
    • 在极狐GitLab 17.6 中 GA。功能标志 group_protected_branches 被移除。

群组所有者可以为群组创建受保护分支。这些设置由群组中的所有项目继承,不能被项目设置覆盖。

先决条件:

  • 您必须拥有群组的所有者角色。
  • 群组必须是顶级群组。不支持子群组。

要为群组中的所有项目保护分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的群组。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 分支文本框中,输入分支名称或通配符。分支名称和通配符是大小写敏感的
  6. 允许合并列表中,选择可以合并到此分支的角色。
  7. 允许推送和合并列表中,选择可以推送到此分支的角色。
  8. 选择保护

受保护分支被添加到受保护分支列表中。

将群组添加到受保护分支#

要设置群组或子群组的成员为允许合并允许推送和合并到受保护分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。

  2. 选择设置 > 存储库

  3. 展开受保护分支

  4. 将群组添加到以下字段:

    plaintext
    # 允许群组成员合并到此分支 Allowed to merge: @group-x # 允许群组成员推送和合并到此分支 Allowed to push and merge: @group-x/subgroup-y

当您将群组分配给受保护分支时,只有该群组的直接成员被包括在内。父群组的成员不会自动获得受保护分支的权限。

群组继承和资格#

Rendering chart...

在这个例子中:

  • 父群组 X (group-x) 拥有项目 A
  • 父群组 X 还包含一个子群组,子群组 Y (group-x/subgroup-y)。
  • 项目 A子群组 Y共享。

受保护分支权限的合格群组包括:

  • 项目 A:包括群组 X子群组 Y,因为项目 A子群组 Y共享。

共享项目与群组以获得受保护分支权限#

您可以与群组或子群组共享项目,以便他们的成员有资格获得受保护分支权限。

Rendering chart...

要授予子群组 Y成员对项目 A的访问权限,您必须与子群组共享项目。直接将子群组添加到受保护分支设置中是无效的,并且不适用于子群组成员。

要使群组拥有受保护分支权限,项目必须直接与该群组共享。来自父群组的项目成员继承不足以获得受保护分支权限。

使用通配符规则保护多个分支#

使用通配符时,可以对单个分支应用多个规则。如果对分支应用了多个规则,_最宽松_的规则控制分支的行为。为了正确地进行合并控制,请将允许推送和合并设置为比允许合并更广泛的用户集。

先决条件:

  • 您必须至少拥有维护者角色。

要同时保护多个分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。

  2. 选择设置 > 存储库

  3. 展开受保护分支

  4. 选择添加受保护分支

  5. 分支下拉列表中,输入分支名称和通配符。分支名称和通配符是大小写敏感的。例如:

    通配符受保护分支匹配的分支
    *-stableproduction-stablestaging-stable
    production/*production/app-serverproduction/load-balancer
    *gitlab*gitlabgitlab/stagingmaster/gitlab/production
  6. 允许合并列表中,选择可以合并到此分支的角色。

  7. 允许推送和合并列表中,选择可以推送到此分支的角色。在极狐GitLab 专业版或旗舰版中,您还可以添加群组或个人用户。

  8. 选择保护

受保护分支显示在受保护分支列表中。

要求所有人提交受保护分支的合并请求#

您可以强制所有人提交合并请求,而不是允许他们直接签入受保护分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 分支下拉列表中,选择您要保护的分支。
  6. 允许合并列表中,选择开发者 + 维护者
  7. 允许推送和合并列表中,选择无人
  8. 选择保护

或者,您可以创建编辑分支规则。然后:

  1. 允许合并部分中选择编辑
  2. 选择开发者和维护者
  3. 选择保存更改

允许所有人直接推送到受保护分支#

您可以允许所有具有写入权限的人推送到受保护分支。

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 分支下拉列表中,选择您要保护的分支。
  6. 允许推送和合并列表中,选择开发者 + 维护者
  7. 选择保护

或者,您可以创建编辑分支规则。然后:

  1. 允许推送和合并部分中选择编辑
  2. 选择开发者和维护者
  3. 选择保存更改

允许部署密钥推送到受保护分支#

您可以使用部署密钥推送到受保护分支。

先决条件:

  • 部署密钥必须为您的项目启用。项目部署密钥在创建时默认启用。然而,公共部署密钥必须授予项目访问权限。
  • 部署密钥必须对您的项目存储库具有写入访问权限
  • 部署密钥的所有者必须至少对项目具有读取访问权限。
  • 部署密钥的所有者还必须是项目的成员。

要允许部署密钥推送到受保护分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 分支下拉列表中,选择您要保护的分支。
  6. 允许推送和合并列表中,选择部署密钥。
  7. 选择保护

部署密钥在允许合并下拉列表中不可用。

允许对受保护分支进行强制推送#

您可以允许对受保护分支进行强制推送

要保护新分支并启用强制推送:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 分支下拉列表中,选择您要保护的分支。
  6. 允许推送和合并允许合并列表中,选择您想要的设置。
  7. 要允许所有具有推送权限的用户进行强制推送,请打开允许强制推送切换。
  8. 选择保护

要在已经受保护的分支上启用强制推送:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 在受保护分支列表中,找到该分支,打开允许强制推送切换。

或者,您可以创建编辑分支规则。然后:

  1. 在受保护分支列表中,找到该分支,打开允许强制推送切换。

可以推送到此分支的成员现在也可以进行强制推送。

当分支匹配多个规则时#

当分支匹配多个规则时,最宽松的规则决定分支的保护级别。例如,考虑这些规则,其中包括通配符:

分支名称模式允许强制推送
v1.x
v1.*
v*

分支名为 v1.x 匹配所有三个分支名称模式:v1.xv1.*v*。由于最宽松的选项决定行为,分支 v1.x 的结果权限为:

  • 允许强制推送: 在三个设置中, 是最宽松的,并因此控制分支行为。即使分支也匹配 v1.xv*(每个都有更严格的权限),任何可以推送到此分支的用户也可以进行强制推送。

在受保护分支上要求代码所有者审批#

  • Tier: 专业版,旗舰版
  • Offering: JihuLab.com, 私有化部署

对于受保护分支,您可以要求至少一个代码所有者进行审批。如果分支受到多个规则保护,则如果任何适用规则启用了代码所有者的必需审批,则需要代码所有者的审批。

要保护新分支并启用代码所有者的审批:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 分支下拉列表中,选择您要保护的分支。
  6. 允许推送和合并允许合并列表中,选择您想要的设置。
  7. 打开要求代码所有者审批切换。
  8. 选择保护

要在已经受保护的分支上启用代码所有者的审批:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择设置 > 存储库
  3. 展开受保护分支
  4. 选择添加受保护分支
  5. 在受保护分支列表中,找到该分支,打开代码所有者审批切换。

或者,您可以创建编辑分支规则。然后,在受保护分支列表中,找到该分支,打开代码所有者审批切换。

启用后,所有这些分支的合并请求在合并之前需要根据匹配规则由代码所有者审批。此外,如果匹配规则,直接推送到受保护分支被拒绝。

任何未在 CODEOWNERS 文件中指定的用户都不能推送指定文件或路径的更改,除非他们被特别允许。您无需限制开发人员直接推送到受保护分支。相反,您可以限制推送到需要代码所有者审查的特定文件。

在极狐GitLab 专业版 13.5 及更高版本中,允许推送到受保护分支的用户和群组不需要合并请求来合并他们的功能分支。因此,他们可以跳过合并请求审批规则,包括代码所有者。

在受保护分支上运行流水线#

合并或推送到受保护分支的权限定义了用户是否可以运行 CI/CD 流水线并执行作业上的操作。

因为合并请求流水线在源分支上运行,如果打开合并请求的用户没有权限合并或推送到源分支,则不会创建流水线。

有关流水线安全模型的详细信息,请参阅受保护分支上的安全性

创建具有保护的新分支#

先决条件:

要创建具有保护的新分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择代码 > 分支
  3. 选择新分支
  4. 填写分支名称并选择现有分支、标签或提交以作为新分支的基础。如果您要求所有人提交受保护分支的合并请求,则仅接受现有受保护分支和已在受保护分支中的提交。

您还可以使用分支 API创建具有保护的分支。

如果分支保护配置为允许所有人直接推送到受保护分支,则可以从命令行或 Git 客户端应用程序创建具有保护的分支。

删除受保护分支#

至少拥有维护者角色的用户可以通过使用极狐GitLab 网页界面手动删除受保护分支:

  1. 在左侧边栏中,选择搜索或前往并找到您的项目。
  2. 选择代码 > 分支
  3. 在您要删除的分支旁边,选择删除 ()。
  4. 在确认对话框中,输入分支名称并选择是,删除受保护分支。分支名称是大小写敏感的

受保护分支只能通过 UI 或 API 使用极狐GitLab 删除。这可以防止通过本地 Git 命令或第三方 Git 客户端意外删除分支。

故障排除#

分支名称是大小写敏感的#

git 中的分支名称是大小写敏感的。配置受保护分支时,或者配置您的目标分支工作流程时,dev 不同于 DEVDev