# Push Rules

> 原文：[https://docs.gitlab.com/ee/push_rules/push_rules.html](https://docs.gitlab.com/ee/push_rules/push_rules.html)

*   [Overview](#overview)
*   [Use cases](#use-cases)
    *   [Commit messages with a specific reference](#commit-messages-with-a-specific-reference)
    *   [Restrict branch names](#restrict-branch-names)
    *   [Custom Push Rules](#custom-push-rules-core-only)
*   [Enabling push rules](#enabling-push-rules)
*   [Prevent pushing secrets to the repository](#prevent-pushing-secrets-to-the-repository)

# Push Rules[](#push-rules-starter "Permalink")

通过使用正则表达式拒绝基于提交内容，分支名称或文件详细信息的推送，来获得对哪些内容可以推送或不能推送到存储库的额外控制.

## Overview[](#overview "Permalink")

GitLab 已经提供了[受保护的分支](../user/project/protected_branches.html) ，但是在某些情况下，您需要一些特定的规则，例如，防止删除 Git 标签或对提交消息强制采用特殊格式.

推送规则本质上是[预先接收的 Git 挂钩](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) ，可在用户友好的界面中轻松启用. 如果您是管理员或每个项目，它们是全局定义的，因此您可以根据需要将不同的规则应用于不同的项目.

## Use cases[](#use-cases "Permalink")

每个推送规则都可以有自己的用例，但让我们考虑一些示例.

### Commit messages with a specific reference[](#commit-messages-with-a-specific-reference "Permalink")

假设您对工作流程有以下要求：

*   每个提交都应引用 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[](#restrict-branch-names "Permalink")

假设您公司中有严格的分支机构名称政策，并且您希望分支机构以特定名称开头，因为您有不同的 GitLab CI / CD 作业（ `feature` ， `hotfix` ， `docker` ， `android`等）依赖于分支机构名称.

但是，您的开发人员并不总是记住该策略，因此他们可能会推送到各个分支，并且 CI 管道可能无法按预期工作. 通过在推送规则中全局限制分支名称，可以防止此类错误. 与您的推送规则不匹配的任何分支名称都将被拒绝.

请注意，不管指定的分支命名正则表达式（regex）如何，始终允许使用默认分支的名称. 通过这种方式配置 GitLab，因为合并通常将默认分支作为目标. 如果您还有其他目标分支，请将其包含在正则表达式中. （请参阅[启用推送规则](#enabling-push-rules) ）.

默认分支还默认为[受保护分支](../user/project/protected_branches.html) ，这已经限制了用户直接推送.

### Custom Push Rules[](#custom-push-rules-core-only "Permalink")

通过使用更高级的服务器挂钩，可以创建自定义推送规则，而不是" **管理区域">"推送规则"中**可用的**推送规则** .

有关更多信息，请参见[服务器挂钩](../administration/server_hooks.html) .

## Enabling push rules[](#enabling-push-rules "Permalink")

**注意：** GitLab 管理员可以在" **管理区域">"**所有新项目都将继承的**推送规则"**下全局设置推送规则. 您以后可以在项目的设置中覆盖它们. 也可以在[组级别](../user/group/index.html#group-push-rules-starter)上设置它们.

1.  导航到项目的**"设置">"存储库"，**然后展开" **推送规则"**
2.  设置所需的规则
3.  单击" **保存推送规则"**以使更改生效

以下选项可用.

| 推送规则 | 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](../user/project/repository/gpg_signed_commits/index.html)阅读[签名提交](../user/project/repository/gpg_signed_commits/index.html) . |
| 防止向 Git 提交机密 | **Starter** 8.12 | GitLab 将拒绝任何可能包含机密的文件. 阅读[禁止使用的文件](#prevent-pushing-secrets-to-the-repository) . |
| 通过提交消息限制 | **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 语法](https://github.com/google/re2/wiki/Syntax) ，您可以在[GoLang regex tester 上](https://regex-golang.appspot.com/assets/html/index.html)对其进行[测试](https://regex-golang.appspot.com/assets/html/index.html) .

## Prevent pushing secrets to the repository[](#prevent-pushing-secrets-to-the-repository "Permalink")

[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/385) in [GitLab Starter](https://about.gitlab.com/pricing/) 8.12.

诸如凭证文件，SSH 私钥之类的机密以及其他包含机密的文件绝不应提交给源代码控制. GitLab 允许您打开文件的预定义拒绝列表，该列表将不允许被推送到存储库，从而阻止这些提交到达远程存储库.

通过选中*防止向 Git 提交机密*复选框，当文件与从[`files_denylist.yml`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/lib/gitlab/checks/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 
```