gitlab分支保护
在 GitLab 中,权限基本上是围绕对存储库和分支具有读或写权限的想法来定义的。对某些分支机构施加进一步的限制,可以对它们进行保护。
受保护的分支控制:
- 哪些用户可以合并到分支中。
- 哪些用户可以推送到分支。
- 如果用户可以强制推送到分支。
- 如果对 CODEOWNERS 文件中列出的文件进行更改可以直接推送到分支。
- 哪些用户可以取消对分支的保护。
默认情况下,存储库的默认分支受到保护。
谁可以修改受保护的分支
分支推送权限更改为要求 GitLab 管理员也拥有GitLab 16.0 中允许的权限。
当分支受到保护时,默认行为会对该分支强制执行这些限制。
行动 | 谁能做到 |
---|---|
保护分支 | 至少是维护者角色。 |
推送到分支 | 具有允许权限的任何人。(1) |
强制推送到分支 | 没有人。(3) |
删除分支 | 没有人。(2) |
- 具有开发人员角色的用户可以在组中创建项目,但可能不允许最初推送到默认分支。
- 没有人可以使用 Git 命令删除受保护的分支,但是,至少具有维护者角色的用户可以从 UI 或 API 删除受保护的分支。
- 如果
group_protected_branches
启用了功能标志并且同一分支在组和项目级别都受到保护,则在项目级别为该分支配置的强制推送设置将被忽略。所有其他保护继续使用项目级别设置。
当一个分支匹配多个规则时
当一个分支匹配多个规则时,最宽松的规则决定该分支的保护级别。例如,考虑以下规则,其中包括 通配符:
分支名称模式 | 允许合并 | 允许推送和合并 |
---|---|---|
v1.x |
维护者 | 维护者 |
v1.* |
维护者+开发者 | 维护者 |
v* |
没有人 | 没有人 |
名为 的分支v1.x
与所有三个分支名称模式匹配:v1.x
、v1.*
和v*
。由于最宽松的选项决定了行为,因此分支的最终权限v1.x
为:
- 允许合并:在三个设置中,
Maintainer + Developer
是最宽松的,并因此控制分支行为。即使分支也匹配v1.x
andv*
(每个都有更严格的权限),具有开发人员角色的用户可以合并到分支中。 - 允许推送和合并:在三个设置中,
Maintainer
是最宽松的,并因此控制分支行为。即使分支匹配v*
设置为No one
,分支也匹配v1.x
或v1.*
接收更宽松的Maintainer
权限。
为了确保规则控制分支的行为, 所有其他匹配的模式必须应用较少或同样宽松的规则。
如果要确保No one
允许推送到分支v1.x
,则每个匹配的模式都v1.x
必须设置Allowed to push and merge
为No one
,如下所示:
分支名称模式 | 允许合并 | 允许推送和合并 |
---|---|---|
v1.x |
维护者 | 没有人 |
v1.* |
维护者+开发者 | 没有人 |
v* |
没有人 | 没有人 |
设置默认分支保护级别
管理员可以在管理区域中设置默认的分支保护级别 。
为现有分支添加保护
为组中的所有项目或仅为一个项目配置受保护的分支。
对于一个项目
先决条件:
- 您必须至少具有维护者角色。
- 为受保护分支授予“允许合并”或“允许推送合并”权限时,必须将该组添加到项目中。
保护分支:
-
在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
-
选择设置 > 存储库。
-
展开受保护的分支。
-
选择添加受保护分支。
-
从分支下拉列表中,选择要保护的分支。
-
从允许合并列表中,选择可以合并到此分支的角色。
-
从允许推送和合并列表中,选择可以推送到此分支的角色。
在 GitLab Premium 和 Ultimate 中,您还可以将组或个人用户添加到允许合并和允许推送和合并。
-
选择保护。
受保护的分支显示在受保护的分支列表中。
对于组中的所有项目优质的所有产品
在 GitLab 15.9 中引入,带有名为 的标志group_protected_branches
。默认禁用。
在自我管理的 GitLab 上,默认情况下此功能不可用。为了使其可用,管理员可以 启用 名为 的功能标志group_protected_branches
。在 GitLab.com 上,此功能不可用。
组所有者可以为组创建受保护的分支。这些设置由组中的所有项目继承,并且不能被项目设置覆盖。如果特定分支在组级别和项目级别都配置了“允许强制推送”设置,则**项目级别的“允许强制推送”**设置将被忽略,而采用组级别设置。
先决条件:
- 您必须在组中具有所有者角色。
要保护组中所有项目的分支:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的组。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 在“分支”文本框中,键入分支名称或通配符。
- 从允许合并列表中,选择可以合并到此分支的角色。
- 从允许推送和合并列表中,选择可以推送到此分支的角色。
- 选择保护。
受保护的分支将添加到受保护的分支列表中。
使用通配符规则保护多个分支
使用通配符时,多个规则可以应用于单个分支。如果多个规则适用于一个分支,则最宽松的规则将控制该分支的行为方式。为了使合并控件正常工作,请将 “允许推送和合并”设置为比**“允许合并”**更广泛的用户组。
先决条件:
- 您必须至少具有维护者角色。
同时保护多个分支:
-
在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
-
选择设置 > 存储库。
-
展开受保护的分支。
-
选择添加受保护分支。
-
从分支下拉列表中,输入分支名称和通配符。例如:
通配符保护分支 配套分行 *-stable
production-stable
,staging-stable
production/*
production/app-server
,production/load-balancer
*gitlab*
gitlab
,gitlab/staging
,master/gitlab/production
-
从允许合并列表中,选择可以合并到此分支的角色。
-
从允许推送和合并列表中,选择可以推送到此分支的角色。在 GitLab Premium 或 Ultimate 中,您还可以添加组或个人用户。
-
选择保护。
受保护的分支显示在受保护的分支列表中。
创建一个具有保护的新分支
至少具有开发人员角色的用户可以创建新的受保护分支。
先决条件:
- 允许推送和合并设置为No one。
- 允许合并设置为Developers。
您可以仅使用 UI 或 API 创建受保护的分支。这可以防止您意外地从命令行或 Git 客户端应用程序创建分支。
要通过用户界面创建新分支:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择代码 > 分支。
- 选择新分支。
- 填写分支名称并选择现有分支、标签或提交作为新分支的基础。仅接受现有的受保护分支和已在受保护分支中的提交。
要求每个人提交受保护分支的合并请求
您可以强制每个人提交合并请求,而不是允许他们直接签入受保护的分支:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 从分支下拉列表中,选择要保护的分支。
- 从“允许合并”列表中,选择“开发人员 + 维护人员”。
- 从允许推送和合并列表中,选择无人。
- 选择保护。
允许每个人直接推送到受保护的分支
您可以允许具有写入权限的每个人推送到受保护的分支。
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 从分支下拉列表中,选择要保护的分支。
- 从“允许推送和合并”列表中,选择“开发人员 + 维护人员”。
- 选择保护。
允许部署密钥推送到受保护的分支
版本历史
您可以允许部署密钥的所有者推送到受保护的分支。即使用户不是相关项目的成员,部署密钥也有效。但是,部署密钥的所有者必须至少具有项目的读取访问权限。
先决条件:
要允许部署密钥推送到受保护的分支:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 从分支下拉列表中,选择要保护的分支。
- 从允许推送和合并列表中,选择部署密钥。
- 选择保护。
部署密钥在允许合并下拉列表中不可用。
允许强制推送受保护的分支
版本历史
您可以允许强制推送到受保护的分支。
要保护新分支并启用强制推送:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 从分支下拉列表中,选择要保护的分支。
- 从允许推送和合并和允许合并列表中,选择所需的设置。
- 要允许所有具有推送访问权限的用户强制推送,请打开“允许强制推送”开关。
- 要拒绝更改文件中列出的文件的代码推送
CODEOWNERS
,请打开 需要代码所有者批准开关。 - 选择保护。
要对已受保护的分支启用强制推送:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 在受保护分支列表中,在该分支旁边,打开允许强制推送切换。
可以推送到该分支的成员现在也可以强制推送。
当一个分支匹配多个规则时
当一个分支匹配多个规则时,最宽松的规则决定该分支的保护级别。例如,考虑以下规则,其中包括 通配符:
分支名称模式 | 允许用力推动 |
---|---|
v1.x |
是的 |
v1.* |
不 |
v* |
不 |
名为 的分支v1.x
与所有三个分支名称模式匹配:v1.x
、v1.*
和v*
。由于最宽松的选项决定了行为,因此分支的最终权限v1.x
为:
- 允许强制推送:在三个设置中,
Yes
是最宽松的,因此可以控制分支行为。即使分支也匹配v1.x
andv*
(每个都有更严格的权限),任何可以推送到该分支的用户也可以强制推送。
如果启用了功能标志并且group_protected_branches
组所有者已 为同一分支设置了组级保护,则项目级分支的强制推送设置将被组级设置覆盖。
受保护分支需要代码所有者批准优质的所有产品
在 GitLab 13.5 中引入,可以推送到受保护分支的用户和组不必使用合并请求来合并其功能分支。这意味着他们可以跳过合并请求批准规则。
对于受保护的分支,您可以要求至少获得代码所有者的批准。如果分支受多个规则保护,并且任何适用的规则启用了“需要代码所有者的批准”,则需要代码所有者的批准。
要保护新分支并获得代码所有者的批准:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 从分支下拉列表中,选择要保护的分支。
- 从允许推送和合并和允许合并列表中,选择所需的设置。
- 打开需要代码所有者批准开关。
- 选择保护。
要在已受保护的分支上启用代码所有者的批准:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择设置 > 存储库。
- 展开受保护的分支。
- 选择添加受保护分支。
- 在受保护分支列表中,打开分支旁边的代码所有者批准开关。
启用后,这些分支的所有合并请求都需要按匹配规则获得代码所有者的批准,然后才能合并。此外,如果规则匹配,则直接推送到受保护分支将被拒绝。
文件中未指定的任何用户都CODEOWNERS
无法推送指定文件或路径的更改,除非明确允许。您不必限制开发人员直接推送到受保护的分支。相反,您可以限制推送到需要代码所有者审核的某些文件。
在GitLab Premium 13.5 及更高版本中,允许推送到受保护分支的用户和组不需要合并请求来合并其功能分支。因此,他们可以跳过合并请求批准规则,包括代码所有者。
在受保护的分支上运行管道
合并或推送到受保护分支的权限定义了用户是否可以运行 CI/CD 管道并对作业执行操作。
有关管道安全模型的详细信息,请参阅受保护分支的安全性。
删除受保护的分支
至少具有维护者角色的用户可以使用 GitLab Web 界面手动删除受保护的分支:
- 在左侧边栏的顶部,选择搜索 GitLab ( ) 以查找您的项目。
- 选择代码 > 分支。
- 在要删除的分支旁边,选择删除( )。
- 在确认对话框中,输入分支名称并选择是,删除受保护的分支。
受保护的分支只能通过使用 GitLab 从 UI 或 API 中删除。这可以防止通过本地 Git 命令或第三方 Git 客户端意外删除分支。