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

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

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

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

有关当分支匹配多个规则或具有复杂权限要求时保护规则的行为信息,请参阅 保护规则和权限

保护分支

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

在项目中

先决条件:

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

要保护分支:

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

  2. 选择 设置 > 仓库

  3. 展开 受保护的分支

  4. 选择 添加受保护分支

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

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

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

    在 GitLab Premium 和 Ultimate 中,您还可以将组或单个用户添加到 允许合并允许推送和合并

  8. 选择 保护

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

在组中

  • Tier: Premium, Ultimate
  • Offering: GitLab Self-Managed

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

先决条件:

  • 您必须拥有该组的 Owner 角色。
  • 该组必须是顶级组。不支持子组。

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

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

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

默认分支保护设置

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

使用通配符规则

使用通配符时,多个规则可能适用于单个分支。 如果多个规则适用于一个分支,则最宽松的规则控制分支的行为。 为了使合并控制正常工作,请将 允许推送和合并 设置为比 允许合并 更广泛的用户集。

先决条件:

  • 您必须至少拥有 Maintainer 角色。

要同时保护多个分支:

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

  2. 选择 设置 > 仓库

  3. 展开 受保护的分支

  4. 选择 添加受保护分支

  5. 分支 下拉列表中,输入分支名称和通配符 (*)。 分支名称和通配符 区分大小写。例如:

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

  7. 允许推送和合并 列表中,选择可以推送到此分支的角色。在 GitLab Premium 或 Ultimate 中,您还可以添加组或单个用户。

  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. 将组添加到以下字段:

    # 允许组成员合并到此分支
    允许合并: @group-x
    
    # 允许组成员推送和合并到此分支
    允许推送和合并: @group-x/subgroup-y

当您将组分配给受保护分支时,仅包括该组的直接成员。 来自父组的成员不会自动获得受保护分支的权限。

组继承要求

%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
    accTitle: 受保护分支的组继承图
    accDescr: 如果项目与组共享,组成员将继承受保护分支的权限。
    A[父组 X] -->|拥有| B[项目 A]
    A -->|包含| C[子组 Y]
    B -->|共享给| C
    C -->|成员继承权限| B

在此示例中:

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

受保护分支权限的合格组是:

  • 项目 A:组 X 和子组 Y,因为项目 A 与子组 Y 共享。

与组共享项目

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

%%{init: { "fontFamily": "GitLab Sans" }}%%
graph LR
    accTitle: 受保护分支权限的项目共享图
    accDescr: 与组共享项目会影响其成员是否可以拥有受保护分支权限。
    A[父组 X] -->|拥有| B[项目 A]
    A -->|也包含| C[子组 Y]
    C -.->D{将项目 A<br/>与子组 Y 共享?} -.->|是| E[子组 Y 的成员<br/>可以拥有受保护<br/>分支权限]
    D{将项目 A<br/>与子组 Y 共享?} -.->|否| F[子组 Y 的成员<br />无法拥有受保护<br/>分支权限]
    E -.->|将子组 Y<br/>添加到受保护分支设置| I[子组 Y 成员<br/>可以合并/推送] -.-> B
    F -.-> |将子组 Y<br/>添加到受保护分支设置| J[设置将不会<br/>生效] -.-> B

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

为了使组拥有受保护分支权限,项目必须直接与该组共享。 从父组继承的项目成员身份不足以获得受保护分支权限。

启用部署密钥访问

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

先决条件:

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

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

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

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

允许强制推送

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

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

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

要为已受保护的分支启用强制推送:

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

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

  1. 在受保护分支列表中,在分支旁边打开 允许强制推送 开关。

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

要求代码所有者审批

  • Tier: Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

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

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

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

为已受保护的分支启用代码所有者审批:

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

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

启用后,这些分支的所有合并请求都需要匹配规则的代码所有者审批才能合并。 此外,如果匹配了规则,则直接推送到受保护分支将被拒绝。

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

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

受保护分支上的 CI/CD

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

合并请求管道在源分支或基于源分支的合并请求引用上运行。如果用户没有权限合并或推送到源分支,则不会创建管道。

当合并请求在受保护分支之间时,如果用户有权限更新源分支和目标分支,受保护变量和运行器对管道可用

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

创建受保护分支

先决条件:

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

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

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

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

删除受保护分支

拥有至少 Maintainer 角色的用户可以通过 GitLab Web 界面手动删除受保护分支:

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

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

策略执行

为了安全和合规,您可以实施 合并请求审批策略,这会影响您在实例、组或项目中定义的设置。策略可能会影响用户取消保护或删除分支、推送或强制推送的能力。

相关主题

故障排除

分支名称区分大小写

git 中的分支名称区分大小写。当配置您的受保护分支时, 或您的 目标分支工作流devDEVDev 不同。