Push Rules
Push Rules
通过使用正则表达式拒绝基于提交内容,分支名称或文件详细信息的推送,来获得对哪些内容可以推送或不能推送到存储库的额外控制.
Overview
GitLab 已经提供了受保护的分支 ,但是在某些情况下,您需要一些特定的规则,例如,防止删除 Git 标签或对提交消息强制采用特殊格式.
推送规则本质上是预先接收的 Git 挂钩 ,可在用户友好的界面中轻松启用. 如果您是管理员或每个项目,它们是全局定义的,因此您可以根据需要将不同的规则应用于不同的项目.
Use cases
每个推送规则都可以有自己的用例,但让我们考虑一些示例.
Commit messages with a specific reference
假设您对工作流程有以下要求:
- 每个提交都应引用 Jira 问题,例如:
Refactored css. Fixes JIRA-123.
Refactored css. Fixes JIRA-123.
- 用户应该无法使用
git push
删除 Git 标签
您需要做的就是编写一个简单的正则表达式,要求在提交消息中提及一个 Jira 问题,例如JIRA\-\d+
.
现在,当用户尝试通过消息Bugfix
推送提交时,他们的推送将被拒绝. 仅接受Bugfix according to JIRA-123
推送带有Bugfix according to JIRA-123
消息的提交.
Restrict branch names
假设您公司中有严格的分支机构名称政策,并且您希望分支机构以特定名称开头,因为您有不同的 GitLab CI / CD 作业( feature
, hotfix
, docker
, android
等)依赖于分支机构名称.
但是,您的开发人员并不总是记住该策略,因此他们可能会推送到各个分支,并且 CI 管道可能无法按预期工作. 通过在推送规则中全局限制分支名称,可以防止此类错误. 与您的推送规则不匹配的任何分支名称都将被拒绝.
请注意,不管指定的分支命名正则表达式(regex)如何,始终允许使用默认分支的名称. 通过这种方式配置 GitLab,因为合并通常将默认分支作为目标. 如果您还有其他目标分支,请将其包含在正则表达式中. (请参阅启用推送规则 ).
默认分支还默认为受保护分支 ,这已经限制了用户直接推送.
Custom Push Rules
通过使用更高级的服务器挂钩,可以创建自定义推送规则,而不是” 管理区域”>”推送规则”中可用的推送规则 .
有关更多信息,请参见服务器挂钩 .
Enabling push rules
注意: GitLab 管理员可以在” 管理区域”>”所有新项目都将继承的推送规则”下全局设置推送规则. 您以后可以在项目的设置中覆盖它们. 也可以在组级别上设置它们.
- 导航到项目的“设置”>”存储库”,然后展开” 推送规则”
- 设置所需的规则
- 单击” 保存推送规则”以使更改生效
以下选项可用.
推送规则 | GitLab 版本 | Description |
---|---|---|
用git push 删除标签 |
Starter 7.10 | 禁止用户使用git push 删除 Git 标签. 仍然可以通过 Web UI 删除标签. |
检查作者是否是 GitLab 用户 | Starter 7.10 | 限制作者(电子邮件)对现有 GitLab 用户的提交. |
提交者限制 | Premium 10.2 | GitLab will reject any commit that was not committed by the current authenticated user |
检查提交是否通过 GPG 签名 | Premium 10.1 | 如果未通过 GPG 签名,则拒绝提交. 使用 GPG阅读签名提交 . |
防止向 Git 提交机密 | Starter 8.12 | GitLab 将拒绝任何可能包含机密的文件. 阅读禁止使用的文件 . |
通过提交消息限制 | Starter 7.10 | 只允许推送与此正则表达式匹配的提交消息. 保留为空以允许任何提交消息. 使用多行模式,可以使用(?-m) 禁用该模式. |
受提交消息限制(负匹配) | Starter 11.1 | 只允许提交与此正则表达式不匹配的提交消息. 保留为空以允许任何提交消息. 使用多行模式,可以使用(?-m) 禁用该模式. |
受分支名称限制 | Starter 9.3 | 只允许推送与此正则表达式匹配的分支名称. 保留为空以允许使用任何分支名称. |
通过提交作者的电子邮件进行限制 | Starter 7.10 | 只允许推送与此正则表达式匹配的提交者的电子邮件. 留空以允许任何电子邮件. |
禁止的文件名 | Starter 7.10 | 与该正则表达式匹配的所有提交的文件名均不允许推送. 保留为空以允许任何文件名. |
最大档案大小 | Starter 7.12 | 包含超过此文件大小(以 MB 为单位)的添加或更新文件的推送将被拒绝. 设置为 0 允许任何大小的文件. 由 Git LFS 跟踪的文件被豁免. |
提示: GitLab 对推送规则中的正则表达式使用RE2 语法 ,您可以在GoLang regex tester 上对其进行测试 .
Prevent pushing secrets to the repository
Introduced in GitLab Starter 8.12.
诸如凭证文件,SSH 私钥之类的机密以及其他包含机密的文件绝不应提交给源代码控制. GitLab 允许您打开文件的预定义拒绝列表,该列表将不允许被推送到存储库,从而阻止这些提交到达远程存储库.
通过选中防止向 Git 提交机密复选框,当文件与从files_denylist.yml
读取的正则表达式匹配时,GitLab 会阻止将其推送到存储库(在查看此文件时,请确保您处于与 GitLab 版本相同的正确分支).
注意:已经提交的文件将不受此推送规则的限制.
下面是这些正则表达式将拒绝的内容的示例列表:
#####################
# AWS CLI credential blobs
#####################
.aws/credentials
aws/credentials
homefolder/aws/credentials
#####################
# Private RSA SSH keys
#####################
/ssh/id_rsa
/.ssh/personal_rsa
/config/server_rsa
id_rsa
.id_rsa
#####################
# Private DSA SSH keys
#####################
/ssh/id_dsa
/.ssh/personal_dsa
/config/server_dsa
id_dsa
.id_dsa
#####################
# Private ed25519 SSH keys
#####################
/ssh/id_ed25519
/.ssh/personal_ed25519
/config/server_ed25519
id_ed25519
.id_ed25519
#####################
# Private ECDSA SSH keys
#####################
/ssh/id_ecdsa
/.ssh/personal_ecdsa
/config/server_ecdsa
id_ecdsa
.id_ecdsa
#####################
# Any file with .pem or .key extensions
#####################
*.pem
*.key
#####################
# Any file ending with _history or .history extension
#####################
pry.history
bash_history