提交 5c952b69 编写于 作者: Lab机器人's avatar Lab机器人

empty

上级 c1b0cf1a
# 关于CODEChina
欢迎使用CodeChina代码托管平台,本产品基于 Gitlab CE 版本 (13.2 stable) 开发并,目前版本提供了代码仓库管理、组织管理等基本功能,欢迎体验使用。
体验使用过程中如果遇到任何问题,请与我们联系。
## 联系我们
- [点此向 CODEChina 产品提交 issue](https://codechina.csdn.net/codechina/beta/~/issues)
- CODEChina微信群(1)
- CODEChina微信群(2)
- CODEChina观察员(1) Wechat / QQ
- CODEChina观察员(2) Wechat / QQ
\ No newline at end of file
# 帮助文档
* [首页](HOME)
* [概览](概览)
* [组织](用户/组织)
* [子组织](用户/组织/子组织)
* [项目](用户/项目)
* [徽章](用户/项目/徽章)
* [批量编辑](用户/项目/批量编辑)
* [新建项目](入门/新建项目)
* [描述模板](用户/项目/描述模板)
* [文件查找](用户/项目/代码仓库/文件查找)
* [合并请求](用户/项目/合并请求)
* [允许协作](用户/项目/合并请求/允许协作)
* [创建合并请求](用户/项目/合并请求/创建合并请求)
* [Cherry-pick](用户/项目/合并请求/Cherry-pick)
* [快进合并](用户/项目/合并请求/快进合并)
* [解决冲突](用户/项目/合并请求/解决合并冲突)
* [还原](用户/项目/合并请求/还原)
* [评审及管理](用户/项目/合并请求/评审及管理)
* [Squash合并](用户/项目/合并请求/Squash合并)
* [合并请求版本](用户/项目/合并请求/合并请求版本)
* [草稿](用户/项目/合并请求/草稿)
* [项目成员](用户/项目/项目成员)
* [导入](用户/项目/迁移项目)
* [Github](用户/项目/导入/Github)
* [URL](用户/项目/导入/url导入)
* [推送选项](用户/项目/推送选项)
* [Releases](用户/项目/Releases)
* [代码仓库](用户/项目/代码仓库)
* [分支](用户/项目/代码仓库/分支)
* [Git属性](用户/项目/Git属性)
* [文件指责](用户/项目/代码仓库/文件指责)
* [文件历史记录](用户/项目/代码仓库/文件历史记录)
* [镜像仓库](用户/项目/代码仓库/镜像仓库)
* [保护分支](用户/项目/保护分支)
* [保护Tag](用户/项目/保护Tag)
* [减少仓库大小](用户/项目/代码仓库/减少仓库大小)
* [GPG签名提交](用户/项目/代码仓库/GPG签名提交)
* [文件编辑](用户/项目/代码仓库/文件编辑)
* [WebIDE](用户/项目/WebIDE)
* [项目设置](用户/项目/项目设置)
* [与群组共享项目](用户/项目/项目成员/与群组共享项目)
* [wiki](用户/项目/wiki)
* [Issues](用户/项目/issues)
* [机密Issue](用户/项目/issues/机密Issue)
* [关联Issue](用户/项目/issues/关联Issue)
* [截止日期](用户/项目/issues/截止日期)
* [看板](用户/项目/看板)
* [Issue操作](用户/项目/issues/操作Issue)
* [标签](用户/项目/标签)
* [管理Issue](用户/项目/issues/管理Issue)
* [里程碑](用户/项目/里程碑)
* [服务台](用户/项目/服务台)
* [Issue排序](用户/项目/issues/Issue排序)
* [用户](用户)
* [举报用户](用户/举报用户)
* [用户账号](用户/用户账号)
* [登录日志](用户/用户账号/登录日志)
* [用户权限](用户/用户权限)
* [个人访问令牌](用户/用户资料/个人访问令牌)
* [个人偏好](用户/用户资料/个人偏好)
* [探讨](用户/讨论)
* [SSH密钥](SSH)
* [快捷键](用户/快捷键)
* [Markdown](用户/Markdown)
* [电子邮件通知](用户/用户账号/电子邮件通知)
* [快速操作](用户/项目/快速操作)
* [自动填充](用户/项目/自动填充)
* [预留命名空间](用户/预留命名空间)
* [搜索](用户/搜索)
* [高级全局搜索](用户/高级全局搜索)
* [高级语法搜索](用户/高级语法搜索)
* [时间跟踪](用户/项目/时间跟踪)
* [待办事项](用户/待办事项)
\ No newline at end of file
# Cherry-pick[](#cherry-pick "Permalink")
GitLab 实现了 Git 的强大功能,通过在合并请求和提交详细信息中引入**Cherry-pick**按钮来[挑选任何提交](https://git-scm.com/docs/git-cherry-pick "Git Cherry-Pick 文档") .
## Cherry-picking a merge request[](#cherry-picking-a-merge-request "Permalink")
合并请求合并后,将可以使用**Cherry-pick**按钮来选择该合并请求引入的更改.
[![Cherry-pick Merge Request](img/fe7d77556848be98a93c7b6516b0e6f8.png)](img/cherry_pick_changes_mr.png)
单击该按钮后,将出现一个模态,显示一个[分支过滤器搜索框](../repository/branches/index.html#branch-filter-search-box) ,您可以在其中选择:
* 将更改直接选择到所选分支中.
* 使用经过精心挑选的更改创建一个新的合并请求.
### Cherry-pick tracking[](#cherry-pick-tracking "Permalink")
在 GitLab 12.9 中[引入](https://gitlab.com/groups/gitlab-org/-/epics/2675) .
当您选择一个合并提交时,GitLab 将向相关的合并请求线程输出系统注释,使新提交与现有合并请求交联.
[![Cherry-pick tracking in Merge Request timeline](img/e20aec7ab33bbd61bae4825e6c9e35f1.png)](img/cherry_pick_mr_timeline_v12_9.png)
每个部署的[关联合并请求列表](../../../api/deployments.html#list-of-merge-requests-associated-with-a-deployment)将包括精心挑选的合并提交.
**注意:**我们仅跟踪从 GitLab(UI 和 API)执行的 cherry-pick. 计划在将来的发行版中支持[通过命令行跟踪精心挑选的提交](https://gitlab.com/gitlab-org/gitlab/-/issues/202215) .
## Cherry-picking a commit[](#cherry-picking-a-commit "Permalink")
您可以从提交详细信息页面中挑选一个提交:
[![Cherry-pick commit](img/b4e821b8b83e29e837f01f4620e557b7.png)](img/cherry_pick_changes_commit.png)
与选择合并请求类似,您可以选择将更改直接选择到目标分支中,也可以选择创建新的合并请求以选择更改.
请注意,在进行樱桃挑选合并提交时,主线将始终是第一父级. 如果要使用其他主线,则需要从命令行执行.
这是一个使用第二个父级作为主线来挑选合并提交的快速示例:
```
git cherry-pick -m 2 7a39eb0
```
\ No newline at end of file
# GPG签名提交[](#GPG签名提交 "Permalink")
版本历史
* 在 GitLab 9.5 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9546) .
* 在 GitLab 10.1 中添加了子项支持.
您可以使用 GPG 密钥对在 GitLab 存储库中进行的 Git 提交进行签名. 如果可以验证提交者的身份,则已签名的提交将标记为" **已**验证". 为了验证提交者的身份,GitLab 需要他们的公共 GPG 密钥.
**注意:**术语 GPG 用于所有与 OpenPGP / PGP / GPG 相关的材料和实现.
目前尚不支持通过 GPG 验证的标签.
有关 GPG 的更多详细信息,请参见[进一步阅读](#further-reading)部分.
## How GitLab handles GPG[](#how-gitlab-handles-gpg "Permalink")
GitLab 使用其自己的密钥环来验证 GPG 签名. 它不访问任何公钥服务器.
对于要由 GitLab 验证的提交:
* 提交者必须具有 GPG 公钥/私钥对.
* 提交者的公钥必须已上传到其 GitLab 帐户.
* GPG 密钥中的一封电子邮件必须与提交者在 GitLab 中使用的**经过验证的**电子邮件地址匹配.
* 提交者的电子邮件地址必须与 GPG 密钥中验证的电子邮件地址匹配.
## Generating a GPG key[](#generating-a-gpg-key "Permalink")
如果您还没有 GPG 密钥,则以下步骤将帮助您入门:
1. 为您的操作系统[安装 GPG](https://www.gnupg.org/download/index.html) . 如果您的操作系统具有`gpg2`安装,更换`gpg``gpg2`在下面的命令.
2. 使用以下命令生成私钥/公钥对,这将产生一系列问题:
```
gpg --full-gen-key
```
**注意:**在某些情况下,例如 Windows 和其他 macOS 版本上的 Gpg4win,此处的命令可能是`gpg --gen-key` .
3. 第一个问题是可以使用哪种算法. 选择所需的类型或按`Enter 键`选择默认类型(RSA 和 RSA):
```
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
```
4. 下一个问题是密钥长度. 我们建议您选择`4096`
```
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
```
5. 指定密钥的有效期. 这是主观的,您可以使用默认值,该值永远不会过期:
```
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
```
6. 通过输入`y`确认您给出的答案是正确的:
```
Is this correct? (y/N) y
```
7. 输入您的真实姓名,与此键关联的电子邮件地址(应与您在 GitLab 中使用的经过验证的电子邮件地址匹配)和可选注释(按`Enter`跳过):
```
GnuPG needs to construct a user ID to identify your key.
Real name: Mr. Robot
Email address: <your_email>
Comment:
You selected this USER-ID:
"Mr. Robot <your_email>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
```
8. 在询问时选择一个强密码,然后输入两次以确认.
9. 使用以下命令列出您刚刚创建的私密 GPG 密钥:
```
gpg --list-secret-keys --keyid-format LONG <your_email>
```
将`<your_email>`替换为您在上面输入的电子邮件地址.
10. 复制以`sec`开头的 GPG 密钥 ID. 在以下示例中,即`30F2B65B9246B6CA`
```
sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid [ultimate] Mr. Robot <your_email>
ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
```
11. 导出该 ID 的公共密钥(替换上一步中的密钥 ID):
```
gpg --armor --export 30F2B65B9246B6CA
```
12. 最后,复制公钥并将其[添加到您的个人资料设置中](#adding-a-gpg-key-to-your-account)
## Adding a GPG key to your account[](#adding-a-gpg-key-to-your-account "Permalink")
**注意:**添加密钥后,就无法对其进行编辑,只能将其删除. 如果粘贴无效,则必须删除有问题的密钥并重新添加.
您可以在个人资料的设置中添加 GPG 密钥:
1. 点击右上角的头像,然后转到**"设置"** .
[![Settings dropdown](img/5e2e81b44d67af322056491cf32bb8da.png)](../../../profile/img/profile_settings_dropdown.png)
2. 导航至**GPG 密钥**标签,然后将您的*公共*密钥粘贴到"密钥"框中.
[![Paste GPG public key](img/d04d999de9102632af46c867821c47c3.png)](img/profile_settings_gpg_keys_paste_pub.png)
3. 最后,单击**添加键**将其添加到 GitLab. 您将能够看到其指纹,相应的电子邮件地址和创建日期.
[![GPG key single page](img/8a56e678752a9bd9def98422dee92f3e.png)](img/profile_settings_gpg_keys_single_key.png)
## Associating your GPG key with Git[](#associating-your-gpg-key-with-git "Permalink")
[创建 GPG 密钥](#generating-a-gpg-key)并将其[添加到您的帐户之后](#adding-a-gpg-key-to-your-account) ,是时候告诉 Git 使用哪个密钥了.
1. 使用以下命令列出您刚刚创建的私密 GPG 密钥:
```
gpg --list-secret-keys --keyid-format LONG <your_email>
```
将`<your_email>`替换为您在上面输入的电子邮件地址.
2. 复制以`sec`开头的 GPG 密钥 ID. 在以下示例中,即`30F2B65B9246B6CA`
```
sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid [ultimate] Mr. Robot <your_email>
ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
```
3. 告诉 Git 使用该密钥对提交进行签名:
```
git config --global user.signingkey 30F2B65B9246B6CA
```
用您的 GPG 密钥 ID 替换`30F2B65B9246B6CA` .
4. (可选)如果 Git 使用`gpg`并且出现诸如`secret key not available``gpg: signing failed: secret key not available` ,请运行以下命令更改为`gpg2`
```
git config --global gpg.program gpg2
```
## Signing commits[](#signing-commits "Permalink")
[创建 GPG 密钥](#generating-a-gpg-key)并将其[添加到您的帐户之后](#adding-a-gpg-key-to-your-account) ,您可以开始对提交进行签名:
1. 像以前一样提交,唯一的区别是添加了`-S`标志:
```
git commit -S -m "My commit msg"
```
2. 询问时输入 GPG 密钥的密码.
3. 推送至 GitLab 并检查您的提交[是否已通过验证](#verifying-commits) .
如果您不想在每次提交时都键入`-S`标志,则可以告诉 Git 自动签名您的提交:
```
git config --global commit.gpgsign true
```
## Verifying commits[](#verifying-commits "Permalink")
1. 在项目或[合并请求中](../../merge_requests/index.html) ,导航到" **提交"**选项卡. 签名的提交将显示包含" Verified"或" Unverified"的徽章,具体取决于 GPG 签名的验证状态.
[![Signed and unsigned commits](img/7d08a10bdee492162fdb554fb3033f0d.png)](img/project_signed_and_unsigned_commits.png)
2. 通过单击 GPG 徽章,将显示签名的详细信息.
[![Signed commit with verified signature](img/544adf1331ba8dc0c6391bf07ba6df8c.png)](img/project_signed_commit_verified_signature.png)
[![Signed commit with verified signature](img/cc6935399d2235840119ad00eb778fc9.png)](img/project_signed_commit_unverified_signature.png)
## Revoking a GPG key[](#revoking-a-gpg-key "Permalink")
撤消密钥将**取消验证**已签名的提交. 使用此密钥验证的提交将变为未验证状态. 撤销此密钥后,将来的提交也将保持不变. 如果您的密钥已被盗用,则应使用此操作.
撤销 GPG 密钥:
1. 点击右上角的头像,然后转到**"设置"** .
2. 导航到**GPG 键**标签.
3. 单击您要删除的 GPG 键**旁边的撤消** .
## Removing a GPG key[](#removing-a-gpg-key "Permalink")
删除密钥**不会**取消**验证**已签名的提交. 使用此密钥验证的提交将保持验证状态. 删除此密钥后,只有未按下的提交才会保持未验证状态. 要取消验证已签名的提交,您需要从您的帐户中[撤销关联的 GPG 密钥](#revoking-a-gpg-key) .
要从您的帐户中删除 GPG 密钥,请执行以下操作:
1. 点击右上角的头像,然后转到**"设置"** .
2. 导航到**GPG 键**标签.
3. 单击您要删除的 GPG 密钥旁边的垃圾桶图标.
## Rejecting commits that are not signed[](#rejecting-commits-that-are-not-signed-premium "Permalink")
您可以将您的项目配置为拒绝不是通过[推送规则进行](../../../../push_rules/push_rules.html) GPG 签名的提交.
## GPG signing API[](#gpg-signing-api "Permalink")
了解如何[通过 API 通过提交获取 GPG 签名](../../../../api/commits.html#get-gpg-signature-of-a-commit) .
## Further reading[](#further-reading "Permalink")
有关 GPG 的更多详细信息,请参见:
* [Git Tools - Signing Your Work](https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work)
* [Managing OpenPGP Keys](https://riseup.net/en/security/message-security/openpgp/gpg-keys)
* [OpenPGP Best Practices](https://riseup.net/en/security/message-security/openpgp/best-practices)
* [Creating a new GPG key with subkeys](https://www.void.gr/kargig/blog/2013/12/02/creating-a-new-gpg-key-with-subkeys/) (advanced)
\ No newline at end of file
# 从Github导入[](#从Github导入 "Permalink")
使用导入器,您可以将 GitHub 存储库导入 GitLab.com 或自管理的 GitLab 实例.
## Overview[](#overview "Permalink")
**注意:**这些说明适用于 GitLab.com 上的用户,但是如果您是自助 GitLab 实例的管理员,或者要从 GitHub Enterprise 导入,则必须启用[GitHub 集成](../../../integration/github.html) . GitHub 集成是从 GitHub Enterprise 导入的唯一方法. 如果您使用的是 GitLab.com,则可以使用[个人访问令牌](#using-a-github-token)导入 GitHub 存储库,但不建议使用此方法,因为该方法无法将所有用户活动(例如问题和请求请求)与匹配的 GitLab 用户相关联. 如果您是自我管理的 GitLab 实例的管理员,则还可以使用[GitHub Rake 任务](../../../administration/raketasks/github_import.html)从 GitHub 导入项目,而不受 Sidekiq worker 的限制.
导入了项目的以下方面:
* 仓库描述(GitLab.com&7.7+)
* Git 存储库数据(GitLab.com&7.7+)
* 问题(GitLab.com 和 7.7+)
* 拉取请求(GitLab.com&8.4+)
* Wiki 页面(GitLab.com&8.4+)
* 里程碑(GitLab.com&8.7+)
* 标签(GitLab.com 和 8.7+)
* 发行说明说明(GitLab.com 和 8.12+)
* 拉取请求评论评论(GitLab.com&10.2+)
* 定期发布和请求请求注释
保留对拉取请求和问题的引用(GitLab.com&8.7+),并且每个导入的存储库都保持可见性级别,除非该[可见性级别受到限制](../../../public_access/public_access.html#restricting-the-use-of-public-or-internal-projects) ,在这种情况下,它默认为默认项目可见性.
## How it works[](#how-it-works "Permalink")
导入问题和请求请求时,导入程序会尝试在 GitLab 实例的数据库中查找其 GitHub 作者和受让人(请注意,请求请求在 GitLab 中称为"合并请求").
For this association to succeed, each GitHub author and assignee in the repository must meet one of the following conditions prior to the import:
* 以前使用 GitHub 图标登录到 GitLab 帐户.
* 有一个 GitHub 帐户,其[主要电子邮件地址](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address)与其 GitLab 帐户的电子邮件地址匹配.
如果在 GitLab 的数据库中未找到项目中引用的用户,则将项目创建者(通常是启动导入过程的用户)设置为作者/受让人,但是会添加关于该问题的注释,其中提及原始 GitHub 作者.
如果不存在任何新的名称空间(组),或者如果采用了名称空间,则导入器会创建存储库,该存储库将在启动导入过程的用户的名称空间下导入. 命名空间/存储库名称也可以使用适当的权限进行编辑.
进口商还将在与未完成拉取请求相关的项目的分支上导入分支. 这些分支将以类似于`GH-SHA-username/pull-request-number/fork-name/branch`的命名方案导入. 与 GitHub 存储库相比,这可能导致分支中的差异.
有关更多技术细节,您可以参考[GitHub Importer](../../../development/github_importer.html "使用 GitHub 导入器")开发人员文档.
有关导入过程的概述,请参阅[从 GitHub 迁移到 GitLab](https://youtu.be/VYOXuOg9tQI)的视频.
## Import your GitHub repository into GitLab[](#import-your-github-repository-into-gitlab "Permalink")
### Using the GitHub integration[](#using-the-github-integration "Permalink")
在开始之前,请确保要映射到 GitLab 用户的所有 GitHub 用户都具有以下任一条件:
* 使用 GitHub 图标登录的 GitLab 帐户-或-
* 一个 GitLab 帐户,其电子邮件地址与 GitHub 用户的[公共电子邮件地址](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address)匹配
用户匹配尝试将按该顺序进行,并且如果两种方法均未识别到用户,则该活动将与执行导入的用户帐户相关联.
**注意:**如果您使用的是自助式 GitLab 实例,或者要从 GitHub Enterprise 导入,则此过程要求您已配置[GitHub 集成](../../../integration/github.html) .
1. 在顶部导航栏中,单击**+** ,然后选择**新建项目** .
2. 选择**导入项目**选项卡,然后选择**GitHub** .
3. 选择第一个按钮以**列出您的 GitHub 存储库** . 您将被重定向到[GitHub 上](https://github.com)的页面以授权 GitLab 应用程序.
4. 点击**授权 gitlabhq** . 您将被重定向回 GitLab 的 Import 页面,并列出所有 GitHub 存储库.
5. 继续[选择要导入的存储库](#selecting-which-repositories-to-import) .
### Using a GitHub token[](#using-a-github-token "Permalink")
**注意:**不建议使用个人访问令牌导入项目. 如果您是 GitLab.com 用户,则可以使用个人访问令牌从 GitHub 导入项目,但是该方法无法将所有用户活动(例如问题和请求请求)与匹配的 GitLab 用户关联. 如果您是自我管理的 GitLab 实例的管理员,或者要从 GitHub Enterprise 导入,则不能使用个人访问令牌. 建议所有用户使用[GitHub 集成方法(上述)](#using-the-github-integration) . 在" [如何工作"](#how-it-works)部分中了解更多信息.
如果您不使用 GitHub 集成,则仍可以通过 GitHub 执行授权以授予 GitLab 访问您的存储库的权限:
1. 转到[https://github.com/settings/tokens/new](https://github.com/settings/tokens/new)
2. 输入令牌描述.
3. 选择回购范围​​.
4. Click **生成令牌**.
5. 复制令牌哈希.
6. 返回到 GitLab 并将令牌提供给 GitHub 导入器.
7. 点击**列出您的 GitHub 存储库**按钮,并等待 GitLab 读取您的存储库信息. 完成后,将带您到导入器页面以选择要导入的存储库.
### Selecting which repositories to import[](#selecting-which-repositories-to-import "Permalink")
在授权访问 GitHub 存储库后,您将重定向到 GitHub 导入程序页面,并列出 GitHub 存储库.
1. 默认情况下,建议的存储库名称空间与 GitHub 中存在的名称匹配,但是根据您的权限,您可以选择在继续导入任何名称之前编辑这些名称.
2. 选择任意数量的存储库旁边的**导入**按钮,或选择**导入所有存储库** . 此外,您可以按名称过滤项目. 如果应用了过滤器,则" **导入所有存储库"**仅导入匹配的存储库.
3. " **状态"**列显示每个存储库的导入状态. 您可以选择让页面保持打开状态,它将实时更新,也可以稍后返回.
4. 导入存储库后,单击其 GitLab 路径以打开其 GitLab URL.
[![Github importer page](img/67f7d8117f3d6bf60fe4d5e03bca7b6e.png)](img/import_projects_from_github_importer_v12_3.png)
## Mirroring and pipeline status sharing[](#mirroring-and-pipeline-status-sharing "Permalink")
根据您的 GitLab 层,可以设置[项目镜像](../repository/repository_mirroring.html) ,以使导入的项目与其 GitHub 副本保持同步.
此外,您可以配置 GitLab 以通过[GitHub Project Integration](../integrations/github.html)将管道状态更新发送回 GitHub.
如果使用[CI / CD 作为外部存储库](../../../ci/ci_cd_for_external_repos/index.html)导入项目,则会自动配置以上两项.
## Improving the speed of imports on self-managed instances[](#improving-the-speed-of-imports-on-self-managed-instances "Permalink")
**注意:**必须具有对 GitLab 服务器的管理员访问权限.
对于大型项目,可能需要一段时间才能导入所有数据. 为了减少必要的时间,您可以增加处理以下队列的 Sidekiq 工作程序的数量:
* `github_importer`
* `github_importer_advance_stage`
For an optimal experience, it’s recommended having at least 4 Sidekiq processes (each running a number of threads equal to the number of CPU cores) that *only* process these queues. It’s also recommended that these processes run on separate servers. For 4 servers with 8 cores this means you can import up to 32 objects (e.g., issues) in parallel.
减少克隆存储库所花费的时间可以通过增加存储 Git 存储库(适用于您的 GitLab 实例)的磁盘的网络吞吐量,CPU 容量和磁盘性能(例如,使用高性能 SSD)来完成. 增加 Sidekiq 工作人员的数量*不会*减少克隆存储库所花费的时间.
\ No newline at end of file
# 自定义Git属性[](#自定义Git属性 "Permalink")
GitLab 支持定义自定义[Git 属性,](https://git-scm.com/docs/gitattributes)例如将哪些文件视为二进制文件,以及将哪种语言用于语法突出显示差异.
要定义这些属性, `.gitattributes`在存储库的根目录中创建一个名为`.gitattributes`的文件,并将其推送到项目的默认分支.
## Encoding Requirements[](#encoding-requirements "Permalink")
`.gitattributes`文件*必须*使用 UTF-8 编码,并且*不能*包含字节顺序标记. 如果使用其他编码,则文件的内容将被忽略.
## Syntax Highlighting[](#syntax-highlighting "Permalink")
`.gitattributes`文件可用于定义语法高亮显示文件和差异时使用的语言. 有关更多信息,请参见["语法突出显示"](highlighting.html) .
# Issues[](#issues "Permalink")
问题是在 GitLab 中就想法和计划工作进行协作的基本介质.
## Overview[](#overview "Permalink")
GitLab 问题跟踪器是用于协作开发想法,解决问题和计划工作的高级工具.
通过问题,可以在以下各项之间,在实施之前和期间共享和讨论提案:
* 您和您的团队.
* 外部合作者.
它们还可以用于各种其他目的,根据您的需求和工作流程进行定制.
问题始终与特定项目相关联,但是如果您在一个小组中有多个项目,则还可以在小组级别集体查看所有问题.
**常见的用例包括:**
* 讨论新想法的实施
* 跟踪任务和工作状态
* 接受功能建议,问题,支持请求或错误报告
* 详细说明新的代码实现
另请参见[始终从问题开始讨论](https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/) .
要了解 GitLab 战略营销部门如何将 GitLab 问题与[标签](../labels.html)[问题板一起使用](../issue_board.html) ,请参阅有关[管理问题的承诺](https://www.youtube.com/watch?v=cuIHNintg1o&t=3)的视频.
## Parts of an issue[](#parts-of-an-issue "Permalink")
问题包含各种内容和元数据,从而在使用方式上具有很大的灵活性. 每个问题可以包含以下属性,尽管并非必须设置所有项目.
|
* Content
* Title
* 描述和任务
* 评论和其他活动
* People
* Author
* Assignee(s)
* State
* 状态(打开或关闭)
* 健康状况(正常,需要注意或有危险)
* Confidentiality
* 任务(完成与未完成)
|
* 规划和跟踪
* 里程碑
* 截止日期
* 重量
* 时间跟踪
* 标签
* 投票数
* 反应表情
* 关联问题
* 分配史诗
* 唯一的发行号和 URL
|
## Viewing and managing issues[](#viewing-and-managing-issues "Permalink")
虽然您可以在[问题页面](#issue-page)上查看和管理问题的全部详细信息,但也可以一次使用" [问题列表"](#issues-list) ," [问题板"](#issue-boards) ,"问题参考"和" [Epic"](#epics-premium)处理多个问题 .
针对问题的关键操作包括:
* [Creating issues](managing_issues.html#create-a-new-issue)
* [Moving issues](managing_issues.html#moving-issues)
* [Closing issues](managing_issues.html#closing-issues)
* [Deleting issues](managing_issues.html#deleting-issues)
### Issue page[](#issue-page "Permalink")
[![Issue view](img/a15f0b2964d7094b019c5c33425ba75b.png)](img/issues_main_view.png)
在问题的页面上,您可以查看问题的[所有方面,](issue_data_and_actions.html)如果有必要的[权限](../../permissions.html) ,可以对其进行修改.
### Issues list[](#issues-list "Permalink")
[![Project issues list view](img/854d722d9976d5b36956ddbe41ceae48.png)](img/project_issues_list_view.png)
在"问题列表"上,可以从更高级别的组上下文中打开"问题列表",从而可以查看当前项目中的所有问题,也可以查看多个项目中的所有问题. 使用[搜索查询](../../search/index.html#filtering-issue-and-merge-request-lists)过滤问题列表,包括特定的元数据,例如标签,受让人,状态等. 从此视图,您还可以对显示的问题[进行批量](../bulk_editing.html)更改.
有关更多信息,请参见[问题数据和操作](issue_data_and_actions.html)页面,以了解问题中所有字段和信息的摘要.
您可以通过多种方式对问题列表进行排序,例如,通过问题创建日期,里程碑到期日期. 有关更多信息,请参见" [排序和排序问题列表"](sorting_issue_lists.html)页面.
### Issue boards[](#issue-boards "Permalink")
[![Issue board](img/fd79e7dae86040d6e1249793ae0b1502.png)](img/issue_board.png)
[发行板](../issue_board.html)是看板,其栏目根据其标签或他们的受让人显示问题 . 它们提供了使用高度可定制的工作流来管理问题的灵活性.
您可以在栏中重新排序问题. 如果将发行卡拖到另一列,则其关联的标签或受让人将更改以匹配新列的标签或受让人. 整个董事会也可以被筛选为仅包括某个里程碑或总体标签中的问题.
### Design Management[](#design-management "Permalink")
使用[Design Management](design_management.html) ,您可以将设计资产上载到问题并一起查看它们,以轻松地与团队共享和协作.
### Epics[](#epics-premium "Permalink")
[Epics](../../group/epics/index.html)通过跟踪跨项目和里程碑共享主题的问题组,使您可以更有效,更[轻松地](../../group/epics/index.html)管理项目组合.
### Related issues[](#related-issues-starter "Permalink")
您可以将两个问题标记为"相关",以便在查看一个问题时,另一个[问题](related_issues.html)始终列在" [相关问题"](related_issues.html)部分中. 这可以帮助显示重要的上下文,例如过去的工作,依赖项或重复项.
### Crosslinking issues[](#crosslinking-issues "Permalink")
您可以通过引用另一个问题中的问题来[交叉链接问题](crosslinking_issues.html) ,也可以通过包括其 URL 或 ID 来合并请求. 参考的问题在活动流中显示有关参考的消息,并带有指向其他问题或 MR 的链接.
### Similar issues[](#similar-issues "Permalink")
在 GitLab 11.6 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22866) .
为了防止同一主题重复出现问题,GitLab 在创建新问题时会搜索相似的问题.
在" **新问题"**页面中键入标题时,GitLab 会搜索用户在当前项目中有权访问的所有问题的标题和描述. 标题框下方最多显示五个类似问题(按最新更新排序). 请注意,此功能需要启用[GraphQL](../../../api/graphql/index.html) .
[![Similar issues](img/95882a4976be6b95971ad0011fcd7617.png)](img/similar_issues.png)
### Health status[](#health-status-ultimate "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36427) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10.
为了帮助您跟踪问题的状态,您可以为每个问题分配一个状态,以标记按计划进行或需要注意以按时进行的工作:
* **步入正轨** (green)
* **需要注意** (amber)
* **有一定风险** (red)
[!["On track" health status on an issue](img/8308fbab7a41e24cad0bf6c358863ae3.png)](img/issue_health_status_dropdown_v12_10.png)
然后,您可以在[Epic 树上](../../group/epics/index.html#issue-health-status-in-epic-tree-ultimate)查看问题状态.
#### Disable issue health status[](#disable-issue-health-status "Permalink")
此功能默认启用`:save_issuable_health_status`功能标志. 但是,在某些情况下,此功能与旧配置不兼容. 要在迁移配置时关闭该功能,请要求具有 Rails 控制台访问权限的 GitLab 管理员运行以下命令:
```
Feature.disable(:save_issuable_health_status)
```
## Other Issue actions[](#other-issue-actions "Permalink")
* [Create an issue from a template](../../project/description_templates.html#using-the-templates)
* [Set a due date](due_dates.html)
* [批量编辑问题](../bulk_editing.html) -从问题列表中选择多个问题,以批量更改其状态,受让人,里程碑或标签.
* [Import issues](csv_import.html)
* [Export issues](csv_export.html)
* [Issues API](../../../api/issues.html)
* 配置[外部问题跟踪器,](../../../integration/external-issue-tracker.html)例如 Jira,Redmine 或 Bugzilla.
\ No newline at end of file
此差异已折叠。
# Releases[](#releases "Permalink")
在 GitLab 11.7 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41766) .
要在源代码历史记录中引入检查点,可以在发布时分配[Git 标签](https://git-scm.com/book/en/v2/Git-Basics-Tagging) . 但是,在大多数情况下,您的用户不仅需要原始源代码. 他们需要 CI / CD 系统输出的已编译对象或其他资产.
GitLab *发行版*是与代码的发行版本相关联的源,构建输出,工件和其他元数据的快照.
您可以在任何分支上创建一个 GitLab 版本. 创建发行版时:
* manbetx 客户端打不开自动归档源代码,并将其与版本关联.
* GitLab 会自动创建一个 JSON 文件,其中列出了发行版中的所有内容,因此您可以比较和审核发行版. 该文件称为[发布证据](#release-evidence) .
* 您可以添加发行说明以及与发行版关联的标签的消息.
创建发行版后,您可以将[里程碑与其关联](#associate-milestones-with-a-release) ,并附加[发行资产](#release-assets) ,例如运行手册或软件包.
## View releases[](#view-releases "Permalink")
在 GitLab 12.8 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/36667) .
要查看版本列表:
* 转到**项目概述>版本** ,或
* 在项目的概述页面上,如果存在至少一个版本,请单击版本数.
[![Number of Releases](img/4b690260474eb340f7b3f6d25b0568d2.png "Incremental counter of Releases")](img/releases_count_v13_2.png)
* 在公共项目上,此数字对所有用户可见.
* 在私有项目上,具有 Reporter [权限](../../permissions.html#project-members-permissions)或更高[权限的](../../permissions.html#project-members-permissions)用户可以看到此数字.
## Create a release[](#create-a-release "Permalink")
在 GitLab 12.9 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/32812) . 可以在 GitLab UI 中直接创建发布.
**注意:**只有具有开发者权限或更高权限的用户才能创建发行版. 阅读有关[释放权限的](../../../user/permissions.html#project-members-permissions)更多信息.
您可以在用户界面中或使用[Releases API](../../../api/releases/index.html#create-a-release)创建发布. 我们建议使用 API​​添加发行说明,作为 CI / CD 发行流程中的最后步骤之一.
要通过 GitLab UI 创建新版本:
1. 导航到**项目概述>发布** ,然后单击**新发布**按钮.
2.[**标签名称**](#tag-name)框中,输入一个名称.
3. In the **从创建** list, select the branch or enter a tag or commit SHA.
4. 在" **消息"**框中,输入与标签关联的消息.
5. (可选)在" [**发行说明"**](#release-notes-description)字段中,输入发行说明. 您可以使用 Markdown 并将文件拖放到此字段.
* 如果将此字段留空,则只会创建一个标签.
* 如果您填充它,将同时创建标签和发行版.
6. Click **创建标签**.
如果创建了发行​​版,则可以在**项目概述>发行版中**对其进行查看. 如果创建了标签,则可以在**存储库>标签中**查看它.
现在,您可以编辑发布以[添加里程碑](#associate-milestones-with-a-release)[发布资产](#release-assets) .
### Schedule a future release[](#schedule-a-future-release "Permalink")
在 GitLab 12.1 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/38105) .
您可以使用[Releases API](../../../api/releases/index.html#upcoming-releases)提前创建发行[](../../../api/releases/index.html#upcoming-releases) . 当您设置将来的`released_at`日期时,将在发布标签旁边显示**即将发布**的发布标志. 经过`released_at`日期和时间后,会自动删除徽章.
[![An upcoming release](img/7727ed12caef6b761b73e4bd379c7839.png)](img/upcoming_release_v12_7.png)
## Edit a release[](#edit-a-release "Permalink")
在 GitLab 12.6 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/26016) . 在 GitLab 12.10 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/9427)了资产链接编辑.
**注意:**只有具有开发者权限或更高权限的用户才能编辑发行版. 阅读有关[释放权限的](../../../user/permissions.html#project-members-permissions)更多信息.
要编辑发布的详细信息:
1. 导航到**项目概述>发布** .
2. 在您要修改的发行版的右上角,单击" **编辑此发行版"** (铅笔图标).
3. 在" **编辑版本"**页面上,更改版本的详细信息.
4. Click **保存更改**.
您可以编辑发行标题,注释,关联的里程碑和资产链接. 要更改其他发行信息,例如标签或发行日期,请使用[Releases API](../../../api/releases/index.html#update-a-release) .
## Add release notes to Git tags[](#add-release-notes-to-git-tags "Permalink")
If you have an existing Git tag, you can add release notes to it.
您可以在用户界面中或使用[Releases API](../../../api/releases/index.html)来执行此操作. 我们建议使用 API​​添加发行说明,作为 CI / CD 发行流程中的最后步骤之一.
在界面中,要向新的 Git 标签添加发行说明:
1. 导航到您项目的**Repository> Tags** .
2. Click **新的一天**.
3.**发行说明**字段中,输入发行说明. 您可以使用 Markdown 并将文件拖放到此字段.
4. Click **创建标签**.
在界面中,要将发行说明添加到现有的 Git 标签:
1. 导航到您项目的**Repository> Tags** .
2. 单击**编辑发行说明** (铅笔图标).
3.**发行说明**字段中,输入发行说明. 您可以在此字段中使用 Markdown,并将文件拖放到该字段中.
4. Click **保存更改**.
## Associate milestones with a release[](#associate-milestones-with-a-release "Permalink")
版本历史
* 在 GitLab 12.5 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/29020) .
* [已更新](https://gitlab.com/gitlab-org/gitlab/-/issues/39467) ,可在 GitLab 13.0 中的 UI 中编辑里程碑.
您可以将一个版本与一个或多个[项目里程碑](../milestones/index.html#project-milestones-and-group-milestones)相关联.
您可以在用户界面中执行此操作,也可以在对[Releases API 的](../../../api/releases/index.html#create-a-release)请求中包含一个`milestones`数组.
在用户界面中,要将里程碑与版本关联:
1. 导航到**项目概述>发布** .
2. 在您要修改的发行版的右上角,单击" **编辑此发行版"** (铅笔图标).
3. 从" **里程碑"**列表中,选择要关联的每个里程碑. 您可以选择多个里程碑.
4. Click **保存更改**.
在" **项目概述">"发布"**页面上, **里程碑**列在顶部,以及有关里程碑问题的统计信息.
[![A Release with one associated milestone](img/21967843cf3a12bcfa5e39a39b1b3f69.png)](img/release_with_milestone_v12_9.png)
在" **问题">"里程碑"**页面上,以及当您单击此页面上的里程碑时,也可以看到发行版本.
这是一个里程碑示例,分别没有发布,一个发布和两个发布.
[![Milestones with and without Release associations](img/e6ef8c883764c13967c9c9fcc5617980.png)](img/milestone_list_with_releases_v12_5.png)
## Get notified when a release is created[](#get-notified-when-a-release-is-created "Permalink")
在 GitLab 12.4 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/26001) .
为您的项目创建新版本时,将通过电子邮件通知您.
订阅发布通知:
1. 导航到" **项目概述"** .
2. 单击**通知设置** (响铃图标).
3. 在列表中,点击**自定义** .
4. Select the **新品发布** check box.
5. 关闭对话框进行保存.
## Prevent unintentional releases by setting a deploy freeze[](#prevent-unintentional-releases-by-setting-a-deploy-freeze "Permalink")
在 GitLab 13.0 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29382) .
通过设置[*部署冻结*期,](../../../ci/environments/deployment_safety.html)可以在指定的时间内防止意外的生产发布. 冻结部署有助于减少自动化部署时的不确定性和风险.
使用" [冻结时间" API](../../../api/freeze_periods.html)设置被定义为[crontab](https://crontab.guru/)条目的`freeze_start``freeze_end` .
如果正在执行的作业处于冻结期,则 GitLab CI / CD 会创建一个名为`$CI_DEPLOY_FREEZE`的环境变量.
为了防止执行部署作业,请在`gitlab-ci.yaml`创建一个`rules`条目,例如:
```
deploy_to_production:
stage: deploy
script: deploy_to_prod.sh
rules:
- if: $CI_DEPLOY_FREEZE == null
```
如果项目包含多个冻结期,则所有时期都适用. 如果它们重叠,则冻结将覆盖整个重叠期间.
有关更多信息,请参阅[部署安全](../../../ci/environments/deployment_safety.html) .
## Release fields[](#release-fields "Permalink")
创建或编辑发行版时,以下字段可用.
### Tag name[](#tag-name "Permalink")
发行标签名称应包括发行版本. GitLab 在我们的发行版中使用[语义版本控制](https://semver.org/) ,我们建议您也这样做. 使用`(Major).(Minor).(Patch)` ,如[GitLab 版本控制政策](../../../policy/maintenance.html#versioning)中所述.
例如,对于 GitLab 版本`10.5.7`
* `10`代表主要版本. 主要版本是`10.0.0` ,但通常称为`10.0` .
* `5`代表次要版本. 次要版本为`10.5.0` ,但通常称为`10.5` .
* `7`代表补丁号码.
版本号的任何部分都可以是多个数字,例如`13.10.11` .
### Release notes description[](#release-notes-description "Permalink")
每个版本都有说明. 您可以添加任何您喜欢的文本,但是我们建议您添加一个变更日志来描述发行版本的内容. 这可以帮助用户快速扫描您发布的每个版本之间的差异.
**注意:** [Git 的标记消息](https://git-scm.com/book/en/v2/Git-Basics-Tagging)和发行说明描述无关. 说明支持[Markdown](../../markdown.html) .
### Release assets[](#release-assets "Permalink")
当前,您可以将以下类型的资产添加到每个版本:
* [Source code](#source-code)
* [Links](#links)
manbetx 客户端打不开将在未来支持更多的资产类型,包括诸如预装包,合规性/安全证据或容器图像之类的对象.
#### Permanent links to release assets[](#permanent-links-to-release-assets "Permalink")
在 GitLab 12.9 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/27300) .
与发布相关联的资产可通过永久 URL 访问. GitLab 将始终将此 URL 重定向到实际资产位置,因此,即使资产移动到其他位置,您也可以继续使用相同的 URL. 这是在[链接创建](../../../api/releases/links.html#create-a-link)[更新](../../../api/releases/links.html#update-a-link)期间定义的.
每个资产都有一个名称, *实际*资产位置的 URL,以及一个可选的`filepath`参数,如果您指定它,它将创建指向发布的资产的 URL. URL 的格式为:
```
https://host/namespace/project/releases/:release/downloads/:filepath
```
如果您对资产`v11.9.0-rc2`的发布`gitlab-org`命名空间和`gitlab-runner`项目上`gitlab.com` ,例如:
```
{ "name": "linux amd64", "filepath": "/binaries/gitlab-runner-linux-amd64", "url": "https://gitlab-runner-downloads.s3.amazonaws.com/v11.9.0-rc2/binaries/gitlab-runner-linux-amd64" }
```
该资产具有以下直接链接:
```
https://gitlab.com/gitlab-org/gitlab-runner/releases/v11.9.0-rc2/downloads/binaries/gitlab-runner-linux-amd64
```
资产的物理位置可以随时更改,并且直接链接将保持不变.
### Source code[](#source-code "Permalink")
GitLab 会根据给定的 Git 标签自动生成`zip``tar.gz``tar.bz2``tar`归档的源代码. 这些是只读资产.
### Links[](#links "Permalink")
A link is any URL which can point to whatever you like: documentation, built binaries, or other related materials. These can be both internal or external links from your GitLab instance.
链接的四种类型是" Runbook"," Package"," Image"和" Other".
## Release evidence[](#release-evidence "Permalink")
在 GitLab 12.6 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/26019) .
每次创建发行版时,GitLab 都会拍摄与之相关的数据快照. 此数据保存在 JSON 文件中,称为*发布证据* . 它包括链接的里程碑和问题,并且可以促进内部流程,例如外部审核.
要访问发布证据,请在"发布"页面上,单击" **证据集合"**标题下列出的 JSON 文件的链接.
您还可以[使用 API](../../../api/releases/index.html#collect-release-evidence-premium-only)生成现有版本的版本证据. 因此,每个版本可以具有多个版本证据快照. 您可以在"发布"页面上查看发布证据及其详细信息.
**注意:**禁用问题跟踪器后, [将无法下载](https://gitlab.com/gitlab-org/gitlab/-/issues/208397)发布证据.
这是释放证据对象的示例:
```
{ "release": { "id": 5, "tag_name": "v4.0", "name": "New release", "project": { "id": 20, "name": "Project name", "created_at": "2019-04-14T11:12:13.940Z", "description": "Project description" }, "created_at": "2019-06-28 13:23:40 UTC", "description": "Release description", "milestones": [ { "id": 11, "title": "v4.0-rc1", "state": "closed", "due_date": "2019-05-12 12:00:00 UTC", "created_at": "2019-04-17 15:45:12 UTC", "issues": [ { "id": 82, "title": "The top-right popup is broken", "author_name": "John Doe", "author_email": "john@doe.com", "state": "closed", "due_date": "2019-05-10 12:00:00 UTC" }, { "id": 89, "title": "The title of this page is misleading", "author_name": "Jane Smith", "author_email": "jane@smith.com", "state": "closed", "due_date": "nil" } ] }, { "id": 12, "title": "v4.0-rc2", "state": "closed", "due_date": "2019-05-30 18:30:00 UTC", "created_at": "2019-04-17 15:45:12 UTC", "issues": [] } ], "report_artifacts": [ { "url":"https://gitlab.example.com/root/project-name/-/jobs/111/artifacts/download" } ] } }
```
### Collect release evidence[](#collect-release-evidence-premium-only "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/199065) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.10.
创建发布后,将自动收集发布证据. 要在其他任何时间启动证据收集,请使用[API 调用](../../../api/releases/index.html#collect-release-evidence-premium-only) . 您可以为一个发布多次收集发布证据.
在"发布"页面上可以看到证据收集快照,以及收集证据的时间戳.
### Include report artifacts as release evidence[](#include-report-artifacts-as-release-evidence-ultimate-only "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32773) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.2.
创建发布时,如果[作业工件](../../../ci/pipelines/job_artifacts.html#artifactsreports)包含在最后运行的管道中,则它们会自动作为发布证据包含在发布中.
尽管工作工件通常会过期,但发布证据中包含的工件不会过期.
要启用作业工件收集,您需要同时指定两个:
1. [`artifacts:paths`](../../../ci/yaml/README.html#artifactspaths)
2. [`artifacts:reports`](../../../ci/pipelines/job_artifacts.html#artifactsreports)
```
ruby:
script:
- gem install bundler
- bundle install
- bundle exec rspec --format progress --format RspecJunitFormatter --out rspec.xml
artifacts:
paths:
- rspec.xml
reports:
junit: rspec.xml
```
如果管道成功运行,则在创建发布时, `rspec.xml`文件将保存为发布证据.
**注:**如果您[计划发布证据收集](#schedule-release-evidence-collection) ,则某些[证据](#schedule-release-evidence-collection)可能在证据收集时已经过期. 为了避免这种情况,可以使用[`artifacts:expire_in`](../../../ci/yaml/README.html#artifactsexpire_in)关键字. 了解更多在[这个问题上](https://gitlab.com/gitlab-org/gitlab/-/issues/222351) .
### Schedule release evidence collection[](#schedule-release-evidence-collection "Permalink")
在 GitLab 12.8 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23697) .
在 API 中:
* 如果您指定未来的`released_at`日期,则该发布将成为**即将发布的发布,**并且将在发布日期收集证据. 在此之前,您无法收集释放证据.
* 如果您使用过去的`released_at`日期,则不会收集任何证据.
* 如果您未指定`released_at`日期,则在创建发布的日期收集发布证据.
### Disable release evidence display[](#disable-release-evidence-display-core-only "Permalink")
`:release_evidence_collection`功能标志在 GitLab 自管理实例中默认启用. 要关闭它,请要求具有 Rails 控制台访问权限的 GitLab 管理员运行以下命令:
```
Feature.disable(:release_evidence_collection)
```
**注意:**无论使用此功能标志如何,都将收集发布证据,该标志仅启用或禁用"发布"页面上的数据显示.
## GitLab Releaser[](#gitlab-releaser "Permalink")
在 GitLab 12.10 中[引入](https://gitlab.com/gitlab-org/gitlab-releaser/-/merge_requests/6) .
GitLab Releaser 是一个 CLI 工具,用于从命令行或 GitLab 的 CI / CD 配置文件`.gitlab-ci.yml`管理 GitLab 版本.
有了它,您可以直接通过终端创建,更新,修改和删除发行版.
有关详细信息,请阅读[GitLab Releaser 文档](https://gitlab.com/gitlab-org/gitlab-releaser/-/tree/master/docs/index.md) .
\ No newline at end of file
# SSH密钥[](#SSH密钥 "Permalink")
Git 是一个分布式版本控制系统,这意味着您可以在本地工作. 此外,您还可以将更改共享或"推送"到其他服务器. GitLab 支持使用 SSH 密钥在 Git 及其服务器之间进行安全通信.
SSH 协议提供了这种安全性,并允许您向 GitLab 远程服务器进行身份验证,而无需每次都提供用户名或密码.
该页面可以帮助您配置安全的 SSH 密钥,这些密钥可用于帮助保护与 GitLab 存储库的连接.
* 如果您需要有关创建 SSH 密钥的信息,请从我们[的 SSH 密钥选项](#options-for-ssh-keys)开始.
* 如果您有专用于 GitLab 帐户的 SSH 密钥,则可能对[使用非默认 SSH 密钥对路径](#working-with-non-default-ssh-key-pair-paths)感兴趣.
* 如果您已经有了 SSH 密钥对,则可以转到[将 SSH 密钥添加到 GitLab 帐户的方法](#adding-an-ssh-key-to-your-gitlab-account) .
## Requirements[](#requirements "Permalink")
为了支持 SSH,GitLab 需要安装 OpenSSH 客户端,该客户端已预安装在 GNU / Linux 和 macOS 上,但未预先安装在 Windows 上.
确保您的系统包括 SSH 6.5 或更高版本,因为它不包括现在不安全的 MD5 签名方案. 以下命令返回系统上安装的 SSH 版本:
```
ssh -V
```
尽管 GitLab 不[支持在 Microsoft Windows 上进行安装](../install/requirements.html#microsoft-windows) ,但是您可以设置 SSH 密钥以将 Windows 设置[为客户端](#options-for-microsoft-windows) .
## Options for SSH keys[](#options-for-ssh-keys "Permalink")
GitLab 支持使用 RSA,DSA,ECDSA 和 ED25519 密钥.
* GitLab 在 GitLab 11.0 中已[弃用](https://about.gitlab.com/releases/2018/06/22/gitlab-11-0-released/#support-for-dsa-ssh-keys) DSA 密钥.
*[Go 实用密码术中](https://leanpub.com/gocrypto/read#leanpub-auto-ecdsa)所述,与 DSA 相关的安全性问题也适用于 ECDSA.
**提示:**现有文档表明 ED25519 更安全. 如果使用 RSA 密钥,则美国国家科学技术研究院[出版物 800-57 第 3 部分(PDF)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)建议密钥大小至少为 2048 位.
因此,我们的文档集中在 ED25519 和 RSA 密钥的使用上.
管理员可以[限制应允许的密钥及其最小长度](../security/ssh_keys_restrictions.html) .
## Review existing SSH keys[](#review-existing-ssh-keys "Permalink")
如果您已有 SSH 密钥,则可以使用它们来帮助保护与 GitLab 存储库的连接. 默认情况下,Linux 和 macOS 系统上的 SSH 密钥存储在用户的主目录中的`.ssh/`子目录中. 下表包括每种 SSH 密钥算法的默认文件名:
| Algorithm | 公钥 | 私钥 |
| --- | --- | --- |
| ED25519(首选) | `id_ed25519.pub` | `id_ed25519` |
| RSA(至少 2048 位密钥大小) | `id_rsa.pub` | `id_rsa` |
| DSA(已弃用) | `id_dsa.pub` | `id_dsa` |
| ECDSA | `id_ecdsa.pub` | `id_ecdsa` |
有关建议,请参阅[SSH 密钥的选项](#options-for-ssh-keys) .
## Generating a new SSH key pair[](#generating-a-new-ssh-key-pair "Permalink")
如果要创建:
* ED25519 密钥,请阅读[ED25519 SSH 密钥](#ed25519-ssh-keys) .
* RSA 密钥,请阅读[RSA SSH 密钥](#rsa-ssh-keys) .
### ED25519 SSH keys[](#ed25519-ssh-keys "Permalink")
The book [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-chapter-5-digital-signatures) suggests that [ED25519](https://ed25519.cr.yp.to/) keys are more secure and performant than RSA keys.
随着 OpenSSH 6.5 在 2014 年引入 ED25519 SSH 密钥,它们应该在任何当前操作系统上都可用.
您可以使用以下命令创建和配置 ED25519 密钥:
```
ssh-keygen -t ed25519 -C "<comment>"
```
`-C`标志(带引号的注释,例如电子邮件地址)是标记 SSH 密钥的可选方法.
您将看到类似于以下内容的响应:
```
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
```
要获得指导,请继续执行[常见步骤](#common-steps-for-generating-an-ssh-key-pair) .
### RSA SSH keys[](#rsa-ssh-keys "Permalink")
如果您将 RSA 密钥用于 SSH,则美国国家标准技术研究院建议您使用[至少 2048 位](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)的密钥大小. 缺省情况下, `ssh-keygen`命令创建一个 1024 位 RSA 密钥.
您可以使用以下命令创建和配置 RSA 密钥,如果需要,可以使用建议的最小密钥大小`2048`代替:
```
ssh-keygen -t rsa -b 2048 -C "email@example.com"
```
`-C`标志(带引号的注释,例如电子邮件地址)是标记 SSH 密钥的可选方法.
您将看到类似于以下内容的响应:
```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
```
要获得指导,请继续执行[常见步骤](#common-steps-for-generating-an-ssh-key-pair) .
**注意:**如果您具有 7.8 或更低版本的 OpenSSH,请考虑与[编码](#rsa-keys-and-openssh-from-versions-65-to-78)相关的问题.
### Common steps for generating an SSH key pair[](#common-steps-for-generating-an-ssh-key-pair "Permalink")
无论是创建[ED25519](#ed25519-ssh-keys)还是创建[RSA](#rsa-ssh-keys)密钥,您都从`ssh-keygen`命令开始. 此时,您将在命令行中看到以下消息(用于 ED25519 键):
```
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
```
如果您还没有 SSH 密钥对并且没有生成[部署密钥](#deploy-keys) ,请接受建议的文件和目录. 您的 SSH 客户端将使用生成的 SSH 密钥对,而无需其他配置.
或者,您可以将新的 SSH 密钥对保存在其他位置. 您可以分配您选择的目录和文件名. 您还可以将 SSH 密钥对专用于[特定主机](#working-with-non-default-ssh-key-pair-paths) .
分配文件以保存 SSH 密钥后,您将有机会为 SSH 密钥设置[密码](https://www.ssh.com/ssh/passphrase/)
```
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
如果成功,您将看到有关`ssh-keygen`命令将标识和私钥保存在何处的确认.
需要时,可以使用以下命令更新密码:
```
ssh-keygen -p -f /path/to/ssh_key
```
### RSA keys and OpenSSH from versions 6.5 to 7.8[](#rsa-keys-and-openssh-from-versions-65-to-78 "Permalink")
在 OpenSSH 7.8 之前,RSA 密钥的默认公共密钥指纹基于 MD5,因此不安全.
如果您的 OpenSSH 版本介于 6.5 至 7.8(含)之间,请使用`-o`选项运行`ssh-keygen` ,以更安全的 OpenSSH 格式保存您的私人 SSH 密钥.
如果您已经具有可用于 GitLab 的 RSA SSH 密钥对,请考虑对其进行升级以使用更安全的密码加密格式. 您可以使用以下命令进行操作:
```
ssh-keygen -o -f ~/.ssh/id_rsa
```
或者,您可以使用以下命令以更安全的加密格式生成新的 RSA 密钥:
```
ssh-keygen -o -t rsa -b 4096 -C "email@example.com"
```
**注意:**`ssh-keygen`手册页所述,ED25519 已将密钥加密为更安全的 OpenSSH 格式.
## Adding an SSH key to your GitLab account[](#adding-an-ssh-key-to-your-gitlab-account "Permalink")
现在,您可以将创建的 SSH 密钥复制到您的 GitLab 帐户. 这样做,请按照下列步骤操作:
1. 将您的**公共** SSH 密钥复制到以文本格式保存信息的位置. 以下选项将 ED25519 键的信息保存到指定操作系统的剪贴板中:
**macOS:**
```
pbcopy < ~/.ssh/id_ed25519.pub
```
**Linux(需要 xclip 软件包):**
```
xclip -sel clip < ~/.ssh/id_ed25519.pub
```
**Windows 上的 Git Bash:**
```
cat ~/.ssh/id_ed25519.pub | clip
```
如果您使用的是 RSA 密钥,请相应地进行替换.
2. 导航到`http://gitlab.com`并登录.
3. 选择右上角的头像,然后单击**设置**
4. Click **SSH 密钥**.
5. 将复制的公共密钥粘贴到" **密钥"**文本框中.
6. 确保您的密钥在" **标题"**文本框中包含描述性名称,例如" *工作笔记本电脑"*或" *家用工作站"* .
7. 在"过期时间"部分下包含密钥的(可选)过期日期. (在[GitLab 12.9 中](https://gitlab.com/gitlab-org/gitlab/-/issues/36243)引入.)
8. 单击**添加键**按钮.
使用此过程"过期"的 SSH 密钥在 GitLab 工作流程中仍然有效. 由于 GitLab 配置的到期日期不包含在 SSH 密钥本身中,因此您仍然可以根据需要导出公共 SSH 密钥.
**注意:**如果您手动复制了公共 SSH 密钥,请确保复制了整个密钥,以`ssh-ed25519` (或`ssh-rsa` )开头,并以您的电子邮件地址结尾.
## Testing that everything is set up correctly[](#testing-that-everything-is-set-up-correctly "Permalink")
要测试是否正确添加了 SSH 密钥,请在终端中运行以下命令(将`gitlab.com`替换为 GitLab 的实例域):
```
ssh -T git@gitlab.com
```
The first time you connect to GitLab via SSH, you will be asked to verify the authenticity of the GitLab host that you’re connecting to. For example, when connecting to GitLab.com, answer `yes` to add GitLab.com to the list of trusted hosts:
```
The authenticity of host 'gitlab.com (35.231.145.151)' can't be established.
ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitlab.com' (ECDSA) to the list of known hosts.
```
**注意:**对于 GitLab.com,请查阅[SSH 主机密钥指纹](../user/gitlab_com/index.html#ssh-host-keys-fingerprints)一节,以确保您连接到正确的服务器. 例如,您会在链接的部分中看到上面显示的 ECDSA 密钥指纹.
一旦添加到已知主机列表中,将不再要求您再次验证 GitLab 主机的真实性. 再次运行以上命令,您将只收到*欢迎使用 GitLab 的`@username` !* 信息.
如果未出现欢迎消息,则可以通过使用以下命令在详细模式下运行`ssh`来解决问题:
```
ssh -Tvvv git@gitlab.com
```
## Working with non-default SSH key pair paths[](#working-with-non-default-ssh-key-pair-paths "Permalink")
如果您为 GitLab SSH 密钥对使用了非默认文件路径,请配置 SSH 客户端以指向 GitLab 私有 SSH 密钥.
要进行这些更改,请运行以下命令:
```
eval $(ssh-agent -s)
ssh-add <path to private SSH key>
```
现在将这些设置保存到`~/.ssh/config`文件中. 这里显示了两个专用于 GitLab 的 SSH 密钥示例:
```
# GitLab.com Host gitlab.com
Preferredauthentications publickey
IdentityFile ~/.ssh/gitlab_com_rsa
# Private GitLab instance Host gitlab.company.com
Preferredauthentications publickey
IdentityFile ~/.ssh/example_com_rsa
```
公用 SSH 密钥对于 GitLab 必须是唯一的,因为它们将绑定到您的帐户. SSH 密钥是通过 SSH 推送代码时唯一的标识符,这就是为什么它需要唯一地映射到单个用户的原因.
## Per-repository SSH keys[](#per-repository-ssh-keys "Permalink")
如果要根据正在使用的存储库使用不同的密钥,则可以在存储库中发出以下命令:
```
git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
```
这将不使用 SSH 代理,并且至少需要 Git 2.10.
## Multiple accounts on a single GitLab instance[](#multiple-accounts-on-a-single-gitlab-instance "Permalink")
[每个存储库](#per-repository-ssh-keys)方法还适用于在单个 GitLab 实例中使用多个帐户.
或者,可以直接在`~.ssh/config`为主机分配别名. 如果在`.ssh/config`中的`Host`块之外设置了`IdentityFile` ,则 SSH 和作为扩展的 Git 将无法登录. 这是由于 SSH 组装`IdentityFile`条目的方式,因此不能通过将`IdentitiesOnly`设置为`yes`来更改. `IdentityFile`条目应指向 SSH 密钥对的私钥.
**注意:**私钥和公用密钥应仅由用户读取. 通过运行以下`chmod 0400 ~/.ssh/<example_ssh_key>`在 Linux 和 macOS 上完成此操作: `chmod 0400 ~/.ssh/<example_ssh_key>``chmod 0400 ~/.ssh/<example_sh_key.pub>` .
```
# User1 Account Identity Host <user_1.gitlab.com>
Hostname gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/<example_ssh_key1>
# User2 Account Identity Host <user_2.gitlab.com>
Hostname gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/<example_ssh_key2>
```
**注意:**为提高效率和透明度,示例`Host`别名定义为`user_1.gitlab.com``user_2.gitlab.com` . 高级配置更难以维护. 使用这种别名使使用其他工具(如`git remote`子命令)时更容易理解. SSH 可以将任何字符串理解为`Host`别名,因此`Tanuki1``Tanuki2`尽管提供了很少的上下文指向它们,也可以使用.
克隆`gitlab`存储库通常如下所示:
```
git clone git@gitlab.com:gitlab-org/gitlab.git
```
要为`user_1`克隆它,请将`gitlab.com`替换为 SSH 别名`user_1.gitlab.com`
```
git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
```
使用`git remote`命令修复以前克隆的存储库.
下面的示例假定远程存储库被别名为`origin` .
```
git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
```
## Deploy keys[](#deploy-keys "Permalink")
阅读[有关部署密钥](../user/project/deploy_keys/index.html)[文档](../user/project/deploy_keys/index.html) .
## Applications[](#applications "Permalink")
### Eclipse[](#eclipse "Permalink")
如果使用的是[EGit](https://www.eclipse.org/egit/) ,则可以[将 SSH 密钥添加到 Eclipse](https://wiki.eclipse.org/EGit/User_Guide#Eclipse_SSH_Configuration) .
## SSH on the GitLab server[](#ssh-on-the-gitlab-server "Permalink")
GitLab 与系统安装的 SSH 守护程序集成,指定一个用户(通常名为`git` )来处理所有访问请求. 通过 SSH 连接到 GitLab 服务器的用户由其 SSH 密钥而不是其用户名标识.
在 GitLab 服务器上执行的 SSH *客户端*操作将以该用户身份执行. 尽管可以修改此用户的 SSH 配置,例如提供专用 SSH 密钥来验证这些请求,但是这种做法**不受支持** ,并且强烈建议这样做,因为这样做会带来重大的安全风险.
GitLab 检查过程包括对这种情况的检查,如果您的服务器配置如下,它将引导您进入本节,例如:
```
$ gitlab-rake gitlab:check
Git user has default SSH configuration? ... no
Try fixing it:
mkdir ~/gitlab-check-backup-1504540051
sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
For more information see:
doc/ssh/README.md in section "SSH on the GitLab server"
Please fix the error above and rerun the checks.
```
尽快删除自定义配置. 这些自定义项*明确不受支持,*并且可能随时停止工作.
### Options for Microsoft Windows[](#options-for-microsoft-windows "Permalink")
如果您运行的是 Windows 10, [适用于 Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10)[Windows 子系统(WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)及其最新的[WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2)版本,则支持安装不同的 Linux 发行版,其中包括 Git 和 SSH 客户端.
对于当前版本的 Windows,您还可以通过[Git for Windows](https://gitforwindows.org)安装 Git 和 SSH 客户端.
替代工具包括:
* [Cygwin](https://www.cygwin.com)
* [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
## Troubleshooting[](#troubleshooting "Permalink")
如果在 Git 克隆上,系统会提示您输入密码,例如`git@gitlab.com's password:` SSH 设置有问题.
* 确保您正确生成了 SSH 密钥对,并将公共 SSH 密钥添加到了 GitLab 配置文件
* 尝试使用`ssh-agent`手动注册您的私有 SSH 密钥,如本文档前面所述
* 尝试通过运行`ssh -Tv git@example.com`调试连接(将 GitLab 域替换为`example.com`
\ No newline at end of file
# Squash合并[](#Squash合并 "Permalink")
版本历史
*[GitLab Starter](https://about.gitlab.com/pricing/) 8.17 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1024) .
* [移植](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18956)到 GitLab Core 11.0\.
使用 squash 和 merge,您可以将所有合并请求的提交合并为一个并保留干净的历史记录.
## Overview[](#overview "Permalink")
通过压接,您可以在接受合并请求时整理分支的提交历史记录. 它将合并请求中的所有更改作为单个提交应用,然后使用为项目设置的合并方法合并该提交.
换句话说,挤压合并请求会变成一长串提交:
[![List of commits from a merge request](img/f2d420adddd87cc8087fea62246e7b67.png)](img/squash_mr_commits.png)
合并为单个提交:
[![A squashed commit followed by a merge commit](img/e81fe926a5b379f37dfc5af80b8f83f3.png)](img/squash_squashed_commit.png)
压缩的提交的提交消息将是:
* 取自合并中的第一条多行提交消息.
* 如果找不到多行提交消息,则合并请求的标题.
**注意:**仅在至少 2 次提交时,此选项才生效. 由于没有什么可压缩的,因此如果只有 1 次提交,则提交消息不会更改.
可以在合并合并请求之前对其进行自定义.
[![A squash commit message editor](img/618ce3d47266d9b45262489065b68cf7.png)](img/squash_mr_message.png)
**注意:**在此示例中,压缩的提交之后是合并提交,因为此示例存储库的合并方法使用了合并提交.
压缩也适用于快进合并策略,有关更多详细信息,请参见[压缩和快进合并](#squash-and-fast-forward-merge) .
## Use cases[](#use-cases "Permalink")
在功能分支上工作时,有时您想提交当前进度,但实际上并不关心提交消息. 这些"进行中的提交"不一定包含重要的信息,因此,您宁愿不将其包含在目标分支中.
使用 squash 和 merge,当准备好要合并的合并请求时,您要做的就是在按下 merge 之前将挤压启用,以将合并请求中的提交加入到单个提交中.
这样,您的基本分支的历史记录将保留有意义的提交消息,并且:
* 如有必要, [还原](revert_changes.html)更为简单.
* 合并的分支将保留完整的提交历史记录.
## Enabling squash for a merge request[](#enabling-squash-for-a-merge-request "Permalink")
可以创建或编辑合并请求的任何人都可以选择将其压缩在合并请求表单上:
[![Squash commits checkbox on edit form](img/fd54213f0e98a4b2f6482ab98d497410.png)](img/squash_edit_form.png)
然后可以在接受合并请求时覆盖它:
[![Squash commits checkbox on accept merge request form](img/3667bc1901823963df25df8a2458047a.png)](img/squash_mr_widget.png)
## Commit metadata for squashed commits[](#commit-metadata-for-squashed-commits "Permalink")
压缩的提交具有以下元数据:
* 消息:壁球提交消息或自定义消息.
* 作者:合并请求的作者.
* 提交者:发起壁球的用户.
## Squash and fast-forward merge[](#squash-and-fast-forward-merge "Permalink")
当项目[启用](fast_forward_merge.html#enabling-fast-forward-merges)[快进合并设置时](fast_forward_merge.html#enabling-fast-forward-merges) ,合并请求必须能够不压缩而进行快速转发以进行压缩. 这是因为压缩仅在接受合并请求时可用,因此即使挤压本身可以被认为等同于重新基准化,也可能需要在压缩之前对合并请求进行重新基准化.
## Squash Commits Options[](#squash-commits-options "Permalink")
版本历史
* 在 GitLab 13.2 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/17613) .
* 它部署在功能标记后面,默认情况下处于禁用状态.
* 在 GitLab.com 上已禁用.
* 不建议将其用于生产.
* 要在 GitLab 自管实例中使用它,请让 GitLab 管理员[启用它](#enable-or-disable-squash-commit-options-core-only) .
使用 Squash Commits Options,您可以为项目配置 Squash 和 Merge 的行为. 要进行设置,请导航至项目的**设置>常规,**然后展开**合并请求** . 您将找到以下选项可供选择,这将影响提交给您的项目的现有和新合并请求:
* **不允许** :用户不能在合并之前立即使用 Squash 和 Merge 来压缩所有提交. 启用或禁用它的复选框将被取消选中,并且对用户隐藏.
* **Allow**: users will have the option to enable Squash and Merge on a merge request basis. The checkbox will be unchecked (disabled) by default, but and the user is allowed to enable it.
* **鼓励** :用户可以选择在合并请求的基础上启用 Squash 和 Merge. 默认情况下会选中(启用)该复选框以鼓励使用,但允许用户禁用它.
* **要求** :对所有合并请求都启用了"挤压和合并",因此将始终执行. 启用或禁用它的复选框将被选中并向用户隐藏.
创建合并请求以及编辑现有请求的描述时,将显示" Squash and Merge"复选框,但" Squash Commit Options"设置为**"不允许"**或" **Require"**时除外.
**注意:**如果您的项目设置为**"不允许**挤压和合并",则用户仍然可以选择通过命令行在本地挤压提交,并在合并之前强制将其推送到其远程分支.
### Enable or disable Squash Commit Options[](#enable-or-disable-squash-commit-options-core-only "Permalink")
壁球提交选项正在开发中,尚未准备好用于生产. 它部署在**默认情况下禁用**的功能标志的后面. [有权访问 GitLab Rails 控制台的 GitLab 管理员](../../../administration/feature_flags.html)可以为您的实例启用它. 可以根据项目启用或禁用壁球提交选项.
要启用它:
```
# Instance-wide
Feature.enable(:squash_options)
# or by project
Feature.enable(:squash_options, Project.find(<project id>))
```
禁用它:
```
# Instance-wide
Feature.disable(:squash_options)
# or by project
Feature.disable(:squash_options, Project.find(<project id>))
```
\ No newline at end of file
# Web IDE[](#web-ide "Permalink")
版本历史
*[GitLab Ultimate](https://about.gitlab.com/pricing/) 10.4 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/4539) .
* 在 10.7 版中[移至](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/44157) GitLab Core.
Web IDE 编辑器通过提供具有提交阶段的高级编辑器,可以更快,更轻松地为项目贡献更改.
## Open the Web IDE[](#open-the-web-ide "Permalink")
您可以从存储库文件列表和合并请求中查看文件时打开 Web IDE.
[![Open Web IDE](img/7a0b5b2ee322d8676753d89561c1d3cb.png)](img/open_web_ide.png)
## File finder[](#file-finder "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18323) in [GitLab Core](https://about.gitlab.com/pricing/) 10.8.
通过文件查找器,您可以通过搜索快速打开当前分支中的文件. 使用键盘快捷键`Command-p``Control-p``t` (当编辑器不在焦点时)启动文件查找器. 输入文件名或文件路径片段以开始查看结果.
## Syntax highlighting[](#syntax-highlighting "Permalink")
正如 IDE 所期望的那样,Web IDE 中多种语言的语法突出显示将使您的直接编辑更加容易.
Web IDE 当前提供:
* 基本语法着色,适用于各种编程,脚本和标记语言,例如 XML,PHP,C#,C ++,Markdown,Java,VB,Batch,Python,Ruby 和 Objective-C.
* 某些语言的 IntelliSense 和验证支持(显示错误和警告,提供智能补全,格式设置和概述). 例如:TypeScript,JavaScript,CSS,LESS,SCSS,JSON 和 HTML.
因为 Web IDE 基于[Monaco Editor](https://microsoft.github.io/monaco-editor/) ,所以您可以在[Monaco 语言](https://github.com/Microsoft/monaco-languages)存储库中找到更完整的受支持语言列表. 在幕后,摩纳哥使用[Monarch](https://microsoft.github.io/monaco-editor/monarch.html)库来突出显示语法.
如果您缺少对任何语言的语法突出显示支持,我们准备了一份简短指南,介绍如何[为缺少的语言语法突出显示添加支持.](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/ide/lib/languages/README.md)
**注意:**单个文件编辑基于[Ace 编辑器](https://ace.c9.io) .
### Themes[](#themes "Permalink")
版本历史
* 在 13.0 版的 GitLab 中[引入](https://gitlab.com/groups/gitlab-org/-/epics/2389) .
* GitLab 13.1 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/219228)了完全日光化黑暗主题.
GitLab 支持的语法突出显示的所有主题都添加到了 Web IDE 的代码编辑器中. 您可以从个人[资料首选项中](../../profile/preferences.html)选择一个主题.
主题仅在 Web IDE 文件编辑器中可用, [深色主题](https://gitlab.com/gitlab-org/gitlab/-/issues/209808)[日光化深色主题](https://gitlab.com/gitlab-org/gitlab/-/issues/219228)除外,它们适用于整个 Web IDE 屏幕.
| 日光灯主题 | 日晒黑暗主题 | 黑暗主题 |
| --- | --- | --- |
| [![Solarized Light Theme](img/d79207e6e4f140448c9dd5e6ebe5e380.png)](img/solarized_light_theme_v13_0.png) | [![Solarized Dark Theme](img/c187176d6b8d40e19db360c4c68ffb46.png)](img/solarized_dark_theme_v13_1.png) | [![Dark Theme](img/30152366655be1543f687603c8d34d96.png)](img/dark_theme_v13_0.png) |
## Configure the Web IDE[](#configure-the-web-ide "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23352) in [GitLab Core](https://about.gitlab.com/pricing/) 13.1.
Web IDE 支持使用[`.editorconfig`文件](https://editorconfig.org/)配置某些编辑器设置. 打开文件时,Web IDE 将在当前目录和所有父目录中查找名为`.editorconfig`的文件. 如果找到配置文件并且其设置与文件的路径匹配,则将在打开的文件上强制执行这些设置.
Web IDE 当前支持以下`.editorconfig`设置:
* `indent_style`
* `indent_size`
* `end_of_line`
* `trim_trailing_whitespace`
* `tab_width`
* `insert_final_newline`
## Commit changes[](#commit-changes "Permalink")
版本历史
*[GitLab Ultimate](https://about.gitlab.com/pricing/) 10.4 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/4539) .
* 在 10.7 版中[移至](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/44157) GitLab Core.
*[GitLab 12.7 开始](https://gitlab.com/gitlab-org/gitlab/-/issues/33441) ,将自动暂存文件.
*[GitLab 12.9 开始](https://gitlab.com/gitlab-org/gitlab/-/issues/196609) ,删除了对暂存文件的支持,以防止丢失未暂存的数据. 您当前的所有更改都必须提交或放弃.
进行更改后,单击左下角的" **提交"**按钮以查看已更改文件的列表.
完成更改后,可以添加提交消息,提交更改并直接创建合并请求. 如果您没有对所选分支的写访问权,则会看到警告,但仍然可以创建新分支并启动合并请求.
要放弃特定文件中的更改,请在"更改"选项卡中单击该文件上的" **放弃更改"**按钮. 要放弃所有更改,请单击更改侧栏右上角的垃圾桶图标.
[![Commit changes](img/bad584bc95c83e26be6c67a2b54b26ae.png)](img/commit_changes_v12_9.png)
## Reviewing changes[](#reviewing-changes "Permalink")
提交更改之前,可以通过切换到查看模式或从更改列表中选择文件来将它们与上一次提交进行比较.
当您打开合并请求时,还可以使用其他查看模式,如果您提交更改,该模式将向您显示合并请求 diff 的预览.
## View CI job logs[](#view-ci-job-logs "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/19279) in [GitLab Core](https://about.gitlab.com/pricing/) 11.0.
您可以使用 Web IDE 通过在 Web IDE 中打开分支或合并请求并打开失败作业的日志来快速修复失败的测试. 通过单击右上角的" **管道"**按钮,可以访问最新管道的所有作业的状态以及当前提交的作业跟踪.
管道状态也始终显示在左下方的状态栏中.
## Switching merge requests[](#switching-merge-requests "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/19318) in [GitLab Core](https://about.gitlab.com/pricing/) 11.0.
要在创作的和分配的合并请求之间切换,请单击侧栏顶部的下拉列表以打开合并请求列表. 在切换到其他合并请求之前,您将需要提交或放弃所有更改.
## Switching branches[](#switching-branches "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20850) in [GitLab Core](https://about.gitlab.com/pricing/) 11.2.
To switch between branches of the current project repository, click the dropdown in the top of the sidebar to open a list of branches. You will need to commit or discard all your changes before switching to a different branch.
## Markdown editing[](#markdown-editing "Permalink")
版本历史
* [GitLab Core](https://about.gitlab.com/pricing/) 10.7 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18059)了 Markdown 预览.
* 支持在[GitLab Core](https://about.gitlab.com/pricing/) 13.1 中[引入的](https://gitlab.com/gitlab-org/gitlab/-/issues/22822)粘贴图像.
在 Web IDE 中编辑 Markdown 文件时,可以通过单击文件编辑器上方的" **预览 Markdown"**选项卡来预览更改. Markdown 预览支持[GitLab 风味 Markdown](../../markdown.html#gitlab-flavored-markdown-gfm) .
您还可以通过将任何本地图像直接粘贴到 Markdown 文件中来上传它们. 该图像将上传到同一目录,默认情况下命名为`image.png` . 如果已经存在相同名称的另一个文件,则将数字后缀自动添加到文件名.
## Live Preview[](#live-preview "Permalink")
版本历史
*[GitLab Core](https://about.gitlab.com/pricing/) 11.2 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/19764) .
* 在 GitLab 13.0 中从*客户端评估* [重命名](https://gitlab.com/gitlab-org/gitlab/-/issues/213853)*实时预览* .
您可以使用 Web IDE 在浏览器中预览 JavaScript 项目. 此功能使用 CodeSandbox 编译和捆绑用于预览 Web 应用程序的 JavaScript.
[![Web IDE Live Preview](img/7efae901a0febb2a8e969415dced271a.png)](img/live_preview_v13_0.png)
Additionally, for public projects an **在 CodeSandbox 中打开** button is available to transfer the contents of the project into a public CodeSandbox project to quickly share your project with others.
### Enabling Live Preview[](#enabling-live-preview "Permalink")
需要在 GitLab 实例管理员设置中启用实时预览功能. 在 GitLab.com 上为所有项目启用了实时预览
[![Admin Live Preview setting](img/fb0d67715160a5a049ca0b8e7d7af698.png)](img/admin_live_preview_v13_0.png)
完成此操作后,您可以使用`package.json`文件和 Web IDE 内的`main`入口点预览项目. 下面显示了一个示例`package.json` .
```
{ "main": "index.js", "dependencies": { "vue": "latest" } }
```
## Interactive Web Terminals for the Web IDE[](#interactive-web-terminals-for-the-web-ide "Permalink")
版本历史
*[GitLab Ultimate](https://about.gitlab.com/pricing/) 11.6 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/5426) .
* 在 13.1 版中[移至](https://gitlab.com/gitlab-org/gitlab/-/issues/211685) GitLab Core.
**警告:** Web IDE 的交互式 Web 终端当前处于**Beta 中** . 共享运行程序[尚不支持交互式 Web 终端](https://gitlab.com/gitlab-org/gitlab/-/issues/24674) ,因此您需要使用自己的私有运行程序来使用此功能.
[交互式 Web 终端](../../../ci/interactive_web_terminal/index.html)使项目[维护者](../../permissions.html#project-members-permissions)用户可以直接从 GitLab(包括通过 Web IDE)访问终端以与 Runner 进行交互.
### Runner configuration[](#runner-configuration "Permalink")
为了使交互式 Web 终端正常工作,需要在运行程序中配置一些内容:
* 跑步者需要[正确配置`[session_server]`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html) . 本部分至少需要一个`session_timeout`值(默认为 1800 秒)和一个`listen_address`值. 如果未定义`advertise_address` ,则使用`listen_address` .
* 如果您对 GitLab 实例使用反向代理,则需要[启用](../../../administration/integration/terminal.html#enabling-and-disabling-terminal-support) Web 终端.
如果您打开终端并且作业已完成其任务,则终端将在[`[session_server].session_timeout`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html)配置的持续时间内阻止作业完成,直到关闭终端窗口.
**注意:**并非所有执行程序都[受支持](https://docs.gitlab.com/runner/executors/) . [文件同步](#file-syncing-to-web-terminal)功能仅在 Kubernetes 运行程序上受支持.
### Web IDE configuration file[](#web-ide-configuration-file "Permalink")
为了启用 Web IDE 终端,您需要在存储库根目录内创建文件`.gitlab/.gitlab-webide.yml` . 该文件与[CI 配置文件的](../../../ci/yaml/README.html)语法非常相似,但有一些限制:
* 无法定义全局块(即: `before_script``after_script`
* 只能将一个名为`terminal`作业添加到该文件中.
* 仅允许使用关键字`image``services``tags``before_script``script``variables`来配置作业.
* 要连接到交互式终端, `terminal`作业必须仍然处于活动状态并且正在运行,否则终端将无法连接到作业的会话. 默认情况下, `script`关键字的值是`sleep 60`以防止作业结束并为 Web IDE 提供足够的连接时间. 这意味着,如果您覆盖默认`script`值,则必须添加一个使作业保持运行`sleep`的命令,例如`sleep` .
在下面的代码中,有此配置文件的示例:
```
terminal:
# This can be any image that has the necessary runtime environment for your project.
image: node:10-alpine
before_script:
- apt-get update
script: sleep 60
variables:
RAILS_ENV: "test"
NODE_ENV: "test"
```
终端启动后,将显示控制台,我们可以访问项目存储库文件.
**重要的** . 终端作业取决于分支. 这意味着用于触发和配置终端的配置文件将是 Web IDE 所选分支中的配置文件.
如果分支中没有配置文件,将显示错误消息.
### Running interactive terminals in the Web IDE[](#running-interactive-terminals-in-the-web-ide "Permalink")
如果交互式终端可供当前用户使用,则" **终端"**按钮将显示在 Web IDE 的右侧栏中. 单击此按钮可以打开或关闭终端选项卡.
打开后,该选项卡将显示" **启动 Web 终端"**按钮. 如果环境配置不正确,则可能禁用此按钮. 如果是这样,状态消息将描述问题. 以下是可能会禁用" **启动 Web 终端"的**一些原因:
* `.gitlab/.gitlab-webide.yml`不存在或设置错误.
* 该项目没有活跃的私人跑步者.
如果处于活动状态,则单击" **启动 Web 终端"**按钮将加载终端视图并开始连接到跑步者的终端. 任何时候都可以关闭并重新打开**终端**选项卡,并且不会影响终端的状态.
当终端启动并成功连接到跑步者时,跑步者的外壳提示将出现在终端中. 在这里,您可以输入将在跑步者的环境中执行的命令. 这类似于在本地终端或通过 SSH 运行命令.
在终端运行时,可以通过单击**Stop Terminal**停止它. 这将断开终端并停止跑步者的终端工作. 在此处,单击" **重新启动终端"**以启动新的终端会话.
### File syncing to web terminal[](#file-syncing-to-web-terminal "Permalink")
版本历史
*[GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/5276) .
* 在 13.1 版中[移至](https://gitlab.com/gitlab-org/gitlab/-/issues/211686) GitLab Core.
Web IDE 中的文件更改可以同步到正在运行的 Web 终端. 这使用户能够在预配置的终端环境中测试其代码更改.
**注意:**仅将 Web IDE 中的文件更改同步到终端. 在终端中所做的更改**不会**同步到 Web IDE. 此功能仅适用于 Kubernetes Runners.
要使文件同步到 Web 终端, `.gitlab/.gitlab-webide.yml`文件需要配置`webide-file-sync`服务. 这是使用此服务的 Node JS 项目的示例配置:
```
terminal:
# This can be any image that has the necessary runtime environment for your project.
image:
name: node:10-alpine
services:
- name: registry.gitlab.com/gitlab-org/webide-file-sync:latest
alias: webide-file-sync
entrypoint: ["/bin/sh"]
command: ["-c", "sleep 5 && ./webide-file-sync -project-dir $CI_PROJECT_DIR"]
ports:
# The `webide-file-sync` executable defaults to port 3000.
- number: 3000
```
* 项目目录可用**后** ,必须启动`webide-file-sync`可执行文件. 这就是为什么我们需要在`command`添加`sleep 5`的原因. 有关更多信息,请参[见此问题](https://gitlab.com/gitlab-org/webide-file-sync/-/issues/7) .
* `$CI_PROJECT_DIR`是 GitLab Runners 的[预定义环境变量](../../../ci/variables/predefined_variables.html) . 这是您项目的存储库所在的位置.
一旦将 Web 终端配置为用于文件同步,则在启动 Web 终端后,状态栏中将显示**终端**状态.
[![Web IDE Client Side Evaluation](img/37238acd557de0d61f0c3be198c56e00.png)](img/terminal_status.png)
在以下情况下,通过 Web IDE 对文件所做的更改将同步到正在运行的终端:
* 编辑文件时,按`Ctrl` + `S` (在 Mac 上为`Cmd` + `S` ).
* 编辑文件后,将单击文件编辑器之外的所有内容.
* 创建,删除或重命名文件或文件夹.
### Limitations[](#limitations "Permalink")
交互式终端处于 beta 阶段,并将在以后的发行版中继续进行改进. 同时,请注意,用户一次只能拥有一个活动终端.
### Troubleshooting[](#troubleshooting "Permalink")
* 如果终端的文本为灰色且无响应,则表明终端已停止,无法再使用. 停止的终端可以通过单击**Restart Terminal 重新启动** .
* 如果终端显示**Connection Failure** ,则终端无法连接到流道. 请尝试停止并重新启动终端. 如果问题仍然存在,请仔细检查流道配置.
\ No newline at end of file
# Wiki[](#wiki "Permalink")
每个 GitLab 项目都内置了一个称为 Wiki 的独立文档系统. 默认情况下,所有新项目都启用此功能,您可以在项目的**Wiki**下找到它.
如果您不想将文档保留在存储库中,但确实希望将其保留在代码所在的项目中,则 Wiki 非常方便.
您可以在 Web 界面中或[使用 Git 在本地](#adding-and-editing-wiki-pages-locally)创建 Wiki 页面,因为每个 Wiki 都是单独的 Git 存储库.
## First time creating the Home page[](#first-time-creating-the-home-page "Permalink")
首次访问 Wiki 时,系统将指示您创建主页. 必须创建主页,因为它是查看 Wiki 时的登录页面. 您只需要填写**内容**部分,然后单击**创建页面** . 您以后可以随时对其进行编辑,因此继续写欢迎信息.
[![New home page](img/909d20c0dd57155c8ac404a81c2a30cb.png)](img/wiki_create_home_page.png)
## Creating a new wiki page[](#creating-a-new-wiki-page "Permalink")
**注意:**需要开发者[权限](../../permissions.html) .
通过单击可在所有 Wiki 页面中找到的" **新页面"**按钮来创建新页面.
系统将要求您为新的 Wiki 页面填写标题.
您可以通过在标题中使用" /"指示子目录来为 Wiki 页面指定完整路径. 任何丢失的目录将自动创建. 例如, `docs/my-page`的标题将创建一个 Wiki 页面,其路径为`/wikis/docs/my-page` .
输入页面名称后,就该填写其内容了. GitLab Wiki 支持 Markdown,RDoc,AsciiDoc 和 Org. 对于基于 Markdown 的页面,所有[Markdown 功能](../../markdown.html)均受支持,对于链接,则存在一些[特定](../../markdown.html#wiki-specific-markdown)[Wiki 的](../../markdown.html#wiki-specific-markdown)行为.
在 Web 界面中,提交消息是可选的,但是 GitLab Wiki 是基于 Git 的,并且需要提交消息,因此如果您不输入消息,则会为您创建一条.
When you’re ready, click the **建立页面** and the new page will be created.
[![New page](img/0a61445809db70ca6bf85d986bf52223.png)](img/wiki_create_new_page.png)
### Attachment storage[](#attachment-storage "Permalink")
在 GitLab 11.3 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33475) .
从 GitLab 11.3 开始,通过 GitLab 界面上载到 Wiki 的任何文件都将存储在 Wiki Git 存储库中,如果您在本地克隆 Wiki 存储库,该文件将可用. GitLab 11.3 之前的所有上传文件都存储在 GitLab 本身中. 如果希望它们成为 Wiki 的 Git 存储库的一部分,则必须再次上传它们.
### Special characters in page titles[](#special-characters-in-page-titles "Permalink")
Wiki 页面作为文件存储在 Git 存储库中,因此某些字符具有特殊含义:
* 存储页面时,空格会转换为连字符.
* 显示页面时,连字符( `-` )转换回空格.
* 不能使用斜杠( `/` ),因为它们用作路径分隔符.
### Length restrictions for file and directory names[](#length-restrictions-for-file-and-directory-names "Permalink")
在 GitLab 12.8 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24364) .
许多常见的文件系统[的文件名和目录名限制为 255 个字节](https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits) ,尽管 Git 和 GitLab 都支持超出这些限制的路径,但是它们的存在使这些文件系统上的用户无法在本地检出 Wiki 存储库.
为了避免这种情况,通过 GitLab Web 界面和 API 编辑页面时会强制执行以下限制:
* 页面标题为 245 个字节(文件扩展名保留 10 个字节).
* 255 个字节的目录名称.
请注意:
* 非 ASCII 字符占用多个字节.
* 仍然可以通过 Git 在本地创建超出限制的文件和目录,但这可能会在其他人的计算机上中断.
## Editing a wiki page[](#editing-a-wiki-page "Permalink")
**注意:**需要开发者[权限](../../permissions.html) .
要编辑页面,只需单击" **编辑"**按钮. 从那里开始,您可以更改其内容. 完成后,单击" **保存更改"**以使更改生效.
### Adding a table of contents[](#adding-a-table-of-contents "Permalink")
要从 Wiki 页面中的标题生成目录,请使用`[[_TOC_]]`标签. 有关示例,请参阅[目录](../../markdown.html#table-of-contents) .
## Deleting a wiki page[](#deleting-a-wiki-page "Permalink")
**注意:**需要维护者[权限](../../permissions.html) .
仅在编辑页面时才能找到" **删除"**按钮. 单击它并确认您要删除页面.
## Moving a wiki page[](#moving-a-wiki-page "Permalink")
通过在[编辑](#editing-a-wiki-page)表单的 Wiki 页面标题中指定完整路径,可以将 Wiki 页面从一个目录移动到另一个目录.
[![Moving a page](img/7a0180479e056fe1c4aa11c3e8684906.png)](img/wiki_move_page_1.png)
[![After moving a page](img/70117ebf119dd375e0def463921cc363.png)](img/wiki_move_page_2.png)
为了将 Wiki 页面移动到根目录,必须在 Wiki 页面标题前加上斜杠( `/` )字符.
## Viewing a list of all created wiki pages[](#viewing-a-list-of-all-created-wiki-pages "Permalink")
每个 Wiki 都有一个侧边栏,从中可以找到所创建页面的简短列表. 该列表按字母顺序排列.
[![Wiki sidebar](img/03d3f984ea7608322b1fd6a7feba47c0.png)](img/wiki_sidebar.png)
如果页面很多,则不会在侧边栏中列出所有页面. 单击**查看所有页面****查看所有页面** .
## Viewing the history of a wiki page[](#viewing-the-history-of-a-wiki-page "Permalink")
Wiki 页面随时间的变化记录在 Wiki 的 Git 存储库中,您可以通过单击**Page history**按钮来查看它们.
从历史记录页面中,您可以看到页面的修订版(Git commit SHA),其作者,提交消息以及上次更新时间. 要查看页面的先前版本的外观,请在" **页面版本"**列中单击修订号.
[![Wiki page history](img/2fdc2024eee83764328fb015ffd4e392.png)](img/wiki_page_history.png)
### Viewing the changes between page versions[](#viewing-the-changes-between-page-versions "Permalink")
在 GitLab 13.2 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/15242) .
类似于版本化的差异文件视图,您可以看到在给定的 Wiki 页面版本中所做的更改:
1. 导航到您感兴趣的 Wiki 页面.
2. 单击**页面历史记录**以查看所有页面版本.
3. 单击" **更改"**列中的提交消息以获取您感兴趣的版本:
[![Wiki page changes](img/9cc2ca9eb5afc113cacfbc529374fe3b.png)](img/wiki_page_diffs_v13_2.png)
## Wiki activity records[](#wiki-activity-records "Permalink")
版本历史
* 在 GitLab 12.10 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/14902) .
* 它部署在功能标记后面,默认情况下处于禁用状态.
* 在 GitLab.com 上启用了它.
* 要在 GitLab 自管实例中使用它,请让 GitLab 管理员[启用它](#enable-or-disable-wiki-events-core-only) .
Wiki 事件(创建,删除和更新)由 GitLab 跟踪,并显示在[用户个人资料](../../profile/index.html#user-profile)[](../../group/index.html#view-group-activity)[项目](../index.html#project-activity)活动页面上.
### Limitations[](#limitations "Permalink")
只有在浏览器中或通过 API 进行的编辑才会记录其活动. 当前在活动列表中未列出通过 Git 进行和推送的编辑.
### Enable or disable Wiki Events[](#enable-or-disable-wiki-events-core-only "Permalink")
Wiki 事件活动正在开发中,尚未准备好用于生产. 它部署在**默认情况下禁用**的功能标志的后面. [有权访问 GitLab Rails 控制台的 GitLab 管理员](../../../administration/troubleshooting/navigating_gitlab_via_rails_console.html#starting-a-rails-console-session)可以为您的实例启用它. 欢迎您对其进行测试,但使用风险自负.
要启用它:
```
Feature.enable(:wiki_events)
```
禁用它:
```
Feature.disable(:wiki_events)
```
## Adding and editing wiki pages locally[](#adding-and-editing-wiki-pages-locally "Permalink")
由于 Wiki 基于 Git 存储库,因此您可以像在其他所有 Git 存储库中一样在本地克隆它们并进行编辑.
在右侧栏上,单击" **克隆存储库",**然后按照屏幕上的说明进行操作.
根据您要使用的标记语言,您在本地添加到 Wiki 的文件必须具有以下受支持的扩展名之一,否则当推送到 GitLab 时将不会显示这些文件:
* Markdown 扩展名: `.mdown``.mkd``.mkdn``.md``.markdown` .
* AsciiDoc 扩展名: `.adoc``.ad``.asciidoc` .
* 其他标记扩展名: `.textile``.rdoc``.org``.creole``.wiki``.mediawiki``.rst` .
## Customizing sidebar[](#customizing-sidebar "Permalink")
在项目的 Wiki 页面上,有一个右侧导航,默认情况下呈现带有层次结构的完整 Wiki 页面列表.
要自定义边栏,您可以创建一个名为`_sidebar`的文件以完全替换默认导航.
**警告:**除非您从自定义导航链接`_sidebar`文件,否则要进行编辑,必须输入以下内容直接从浏览器的地址栏中访问: `https://gitlab.com/<namespace>/<project_name>/-/wikis/_sidebar` : `_sidebar` /- `https://gitlab.com/<namespace>/<project_name>/-/wikis/_sidebar` (对于自我管理的 GitLab 实例,将`gitlab.com`替换为实例的 URL).
`_sidebar`示例(使用 Markdown 格式):
```
### [Home](home)
- [Hello World](hello)
- [Foo](foo)
- [Bar](bar)
---
- [Sidebar](_sidebar)
```
计划支持使用自定义侧面导航显示生成的目录.
\ No newline at end of file
# 通过URL导入[](#通过URL导入 "Permalink")
您可以通过提供 Git URL 来导入现有存储库:
1. 在您的 GitLab 仪表板中,单击" **新建项目".**
2. 切换到**导入项目**选项卡
3. 点击**按 URL 回购**按钮
4. 填写" Git 存储库 URL"和其余项目字段
5. 单击**创建项目**开始导入过程
6. 完成后,您将被重定向到新创建的项目
[![Import project by repo URL](img/731943edb4428a3eb27c86d8d454d0e0.png)](img/import_projects_from_repo_url.png)
\ No newline at end of file
# 与群组共享项目[](#与群组共享项目 "Permalink")
您可以与其他[小组](../../group/index.html)共享项目. 这样就可以通过一个操作将一组用户添加到项目中.
## Groups as collections of users[](#groups-as-collections-of-users "Permalink")
组主要用于[创建项目集合](../../group/index.html) ,但是您还可以利用以下事实:组定义了*用户*集合,即组成员.
## Sharing a project with a group of users[](#sharing-a-project-with-a-group-of-users "Permalink")
在 GitLab 中授予一组用户(例如"工程")访问项目(例如" Acme 项目")的主要机制是使"工程"组成为" Project Acme"的所有者. 但是,如果" Acme 项目"已经属于另一个小组,比如"开源",该怎么办? 这是可以使用组共享功能的地方.
与"工程"组共享" Acme 项目":
1. 对于" Acme 项目",请使用左侧导航菜单转到" **会员"**
[![share project with groups](img/0d1c10a8d14f11dd831b96878fc521e5.png)](img/share_project_with_groups.png)
2. 选择"与组共享"标签
3. 添加具有您选择的最大访问权限级别的"工程"组
4. 点击**共享**分享
[![share project with groups tab](img/0e2287fb4b32bf9dff45f3255ddd45fe.png)](img/share_project_with_groups_tab.png)
5. 与"工程"共享"项目 Acme"后,该项目将列在组仪表板上
[!['Project Acme' is listed as a shared project for 'Engineering'](img/000b14e609fee563642c55e238caca88.png)](img/other_group_sees_shared_project.png)
请注意,您只能与以下项目共享一个项目:
* 您具有明确定义的成员资格的组
* 包含嵌套子组或项目的组,您对其具有明确定义的角色
管理员可以与系统中的任何组共享项目.
## Maximum access level[](#maximum-access-level "Permalink")
在上面的示例中,"工程"成员的最大"开发人员"访问级别意味着"工程"中具有较高访问级别的用户("维护者"或"所有者")将仅对" Acme 项目"具有"开发者"访问权限'.
## Sharing public project with private group[](#sharing-public-project-with-private-group "Permalink")
与私有组共享公共项目时,项目的所有者和维护者将在`members`页面上看到该组的名称. 所有者还可以在问题或合并请求中提及他们时,可以看到他们无权访问的私人群组的成员.
## Share project with group lock[](#share-project-with-group-lock "Permalink")
可以防止一个组中[的项目与另一个组共享一个项目](../members/share_project_with_groups.html) . 这样可以更严格地控​​制项目访问.
了解更多有关[使用组锁共享的信息](../../group/index.html#share-with-group-lock) .
\ No newline at end of file
# 个人偏好[](#个人偏好 "Permalink")
用户的个人资料首选项页面允许用户自定义 GitLab 的各个方面.
要导航至个人资料的首选项,请执行以下操作:
1. 单击您的头像.
2. Select **Settings**.
3. 单击边栏中的**首选项** .
## Navigation theme[](#navigation-theme "Permalink")
GitLab 导航主题设置可让您个性化 GitLab 体验. 您可以从多个颜色主题中进行选择,这些主题可以为顶部导航和左侧导航添加独特的颜色. 使用单独的颜色主题可以帮助您区分不同的 GitLab 实例.
默认主题为 Indigo. 您可以选择 10 个主题:
* Indigo
* 浅靛蓝
* Blue
* 浅蓝
* Green
* 浅绿色
* Red
* 红灯
* Dark
* Light
[![Profile preferences navigation themes](img/c6c38f70c273cc4412f6d3bd29af3829.png)](img/profil-preferences-navigation-theme.png)
## Dark mode[](#dark-mode "Permalink")
[介绍](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28252)在 GitLab 13.1 作为一个 alpha 版本.
manbetx 客户端打不开已经开始在黑暗模式下工作! 深色[版本](https://about.gitlab.com/handbook/product/#alpha)[Alpha 版本](https://about.gitlab.com/handbook/product/#alpha)本着迭代的精神和[Alpha 版本](https://about.gitlab.com/handbook/product/#alpha)的较低期望提供.
[黑暗主题史诗中](https://gitlab.com/groups/gitlab-org/-/epics/2902)追踪了黑暗模式的进展. 见史诗:
* 已知问题列表.
* 我们计划的方向和下一步.
如果发现未列出的问题,请在史诗上发表评论或创建新的问题.
出于 MVC 和兼容性原因,暗模式可用作导航主题. 将来,我们计划使其在自己的部分中可配置,同时支持[不同的导航主题](https://gitlab.com/gitlab-org/gitlab/-/issues/219512) .
**注意:**深色主题当前仅适用于"深色"语法突出显示.
## Syntax highlighting theme[](#syntax-highlighting-theme "Permalink")
**注意:** GitLab 使用[rouge Ruby 库](http://rouge.jneen.net/ "胭脂网站")在任何 Editor 上下文之外突出显示语法. WebIDE(如代码片段)使用[Monaco Editor](https://microsoft.github.io/monaco-editor/) ,并提供了[Monarch](https://microsoft.github.io/monaco-editor/monarch.html)库以突出显示语法. 有关支持的语言的列表,请访问相应库的文档.
更改此设置可让您在 GitLab 上查看语法突出显示的代码时自定义颜色主题.
默认语法主题为"白色",您可以在 5 个不同的主题中进行选择:
* White
* Dark
* 日光灯
* 日光暗
* Monokai
[![Profile preferences syntax highlighting themes](img/bde796b0c195045db9849eef2842bd0e.png)](img/profile-preferences-syntax-themes.png)
您在 13.0 中[引入](https://gitlab.com/groups/gitlab-org/-/epics/2389)的主题也适用于[Web IDE](../project/web_ide/index.html)的代码编辑器和[Snippets](../snippets.html) . 主题仅在 Web IDE 文件编辑器中可用, [深色主题](https://gitlab.com/gitlab-org/gitlab/-/issues/209808)[日光化深色主题](https://gitlab.com/gitlab-org/gitlab/-/issues/219228)除外,它们适用于整个 Web IDE 屏幕.
## Behavior[](#behavior "Permalink")
以下设置可让您自定义 GitLab 布局的行为以及仪表板和项目登录页面的默认视图.
### Layout width[](#layout-width "Permalink")
可以根据喜好将 GitLab 设置为使用不同的宽度. 在固定(最大`1280px` )和流畅( `100%` )应用程序布局之间选择.
**注意:**虽然使用固定版式时`1280px`是标准最大宽度,但是某些页面仍根据内容使用 100%宽度.
### Default dashboard[](#default-dashboard "Permalink")
对于有权访问大量项目但仅能跟上少数项目的用户,默认"仪表板"页面上的活动量可能会很大. 更改此设置可让您重新定义默认的仪表板.
您可以在此处使用 8 个选项作为默认仪表板视图:
* 您的项目(默认)
* 已加星标的项目
* 您的项目活动
* 已加星标项目的活动
* 您的团体
* Your [Todos](../todos.html)
* 分配的问题
* 分配的合并请求
* 操作仪表板
### Group overview content[](#group-overview-content "Permalink")
网上**论坛概述内容**下拉菜单允许您选择网上论坛首页上显示的信息.
您可以选择 2 个选项:
* 详细信息(默认)
* [Security dashboard](../application_security/security_dashboard/index.html)
### Project overview content[](#project-overview-content "Permalink")
项目概述内容设置允许您选择想要在项目主页上看到的内容.
您可以选择 3 个选项:
* 文件和自述文件(默认)
* Readme
* Activity
### Tab width[](#tab-width "Permalink")
您可以在 GitLab 的各个部分设置标签字符的显示宽度,例如 blob,diff 和片段.
**注意:** GitLab 的某些部分不遵守此设置,包括 WebIDE,文件编辑器和 Markdown 编辑器.
## Localization[](#localization "Permalink")
### Language[](#language "Permalink")
从支持的语言列表中选择首选语言.
*此功能是实验性的,翻译尚未完成.*
### First day of the week[](#first-day-of-the-week "Permalink")
可以针对日历视图和日期选择器自定义一周的第一天.
您可以选择以下选项之一作为一周的第一天:
* Saturday
* Sunday
* Monday
如果选择**System Default** ,则将使用系统范围的默认设置.
## Integrations[](#integrations "Permalink")
使用第三方服务配置您的首选项,这些服务可增强您的 GitLab 体验.
### Sourcegraph[](#sourcegraph "Permalink")
**注意:**仅当 GitLab 管理员已启用 Sourcegraph 时,此设置才可见.
管理由 Sourcegraph 支持的集成代码智能功能的可用性. 查看[Sourcegraph 功能文档](../../integration/sourcegraph.html#enable-sourcegraph-in-user-preferences)以获取更多信息.
\ No newline at end of file
# 个人访问令牌[](#个人访问令牌 "Permalink")
版本历史
* 在 GitLab 8.8 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3749) .
* 在 GitLab 12.6 中添加了[有关令牌过期的通知](https://gitlab.com/gitlab-org/gitlab/-/issues/3649) .
*[GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6 中添加了[令牌生存期限制](https://gitlab.com/gitlab-org/gitlab/-/issues/3649) .
If you’re unable to use [OAuth2](../../api/oauth2.html), you can use a personal access token to authenticate with the [GitLab API](../../api/README.html#personalproject-access-tokens).
您还可以将个人访问令牌与 Git 一起使用,以通过 HTTP 或 SSH 进行身份验证. 启用[两因素身份验证(2FA)](../account/two_factor_authentication.html)时,需要个人访问令牌. 在这两种情况下,都可以使用令牌代替密码进行身份验证.
个人访问令牌在您定义的日期 UTC 午夜到期.
* GitLab 每天在世界标准时间 01:00 AM 进行检查,以识别将在 7 天内到期的个人访问令牌. 这些令牌的所有者通过电子邮件通知.
* 在 GitLab Ultimate 中,管理员可以[限制个人访问令牌的寿命](../admin_area/settings/account_and_limit_settings.html#limiting-lifetime-of-personal-access-tokens-ultimate-only) .
* 在 GitLab Ultimate 中,管理员可以[切换个人访问令牌到期的执行](../admin_area/settings/account_and_limit_settings.html#optional-enforcement-of-personal-access-token-expiry-ultimate-only) .
有关如何使用个人访问令牌向 API 进行身份验证的示例,请参见[API 文档中](../../api/README.html#personalproject-access-tokens)的以下部分.
GitLab 还提供了[模拟令牌](../../api/README.html#impersonation-tokens) ,这些[令牌](../../api/README.html#impersonation-tokens)是管理员通过 API 创建的. 它们非常适合作为特定用户的自动身份验证.
## Creating a personal access token[](#creating-a-personal-access-token "Permalink")
您可以在 GitLab 个人资料中创建任意数量的个人访问令牌.
1. 登录到 GitLab.
2. 点击右上角的头像,然后选择**设置** .
3. 在" **用户设置"**菜单上,选择" **访问令牌"** .
4. 选择令牌的名称和可选的到期日期.
5. 选择[所需的范围](#limiting-scopes-of-a-personal-access-token) .
6. 单击**创建个人访问令牌**按钮.
7. 将个人访问令牌保存在安全的地方. 离开或刷新页面后,将无法再次访问它.
### Revoking a personal access token[](#revoking-a-personal-access-token "Permalink")
您可以随时单击" **活动个人访问令牌"**区域下的相应" **撤消"**按钮来撤消任何个人访问令牌.
### Token activity[](#token-activity "Permalink")
您可以从" **个人访问令牌"**页面**查看**上次使用**令牌的时间** . 令牌使用情况的更新每 24 小时固定一次. 对[API 资源](../../api/api_resources.html)[GraphQL API 的](../../api/graphql/index.html)请求将更新令牌的用法.
## Limiting scopes of a personal access token[](#limiting-scopes-of-a-personal-access-token "Permalink")
可以使用一个或多个范围创建个人访问令牌,这些范围允许给定令牌可以执行各种操作. 下表描述了可用范围.
| Scope | 引入 | Description |
| --- | --- | --- |
| `read_user` | [GitLab 8.15](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5951) | 允许访问`/users`下的只读端点. 本质上,允许[用户 API](../../api/users.html)中的任何`GET`请求. |
| `api` | [GitLab 8.15](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5951) | 授予对 API 的完全读写访问权限,包括所有组和项目,容器注册表和程序包注册表. |
| `read_api` | [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28944) | 授予对 API 的读取权限,包括所有组和项目,容器注册表和程序包注册表. |
| `read_registry` | [GitLab 9.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/11845) | 如果项目是私有的并且需要授权,则允许读取(拉出) [容器注册表](../packages/container_registry/index.html)图像. |
| `sudo` | [GitLab 10.2](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14838) | 允许以系统中的任何用户身份执行 API 操作(如果经过身份验证的用户是管理员). |
| `read_repository` | [GitLab 10.7](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17894) | 允许通过`git clone`对存储库进行只读访问(拉). |
| `write_repository` | [GitLab 11.11](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26021) | 允许通过`git clone`对存储库进行读写访问(拉,推). 启用 2FA 时,通过 HTTP 访问 Git 存储库是必需的. |
## Programmatically creating a personal access token[](#programmatically-creating-a-personal-access-token "Permalink")
您可以以编程方式创建预定的个人访问令牌,以用于自动化或测试. 您将需要足够的访问权限才能为 GitLab 实例运行[Rails 控制台会话](../../administration/troubleshooting/debug.html#starting-a-rails-console-session) .
要使用用户名`automation-bot`创建属于用户的令牌,请在 Rails 控制台( `sudo gitlab-rails console` )中运行以下`sudo gitlab-rails console`
```
user = User.find_by_username('automation-bot')
token = user.personal_access_tokens.create(scopes: [:read_user, :read_repository], name: 'Automation token')
token.set_token('token-string-here123')
token.save!
```
使用[GitLab Rails Runner](../../administration/troubleshooting/debug.html#using-the-rails-runner)可以将其简化为单行 shell 命令:
```
sudo gitlab-rails runner "token = User.find_by_username('automation-bot').personal_access_tokens.create(scopes: [:read_user, :read_repository], name: 'Automation token'); token.set_token('token-string-here123'); token.save!"
```
**注意:**令牌字符串的长度必须为 20 个字符,否则将不会被识别为个人访问令牌.
有效范围的列表及其作用可以[在源代码中](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/auth.rb)找到.
## Programmatically revoking a personal access token[](#programmatically-revoking-a-personal-access-token "Permalink")
您可以通过编程方式撤消个人访问令牌. 您将需要足够的访问权限才能为 GitLab 实例运行[Rails 控制台会话](../../administration/troubleshooting/debug.html#starting-a-rails-console-session) .
要撤销已知令牌`token-string-here123` ,请在 Rails 控制台( `sudo gitlab-rails console` )中运行以下`sudo gitlab-rails console`
```
token = PersonalAccessToken.find_by_token('token-string-here123')
token.revoke!
```
可以使用[GitLab Rails Runner](../../administration/troubleshooting/debug.html#using-the-rails-runner)将其[简化](../../administration/troubleshooting/debug.html#using-the-rails-runner)为单行 shell 命令:
```
sudo gitlab-rails runner "PersonalAccessToken.find_by_token('token-string-here123').revoke!"
```
\ No newline at end of file
# 举报用户[](#举报用户 "Permalink")
您可以将其他 GitLab 用户的滥用情况报告给 GitLab 管理员.
然后,GitLab 管理员[可以选择](admin_area/abuse_reports.html)
* 删除用户,这会将其从实例中删除.
* 阻止用户,这将拒绝他们访问实例.
* 或删除报告,以保留用户对实例的访问权限.
您可以通过以下方式报告用户:
* [Profile](#reporting-abuse-through-a-users-profile)
* [Comments](#reporting-abuse-through-a-users-comment)
* [Issues and Merge requests](#reporting-abuse-through-a-users-issue-or-merge-request)
## Reporting abuse through a user’s profile[](#reporting-abuse-through-a-users-profile "Permalink")
要从用户的个人资料页面举报滥用行为,请执行以下操作:
1. 单击用户个人资料右上方的感叹号报告滥用按钮.
2. 完成滥用情况报告.
3. Click the **发送报告** button.
## Reporting abuse through a user’s comment[](#reporting-abuse-through-a-users-comment "Permalink")
要报告用户评论中的滥用行为,请执行以下操作:
1. 单击垂直省略号(⋮)其他操作按钮以打开下拉列表.
2. Select **举报为滥用**.
3. 完成滥用情况报告.
4. 点击**发送报告**按钮.
**注意:**在滥用情况报告的" **消息"**字段中,将预先填写报告用户评论的 URL.
## Reporting abuse through a user’s issue or merge request[](#reporting-abuse-through-a-users-issue-or-merge-request "Permalink")
**报告滥用**按钮显示在问题或合并请求的右上方:
* 对于单击有权关闭问题或合并请求的用户,从单击" **关闭问题"**或" **关闭合并请求"**按钮时出现的菜单中选择**"报告滥用**情况".
* 查看问题或合并请求时,对于没有权限关闭问题或合并请求的用户.
显示" **举报滥用行为"**按钮后,要提交滥用行为报告:
1. 点击**举报滥用行为**按钮.
2. 提交滥用情况报告.
3. 点击**发送报告**按钮.
**注意:**在滥用情况报告的" **消息"**字段中,将预先填写报告用户的问题或合并请求的 URL.
## Managing abuse reports[](#managing-abuse-reports "Permalink")
管理员能够查看和解决滥用报告. 有关更多信息,请参阅[滥用报告管理文档](admin_area/abuse_reports.html) .
\ No newline at end of file
# 代码仓库[](#代码仓库 "Permalink")
[存储库](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository)是用于将代码库存储在 GitLab 中并通过版本控制对其进行更改的存储库. 存储库是[项目的](../index.html)一部分,它具有许多其他功能.
## Create a repository[](#create-a-repository "Permalink")
要创建一个新的存储库,您需要做的就是[创建一个新项目](../../../gitlab-basics/create-project.html)[创建](../../../gitlab-basics/create-project.html) [一个现有项目](forking_workflow.html) .
创建新项目后,您可以通过 UI(请参阅以下部分)或通过命令行添加新文件. 要从命令行添加文件,请遵循创建新项目时在屏幕上显示的说明,或在[命令行基础](../../../gitlab-basics/start-using-git.html)文档中通读它们.
> **重要提示:**出于安全原因,强烈建议您在使用命令行时[通过 SSH 与 GitLab 连接](../../../ssh/README.html) .
## Files[](#files "Permalink")
使用存储库将文件存储在 GitLab 中. 在[GitLab 12.10 及更高版本中](https://gitlab.com/gitlab-org/gitlab/-/issues/33806) ,您将在存储库的文件树中根据其扩展名在文件名旁边看到一个图标:
[![Repository file icons](img/8489a6c45ad75964ea7b4b54b9d9fcaa.png)](img/file_ext_icons_repo_v12_10.png)
### Create and edit files[](#create-and-edit-files "Permalink")
通过将文件推送到 GitLab,将代码库托管在 GitLab 存储库中. 您可以使用用户界面(UI),也可以[通过命令行将](../../../gitlab-basics/command-line-commands.html#start-working-on-your-project)本地计算机与 GitLab 连接.
要配置[GitLab CI / CD](../../../ci/README.html)来构建,测试和部署代码,请在存储库的根目录中添加一个名为[`.gitlab-ci.yml`](../../../ci/quick_start/README.html)的文件.
**从用户界面:**
GitLab 的用户界面允许您执行许多 Git 命令,而无需触摸命令行. 即使您定期使用命令行,有时[通过 GitLab UI](web_editor.html)也更容易做到:
* [Create a file](web_editor.html#create-a-file)
* [Upload a file](web_editor.html#upload-a-file)
* [File templates](web_editor.html#template-dropdowns)
* [Create a directory](web_editor.html#create-a-directory)
* [Start a merge request](web_editor.html#tips)
* [Find file history](git_history.html)
* [Identify changes by line (Git blame)](git_blame.html)
**在命令行中:**
要开始使用命令行,请通读[命令行基础文档](../../../gitlab-basics/command-line-commands.html) .
### Find files[](#find-files "Permalink")
使用 GitLab 的[文件查找器](file_finder.html)在存储库中搜索文件.
### Supported markup languages and extensions[](#supported-markup-languages-and-extensions "Permalink")
GitLab 支持多种标记语言(有时称为[轻量标记语言](https://en.wikipedia.org/wiki/Lightweight_markup_language) ),您可以将其用于存储库中文件的内容. 它们主要用于文档目的.
只需为文件选择正确的扩展名,GitLab 就会根据标记语言来渲染它们.
| 标记语言 | Extensions |
| --- | --- |
| 纯文本 | `txt` |
| [Markdown](../../markdown.html) | `mdown`, `mkd`, `mkdn`, `md`, `markdown` |
| [reStructuredText](https://docutils.sourceforge.io/rst.html) | `rst` |
| [AsciiDoc](../../asciidoc.html) | `adoc`, `ad`, `asciidoc` |
| [Textile](https://textile-lang.com/) | `textile` |
| [rdoc](http://rdoc.sourceforge.net/doc/index.html) | `rdoc` |
| [Org mode](https://orgmode.org/) | `org` |
| [creole](http://www.wikicreole.org/) | `creole` |
| [MediaWiki](https://www.mediawiki.org/wiki/MediaWiki) | `wiki`, `mediawiki` |
### Repository README and index files[](#repository-readme-and-index-files "Permalink")
当存储库中存在`README``index`文件时,它的内容将由 GitLab 自动预渲染,而无需打开它.
它们可以是纯文本,也可以具有[受支持的标记语言](#supported-markup-languages-and-extensions)的扩展名:
有关优先级的一些注意事项:
1.`README`文件和`index`文件同时存在时, `README`文件将始终优先.
2. 如果存在多个具有不同扩展名的文件,则按字母顺序排列,但不带扩展名的文件例外,该扩展名始终优先. 例如, `README.adoc`将优先于`README.md` ,而`README.rst`将优先于`README` .
### Jupyter Notebook files[](#jupyter-notebook-files "Permalink")
[Jupyter](https://jupyter.org/) Notebook(以前的 IPython Notebook)文件用于许多领域的交互式计算,并且包含用户会话的完整记录,并包括代码,叙述性文本,方程式和丰富的输出.
[Read how to use Jupyter notebooks with GitLab.](jupyter_notebooks/index.html)
### OpenAPI viewer[](#openapi-viewer "Permalink")
在 GitLab 12.6 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/19515) .
如果文件名包含`openapi``swagger`且扩展名为`yaml``yml``json` ,则 GitLab 可以使用其文件查看器呈现 OpenAPI 规范文件. 以下示例都是正确的:
* `openapi.yml`
* `openapi.yaml`
* `openapi.json`
* `swagger.yml`
* `swagger.yaml`
* `swagger.json`
* `gitlab_swagger.yml`
* `openapi_gitlab.yml`
* `OpenAPI.YML`
* `openapi.Yaml`
* `openapi.JSON`
* `openapi.gitlab.yml`
* `gitlab.openapi.yml`
然后,渲染它们:
1. 在 GitLab 的用户界面中导航至存储库中的 OpenAPI 文件.
2. 单击位于"显示源"和"编辑"按钮之间的"显示 OpenAPI"按钮(找到 OpenAPI 文件后,它将替换"显示渲染的文件"按钮).
## Branches[](#branches "Permalink")
有关详细信息,请参见[分支](branches/index.html) .
## Commits[](#commits "Permalink")
[提交更改时](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository) ,您会将这些更改引入分支机构. 通过命令行,您可以在提交之前多次提交.
* **提交消息:**提交消息对于标识正在更改的内容以及更重要的原因至关重要. 在 GitLab 中,您可以将关键字添加到提交消息中,以执行以下操作之一:
* **触发 GitLab CI / CD 管道:**如果您的项目配置有[GitLab CI / CD](../../../ci/README.html) ,则将在每次推送而不是每次提交时触发一个管道.
* **跳过管道:**您可以在提交消息中添加关键字[`[ci skip]`](../../../ci/yaml/README.html#skip-pipeline) ,GitLab CI / CD 将跳过该管道.
* **交叉链接问题和合并请求:** [交叉链接](../issues/crosslinking_issues.html#from-commit-messages)非常适合跟踪工作流程中与之相关的内容. 如果您在提交消息中提到问题或合并请求,它们将显示在各自的线程上.
* **樱桃选择提交:**在 GitLab 中,您可以直接从 UI [樱桃选择提交](../merge_requests/cherry_pick_changes.html#cherry-picking-a-commit) .
* **还原提交:**轻松[将提交](../merge_requests/revert_changes.html#reverting-a-commit)从 UI [还原](../merge_requests/revert_changes.html#reverting-a-commit)到所选分支.
* **签署提交:**使用 GPG [签署您的提交](gpg_signed_commits/index.html) .
## Project and repository size[](#project-and-repository-size "Permalink")
在项目的" **详细信息"**页面上报告项目的大小. 报告的大小最多每 15 分钟更新一次,因此可能无法反映最近的活动. 显示的文件大小包括存储库文件,工件和 LFS.
由于压缩,内务处理和其他因素,每个项目的项目规模可能会略有不同.
[储存库大小限制](../../admin_area/settings/account_and_limit_settings.html)可以由管理员设置. GitLab.com 的存储库大小限制[由 GitLab 设置](../../gitlab_com/index.html#repository-size-limit) .
## Contributors[](#contributors "Permalink")
代码库的所有贡献者都显示在项目的**设置>贡献者下** .
它们是从协作者中以最少的提交次数排序的,并显示在一个漂亮的图形上:
[![contributors to code](img/d69ab181c07176aa054b0ceac08b702c.png)](img/contributors_graph.png)
## Repository graph[](#repository-graph "Permalink")
存储库图形以可视方式显示存储网络的历史记录,包括分支和合并. 这可以帮助您可视化存储库中使用的 Git 流策略:
[![repository Git flow](img/a1efb7c23a97e2901852465c9168914f.png)](img/repo_graph.png)
在您项目的**Repository> Graph**下找到它.
## Repository Languages[](#repository-languages "Permalink")
对于每个存储库的默认分支,GitLab 将确定使用了哪种编程语言,并将其显示在项目页面上. 如果缺少此信息,将在更新项目上的默认分支后添加. 此过程最多可能需要 5 分钟.
[![Repository Languages bar](img/e2e835cd5cd1be1afaa876fde2475fe5.png)](img/repository_languages_v12_2.gif)
Not all files are detected, among others; documentation, vendored code, and most markup languages are excluded. This behavior can be adjusted by overriding the default. For example, to enable `.proto` files to be detected, add the following to `.gitattributes` in the root of your repository.
```
*.proto linguist-detectable=true
```
## Locked files[](#locked-files-premium "Permalink")
使用[文件锁定](../file_lock.html)来锁定文件,以防止发生任何冲突的更改.
## Repository’s API[](#repositorys-api "Permalink")
您可以通过[存储库 API](../../../api/repositories.html)访问您的[存储库](../../../api/repositories.html) .
## Clone in Apple Xcode[](#clone-in-apple-xcode "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45820) in GitLab 11.0
现在,可以使用位于用于克隆项目的 Git URL 旁边的新的" **在 Xcode 中打开"**按钮**在 Xcode 中**克隆包含`.xcodeproj``.xcworkspace`目录的项目. 该按钮仅在 macOS 上显示.
## Download Source Code[](#download-source-code "Permalink")
在 GitLab 11.11 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/24704)了对目录下载的支持.
可以从 UI 下载存储在存储库中的源代码. 单击下载图标,将打开一个下拉列表,其中包含下载以下内容的链接:
[![Download source code](img/0f88b0e1a49600472f2922218cec1ed7.png)](img/download_source_code.png)
* **源代码:**允许用户在他们当前正在查看的分支上下载源代码. 可用扩展名: `zip``tar``tar.gz``tar.bz2` .
* **目录:**仅在查看子目录时显示. 这使用户可以下载他们当前正在查看的特定目录. 也可以在`zip``tar``tar.gz``tar.bz2` .
* **工件:**允许用户下载最新 CI 构建的工件.
\ No newline at end of file
# 保护Tag[](#保护Tag "Permalink")
在 GitLab 9.1 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10356) .
受保护的标签可控制谁有权创建标签,并防止创建后意外更新或删除. 每个规则都允许您匹配单个标签名称,或使用通配符一次控制多个标签.
此功能从[受保护的分支](protected_branches.html)演变而来
## Overview[](#overview "Permalink")
受保护的标签将阻止任何人更新或删除标签,并且将根据您选择的权限阻止创建匹配的标签. 默认情况下,任何未经维护者许可的人都将无法创建标签.
## Configuring protected tags[](#configuring-protected-tags "Permalink")
为了保护标签,您需要至少具有维护者权限级别.
1. 导航到项目的**"设置">"存储库"**
[![Repository Settings](img/bec396562e8fe025cb7009de091ff2aa.png)](img/project_repository_settings.png)
2.**标签**下拉菜单中,选择要保护或输入的标签,然后点击**创建通配符** . 在下面的屏幕截图中,我们选择保护所有与`v*`匹配的标签:
[![Protected tags page](img/8ab62c2dee9f26abae9b7f794b4f5fae.png)](img/protected_tags_page_v12_3.png)
3. 从" **允许创建"**下拉列表中,选择谁有权创建匹配的标签,然后单击" **保护"**
[![Allowed to create tags dropdown](img/52fecb33c2f168630e9a8f7c95aaf517.png)](img/protected_tags_permissions_dropdown_v12_3.png)
4. 完成后,受保护的标签将显示在" **受保护的标签"**列表中:
[![Protected tags list](img/572645049ee5ab43733f62fc45312843.png)](img/protected_tags_list_v12_3.png)
## Wildcard protected tags[](#wildcard-protected-tags "Permalink")
您可以指定一个通配符保护的标记,它将保护所有与通配符匹配的标记. 例如:
| 通配符保护标签 | 匹配标签 |
| --- | --- |
| `v*` | `v1.0.0`, `version-9.1` |
| `*-deploy` | `march-deploy`, `1.0-deploy` |
| `*gitlab*` | `gitlab`, `gitlab/v1` |
| `*` | `v1.0.1rc2`, `accidental-tag` |
两个不同的通配符可以潜在地匹配同一标签. 例如, `*-stable` `production-stable``production-*`都将与`production-stable`标签匹配. 在这种情况下,如果*这些*受保护的标签都像**允许创建**一个设定,然后`production-stable`也将沿用此设置.
如果单击受保护标签的名称,将显示所有匹配标签的列表:
[![Protected tag matches](img/cc52a99e48b72695add0c3e8efab158f.png)](img/protected_tag_matches.png)
\ No newline at end of file
# 保护分支[](#保护分支 "Permalink")
GitLab 中的[权限](../permissions.html)基本上是围绕对存储库和分支具有读或写权限的想法定义的. 为了对某些分支机构施加进一步的限制,可以对其进行保护.
## Overview[](#overview "Permalink")
默认情况下,受保护的分支执行以下四个简单的操作:
* 它会阻止除具有维护者权限的用户之外的所有用户创建它(如果尚未创建).
* 它可以防止除具有**允许的**权限的用户以外的其他任何人推送.
* 它可以防止**任何人**用力推动分支机构.
* 它可以防止**任何人**删除分支.
**注意:**允许 GitLab 管理员推送到受保护的分支.
有关随时间的变化,请参见" [更改日志"](#changelog)部分.
默认的分支保护级别在[管理区域中](../admin_area/settings/visibility_and_access_controls.html#default-branch-protection)设置.
## Configuring protected branches[](#configuring-protected-branches "Permalink")
要保护分支,您需要至少具有维护者权限级别. 请注意,默认情况下`master`分支是受保护的.
1. 导航到项目的**"设置"➔"存储库"**
2. 滚动查找" **受保护的分支"**部分.
3. 从" **分支"**下拉菜单中,选择要保护的分支,然后单击" **保护"** . 在下面的屏幕截图中,我们选择了`develop`分支.
[![Protected branches page](img/c29b503c10922622f8ec612bd5168b10.png)](img/protected_branches_page_v12_3.png)
4. 完成后,受保护的分支将出现在"受保护的分支"列表中.
[![Protected branches list](img/265f035427185c0998b05886114d104b.png)](img/protected_branches_list_v12_3.png)
## Using the Allowed to merge and Allowed to push settings[](#using-the-allowed-to-merge-and-allowed-to-push-settings "Permalink")
在 GitLab 8.11 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5081) .
从 GitLab 8.11 开始,我们增加了分支保护的另一层,它提供了对受保护分支的更精细的管理. "开发人员可以推送"选项由"允许推送"设置代替,该设置可以设置为允许/禁止维护者和/或开发人员推送到受保护的分支.
使用"允许推送"和"允许合并"设置,您可以控制不同角色可以在受保护分支中执行的操作. 例如,您可以将"允许推送"设置为"无人",将"允许合并"设置为"开发人员+维护人员",以要求*每个人都*提交合并请求,以请求更改进入受保护分支. 这与[GitLab 工作](../../topics/gitlab_flow.html)流程等[工作流程](../../topics/gitlab_flow.html)兼容.
但是,有些工作流程不需要这样做,只有防止强行推动和移除分支才有用. 对于这些工作流程,您可以通过将"允许推送"设置为"开发人员+维护人员"来允许具有写访问权的每个人推送到受保护的分支.
您可以在创建受保护的分支时设置"允许推送"和"允许合并"选项,也可以在之后通过从"已保护"区域的下拉列表中选择所需的选项来设置.
[![Developers can push](img/eca0c9ec85c6dfc8dbde06c368a9d94d.png)](img/protected_branches_devs_can_push_v12_3.png)
如果在创建受保护的分支时未选择任何这些选项,则默认情况下会将它们设置为"维护者".
## Restricting push and merge access to certain users[](#restricting-push-and-merge-access-to-certain-users-starter "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5081) in [GitLab Starter](https://about.gitlab.com/pricing/) 8.11.
使用 GitLab 企业版,您可以通过选择角色(维护者,开发者)以及某些用户来限制对受保护分支的访问. 从下拉菜单中选择您要合并或推送访问的角色和/或用户.
[![Select roles and users](img/8fc9989164e038f62ee1015c2f477d84.png)](img/protected_branches_select_roles_and_users.png)
单击" **保护"** ,该分支将出现在"受保护的分支"列表中.
[![Roles and users list](img/0387751ed4b8717777ebac2706c2d637.png)](img/protected_branches_select_roles_and_users_list.png)
## Wildcard protected branches[](#wildcard-protected-branches "Permalink")
在 GitLab 8.10 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/4665) .
您可以指定一个通配符保护的分支,该分支将保护所有与通配符匹配的分支. 例如:
| 通配符保护的分支 | 匹配分支 |
| --- | --- |
| `*-stable` | `production-stable`, `staging-stable` |
| `production/*` | `production/app-server`, `production/load-balancer` |
| `*gitlab*` | `gitlab`, `gitlab/staging`, `master/gitlab/production` |
受保护的分支设置(如"开发人员可以推送")适用于所有匹配的分支.
两个不同的通配符可能会匹配同一分支. 例如, `*-stable` `production-stable``production-*`都将与`production-stable`分支匹配. 在这种情况下,如果*这些*受保护的分支有这样一个设定"允许推送",然后`production-stable`也将继承这一设置.
如果单击受保护分支的名称,将显示所有匹配分支的列表:
[![Protected branch matches](img/09870a42c6e3e94e7553f338a65c0b6d.png)](img/protected_branches_matches.png)
## Creating a protected branch[](#creating-a-protected-branch "Permalink")
在 GitLab 11.9 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53361) .
当受保护的分支或通配符受保护的分支设置为" [**不允许任何人** **推送"时**](#using-the-allowed-to-merge-and-allowed-to-push-settings) ,只要允许开发人员(和具有较高[权限级别的](../permissions.html)用户) [**合并**](#using-the-allowed-to-merge-and-allowed-to-push-settings) ,就可以创建新的受保护分支. 这只能通过 UI 或 API 来完成(为避免意外地从命令行或 Git 客户端应用程序创建受保护的分支).
通过用户界面创建新分支:
1. Visit **资料库>分支机构**.
2. Click on **新分支**.
3. 填写分支名称,然后选择一个现有的分支,标记或确认新分支将基于该分支. 仅接受现有的受保护分支和已经在受保护分支中的提交.
## Deleting a protected branch[](#deleting-a-protected-branch "Permalink")
在 GitLab 9.3 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/21393) .
有时可能需要删除或清理受保护的分支.
具有[维护者权限](../permissions.html)并具有[维护者权限的](../permissions.html)用户可以通过 GitLab 的 Web 界面手动删除受保护的分支:
1. Visit **资料库>分支机构**
2. 单击您要删除的分支旁边的删除图标
3. 为了防止意外删除,需要额外的确认
[![Delete protected branches](img/4e86bb665dcf8b8997d807441dbd60cd.png)](img/protected_branches_delete.png)
只能通过 Web 界面而不是 Git 删除受保护的分支. 这意味着您不能从命令行或 Git 客户端应用程序中意外删除受保护的分支.
## Protected Branches approval by Code Owners[](#protected-branches-approval-by-code-owners-premium "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13251) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.4.
对于合并请求更改的文件,可能需要[代码所有者的](code_owners.html)至少一项批准. 可以在保护新分支时设置"代码所有者"批准,也可以将其设置为已经受保护的分支,如下所述.
要保护新分支并获得代码所有者的批准:
1. 导航到项目的**"设置">"存储库",**然后展开" **受保护的分支"** .
2. 向下滚动到**保护一个分支** ,选择**分支**或通配符你想保护,选择谁的**允许合并** **,****允许推** ,以及切换**需要从代码的业主**滑块**批准** .
3. Click **Protect**.
[![Code Owners approval - new protected branch](img/9a996b513114d1fe39fa67c75e54df46.png)](img/code_owners_approval_new_protected_branch_v12_4.png)
要使代码所有者批准已受保护的分支机构,请执行以下操作:
1. 导航到项目的**"设置">"存储库",**然后展开" **受保护的分支"** .
2. 向下滚动到" **受保护"分支,**然后切换所选分支的**"代码所有者"批准**滑块.
[![Code Owners approval - branch already protected](img/7a4195dce33a791e39b721499e4137ad.png)](img/code_owners_approval_protected_branch_v12_4.png)
启用后,所有针对这些分支的合并请求都将需要代码所有者根据匹配的规则进行批准,然后才能合并. 此外,如果匹配规则,则拒绝直接推送到受保护的分支.
## Running pipelines on protected branches[](#running-pipelines-on-protected-branches "Permalink")
合并或推送到受保护分支的权限用于定义用户是否可以运行 CI / CD 管道并在与那些分支相关的作业上执行操作.
有关管道安全模型的详细信息,请参阅[受保护分支上](../../ci/pipelines/index.html#pipeline-security-on-protected-branches)的安全性.
## Changelog[](#changelog "Permalink")
**11.9**
* [允许](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53361)开发人员(和具有更高权限级别的用户)通过 API 和用户界面[创建受保护的分支](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53361) .
**9.2**
* 允许通过 Web 界面删除受保护的分支( [问题#21393](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/21393) ).
**8.11**
* 允许创建无法推送到的受保护分支( [合并请求!5081](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5081) ).
**8.10**
* 允许没有推送访问权限的开发人员合并到受保护的分支中( [合并请求!4892](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/4892) ).
* 允许使用通配符指定受保护的分支( [合并请求!4665](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/4665) ).
\ No newline at end of file
# 允许Fork项目协助提交合并请求[](#允许Fork项目协助提交合并请求 "Permalink")
在 GitLab 10.6 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17395) .
当用户从派生打开合并请求时,将为他们提供允许上游成员在源分支上与其进行协作的选项. 这使上游项目的成员可以在合并之前进行小规模修复或重新分支,从而减少了接受外部贡献的来回过程.
此功能可用于可公开访问的分支项目之间的合并请求.
为合并请求启用后,对项目目标分支具有合并访问权限的成员将被授予对合并请求的源分支的写权限.
## Enabling commit edits from upstream members[](#enabling-commit-edits-from-upstream-members "Permalink")
只有具有对源项目的推送访问权限的用户才能启用该功能,并且只有在合并请求打开时才能持续使用. 启用后,上游成员也将能够重试合并请求的管道和作业:
1. 在创建或编辑合并请求时启用贡献.
[![Enable contribution](img/3794ce06aeeb9528fa1a66915cc69072.png)](img/allow_collaboration.png)
2. 创建合并请求后,您将看到允许可以合并到目标分支的成员的提交.
[![Check that contribution is enabled](img/381cb6fd4ceed7b2a8b3642926cb8cf2.png)](img/allow_collaboration_after_save.png)
## Pushing to the fork as the upstream member[](#pushing-to-the-fork-as-the-upstream-member "Permalink")
如果合并请求的创建者启用了上游成员的贡献,则可以直接推送到派生存储库的分支.
假如说:
* 分叉的项目 URL 为`git@gitlab.com:thedude/awesome-project.git` .
* 合并请求的分支是`update-docs` .
流程如下所示:
1. 首先,您需要获取合并请求已引入的更改. 单击" **签出"分支**按钮,其中包含可以运行的一些预填充命令.
[![Check out branch button](img/e9dbc908a405f57008dbb80d1b8a9a70.png)](img/checkout_button.png)
2. 使用复制按钮复制第一个命令并将其粘贴到您的终端中:
```
git fetch git@gitlab.com:thedude/awesome-project.git update-docs
git checkout -b thedude-awesome-project-update-docs FETCH_HEAD
```
这将获取派生项目的分支,然后基于所获取的分支创建本地分支.
3. Make any changes you want and commit.
4. 推送到分叉的项目:
```
git push git@gitlab.com:thedude/awesome-project.git thedude-awesome-project-update-docs:update-docs
```
注意冒号( `:`两个分支之间). 上面的命令会将本地分支`thedude-awesome-project-update-docs` `git@gitlab.com:thedude/awesome-project.git`存储库的`update-docs`分支.
\ No newline at end of file
# 新建项目[](#create-a-project "Permalink")
GitLab 中的大多数工作都在一个[Project 中](../user/project/index.html)完成. 文件和代码保存在项目中,并且大多数功能都在项目范围内使用.
## Create a project in GitLab[](#create-a-project-in-gitlab "Permalink")
要在 GitLab 中创建项目:
1. 在信息中心中,点击绿色的**新建项目**按钮或使用导航栏中的加号图标. 这将打开" **新项目"**页面.
2. 在" **新建项目"**页面上,选择是否要:
* 创建一个[空白项目](#blank-projects) .
* 使用可用的[项目模板](#project-templates)之一创建一个项目.
* 如果已在您的 GitLab 实例上启用,则从其他存储库[导入项目](../user/project/import/index.html) . 如果不可用,请与您的 GitLab 管理员联系.
* 运行[用于外部存储库的 CI / CD 管道](../ci/ci_cd_for_external_repos/index.html) .
**注意:**有关不能用作项目名称的单词列表,请参见[保留的项目和组名称](../user/reserved_names.html) .
### Blank projects[](#blank-projects "Permalink")
要在" **新建项目"**页面上创建一个新的空白项目,请执行以下操作:
1. 在" **空白项目"**选项卡上,提供以下信息:
* **项目名称****项目名称**字段中. 您不能使用特殊字符,但可以使用空格,连字符,下划线甚至表情符号. 添加名称时, **Project slug**将自动填充. slug 是 GitLab 实例将用作项目的 URL 路径的东西. 如果您要使用其他子弹,请先输入项目名称,然后再更改子弹.
* **Project slug**字段中项目的路径. 这是 GitLab 实例将使用的项目的 URL 路径. 如果**项目名称**为空白,则当您填写**项目 slug**时,它将自动填充.
* 使用" **项目描述"(可选)**字段,您可以为项目的仪表板输入描述,这将帮助其他人了解您的项目的含义. 尽管不是必需的,但这是个好主意.
* 更改" **可见性级别"**会修改用户的项目[查看和访问权限](../public_access/public_access.html) .
* 选择**使用 README 初始化存储库**选项将创建一个 README 文件,以便 Git 存储库被初始化,具有默认分支并可以被克隆.
2. Click **建立专案**.
### Project templates[](#project-templates "Permalink")
项目模板可以使用必要的文件预填充新项目,以使您快速入门.
有两种类型的项目模板:
* [内置模板](#built-in-templates) ,来自以下组:
* [`project-templates`](https://gitlab.com/gitlab-org/project-templates)
* [`pages`](https://gitlab.com/pages)
* [自定义项目模板](#custom-project-templates-premium) ,用于由 GitLab 管理员和用户配置的自定义模板.
#### Built-in templates[](#built-in-templates "Permalink")
内置模板是项目模板,它们是:
*[`project-templates`](https://gitlab.com/gitlab-org/project-templates)[`pages`](https://gitlab.com/pages)组中开发和维护.
* 与 GitLab 一起发布.
要在" **新建项目"**页面上使用内置模板,请执行以下操作:
1. 在" **从模板创建"**选项卡上,选择" **内置"**选项卡.
2. 从可用的内置模板列表中,单击:
* **预览**按钮以查看模板源本身.
* **使用模板**按钮开始创建项目.
3. 通过填写项目的详细信息来完成创建项目. 该过程与创建[空白项目](#blank-projects)相同.
##### Enterprise templates[](#enterprise-templates-ultimate "Permalink")
GitLab 正在开发企业模板,以帮助您根据选定的法规标准简化审核管理. 这些模板会自动导入与每个法规要求相对应的问题.
要使用企业模板创建新项目,请在" **新建项目"**页面上:
1. 在" **从模板创建"**选项卡上,选择" **内置"**选项卡.
2. 从可用的内置企业模板列表中,单击:
* **预览**按钮以查看模板源本身.
* **使用模板**按钮开始创建项目.
3. 通过填写项目的详细信息来完成创建项目. 该过程与创建[空白项目](#blank-projects)相同.
可用的企业模板包括:
* HIPAA 审核协议模板(在 GitLab 12.10 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/13756)
**提示:**您可以按照[以下步骤](https://gitlab.com/gitlab-org/project-templates/contributing)改进现有的内置模板或在[`project-templates`](https://gitlab.com/gitlab-org/project-templates)[`pages`](https://gitlab.com/pages)组中添加新的[`project-templates`](https://gitlab.com/gitlab-org/project-templates) .
#### Custom project templates[](#custom-project-templates-premium "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.2.
Creating new projects based on custom project templates is a convenient option for quickly starting projects.
自定义项目可以在[实例级别](../user/admin_area/custom_project_templates.html)**实例**选项卡,或在[组级别](../user/group/custom_project_templates.html)**组**选项卡,在**从模板**标签上的**创建** .
要在" **新建项目"**页面上使用自定义项目模板:
1. 在" **从模板创建"**选项卡上,选择" **实例"**选项卡或" **组"**选项卡.
2. 从可用的自定义模板列表中,单击:
* **预览**按钮以查看模板源本身.
* **使用模板**按钮开始创建项目.
3. 通过填写项目的详细信息来完成创建项目. 该过程与创建[空白项目](#blank-projects)相同.
## Push to create a new project[](#push-to-create-a-new-project "Permalink")
在 GitLab 10.5 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26388) .
当您在本地创建新的存储库时,无需直接在 GitLab 上手动创建一个新项目然后[](start-using-git.html#clone-a-repository)本地[克隆该](start-using-git.html#clone-a-repository)存储库,而无需将其直接发送到 GitLab 即可创建新项目. 如果您具有关联的名称空间的访问权,则 GitLab 将在该 GitLab 名称空间下自动创建一个新项目,其可见性默认设置为 Private(您以后可以在[项目的设置中](../public_access/public_access.html#how-to-change-project-visibility)对其进行更改).
这可以通过使用 SSH 或 HTTPS 来完成:
```
## Git push using SSH
git push --set-upstream git@gitlab.example.com:namespace/nonexistent-project.git master
## Git push using HTTPS
git push --set-upstream https://gitlab.example.com/namespace/nonexistent-project.git master
```
推送成功完成后,将显示一条远程消息,指示将遥控器和 URL 设置为新项目的命令:
```
remote:
remote: The private project namespace/nonexistent-project was created.
remote:
remote: To configure the remote, run:
remote: git remote add origin https://gitlab.example.com/namespace/nonexistent-project.git
remote:
remote: To view the project, visit:
remote: https://gitlab.example.com/namespace/nonexistent-project
remote:
```
\ No newline at end of file
# 关联Issue[](#关联issue "Permalink")
请通读[GitLab 问题文档](index.html)以获取有关 GitLab 问题的概述.
## From Commit Messages[](#from-commit-messages "Permalink")
每次在提交消息中提及问题时,您都在开发工作流的两个阶段之间建立一种关系:问题本身以及与该问题相关的第一次提交.
如果问题和您要提交的代码都在同一项目中,则只需在提交消息中添加`#xxx` ,其中`xxx`是问题编号. 如果它们不在同一项目中,则可以将完整的 URL 添加到问题中( `https://gitlab.com/<username>/<projectname>/issues/<xxx>` ).
```
git commit -m "this is my commit message. Ref #xxx"
```
or
```
git commit -m "this is my commit message. Related to https://gitlab.com/<username>/<projectname>/issues/<xxx>"
```
当然,您可以使用自己的 GitLab 实例的 URL 替换`gitlab.com` .
**注意:**将您的第一次提交与您的问题相关联,对于通过[GitLab Cycle Analytics](https://about.gitlab.com/stages-devops-lifecycle/value-stream-analytics/)跟踪您的过程将非常重要. 它将测量计划该问题的实施所花费的时间,即从创建问题到进行第一次提交之间的时间.
## From Related Issues[](#from-related-issues "Permalink")
在合并请求中提及相关问题以及其他问题对于您的团队成员和协作者了解有关同一主题的未解决问题很有用.
如上所述,当您[从提交消息中提到问题](#from-commit-messages)时,您可以执行此操作.
当在问题`#222`提到问题`#111`时,问题`#111`还将在其跟踪器中显示一条通知. 也就是说,您只需提及一次关系即可在两个问题中均显示该关系. 在[合并请求中](#from-merge-requests)提及问题时,也是如此.
[![issue mentioned in issue](img/b962444c71ad27ba05dfc6bfc69269f4.png)](img/mention_in_issue.png)
## From Merge Requests[](#from-merge-requests "Permalink")
Mentioning issues in merge request comments works exactly the same way as they do for [related issues](#from-related-issues).
当您在合并请求说明中提到问题时,它将仅[将问题和合并请求链接在一起](#from-related-issues) . 此外,您还可以[将问题设置](managing_issues.html#closing-issues-automatically)为在合并请求合并后立即[自动关闭](managing_issues.html#closing-issues-automatically) .
[![issue mentioned in MR](img/f36631c8d1fd9cb42fb7c58a495c24be.png)](img/mention_in_merge_request.png)
\ No newline at end of file
# 减少仓库大小[](#减少仓库大小 "Permalink")
随着时间的流逝,Git 存储库变得越来越大. 将大文件加到 Git 存储库后:
* 由于每个人都必须下载文件,因此获取存储库的速度变慢.
* 它们占用服务器上的大量存储空间.
* [可以达到](#storage-limits) Git 仓库的存储限制.
重写存储库可能会删除不需要的历史记录,从而使存储库更小. [`git filter-repo`](https://github.com/newren/git-filter-repo)是用于快速重写 Git 存储库历史记录的工具,建议同时使用以下两种工具:
* [`git filter-branch`](https://git-scm.com/docs/git-filter-branch).
* [BFG](https://rtyley.github.io/bfg-repo-cleaner/).
**危险:**重写存储库历史记录是一种破坏性操作. 在开始之前,请确保备份您的存储库. 备份存储库的最佳方法是[导出项目](../settings/import_export.html#exporting-a-project-and-its-data) .**注意:** Git LFS 文件只能由管理员使用[Rake 任务](../../../raketasks/cleanup.html)删除. [计划](https://gitlab.com/gitlab-org/gitlab/-/issues/223621)消除此限制.
## Purge files from repository history[](#purge-files-from-repository-history "Permalink")
为了使克隆项目更快,请重写分支和标签以删除不需要的文件.
1. 使用受支持的程序包管理器或从源代码[安装`git filter-repo`](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md) .
2. 使用`--bare`克隆存储库的新副本:
```
git clone --bare https://example.gitlab.com/my/project.git
```
3. 使用`git filter-repo` ,从存储库的历史记录中清除所有文件.
要清除大文件,可以使用`--strip-blobs-bigger-than`选项:
```
git filter-repo --strip-blobs-bigger-than 10M
```
要清除使用 Git LFS 存储的大文件,可以使用`--blob--callback`选项. 下面的示例使用回调从 Git LFS 指针读取文件大小,并删除大于 10MB 的文件.
```
git filter-repo --blob-callback '
if blob.data.startswith(b"version https://git-lfs.github.com/spec/v1"):
size_in_bytes = int.from_bytes(blob.data[124:], byteorder="big")
if size_in_bytes > 10*1000:
blob.skip()
'
```
要按路径清除特定的大文件,可以组合使用`--path`和`--invert-paths`选项:
```
git filter-repo --path path/to/big/file.m4v --invert-paths
```
有关更多示例和完整文档,请参见[`git filter-repo`](https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES)文档.
4. 运行`git filter-repo`会删除所有遥控器. 要为您的项目还原遥控器,请运行:
```
git remote add origin https://example.gitlab.com/<namespace>/<project_name>.git
```
5. 强制推送更改以覆盖 GitLab 上的所有分支:
```
git push origin --force --all
```
[受保护的分支](../protected_branches.html)将导致此操作失败. 要继续,您必须删除分支保护,推送,然后重新启用受保护的分支.
6. 要从标记的发行版中删除大文件,请强制将更改推送到 GitLab 上的所有标记:
```
git push origin --force --tags
```
[受保护的标签](../protected_tags.html)将导致此操作失败. 要继续,您必须删除标签保护,推送,然后重新启用受保护的标签.
7. 手动执行[项目整理](../../../administration/housekeeping.html#manual-housekeeping)
**注意:**为提高性能而缓存了项目统计信息. 您可能需要等待 5 到 10 分钟才能看到存储利用率下降.
## Purge files from GitLab storage[](#purge-files-from-gitlab-storage "Permalink")
要减少 GitLab 中存储库的大小,必须删除 GitLab 内部引用以包含大文件的提交. 在完成这些步骤之前,请[从存储库历史记录中清除文件](#purge-files-from-repository-history) .
除了[分支](branches/index.html)和标签(这是一种 Git 引用)之外,GitLab 还会自动创建其他引用. 这些引用可防止在查看合并请求时死链接到提交或丢失差异. [存储库清理](#repository-cleanup)可用于从 GitLab 中删除它们.
以下内部参考文献不做广告:
* `refs/merge-requests/*`用于合并请求.
* `refs/pipelines/*` for [pipelines](../../../ci/pipelines/index.html#troubleshooting-fatal-reference-is-not-a-tree).
* `refs/environments/*`用于环境.
这意味着在获取时通常不包含它们,这使得获取速度更快. 另外, `refs/keep-around/*`是隐藏的 refs,以防止与讨论相关的提交被删除并且根本无法被获取.
但是,可以从项目导出内的 Git 捆绑包访问这些引用.
1. 使用受支持的程序包管理器或从源代码[安装`git filter-repo`](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md) .
2. [从项目中](../settings/import_export.html#exporting-a-project-and-its-data)生成一个新的[导出](../settings/import_export.html#exporting-a-project-and-its-data)并下载.
3. 使用`tar`解压缩备份:
```
tar xzf project-backup.tar.gz
```
这将包含一个由[`git bundle`](https://git-scm.com/docs/git-bundle)创建的`project.bundle`文件.
4. 从包中克隆存储库的新副本:
```
git clone --bare --mirror /path/to/project.bundle
```
5. 使用`git filter-repo` ,从存储库的历史记录中清除所有文件. 因为我们正在尝试删除内部引用,所以我们将依靠每次运行生成的`commit-map`来告诉我们要删除哪些内部引用.
**注意:** `git filter-repo`每次运行都会创建一个新的`commit-map`文件,并覆盖前一次运行的`commit-map` . **每次**运行都将需要此文件. 每次运行`git filter-repo`都要执行下一步.
要清除所有大文件,可以使用`--strip-blobs-bigger-than`选项:
```
git filter-repo --strip-blobs-bigger-than 10M
```
要按路径清除特定的大文件,可以组合使用`--path`和`--invert-paths`选项.
```
git filter-repo --path path/to/big/file.m4v --invert-paths
```
有关更多示例和完整文档,请参见[`git filter-repo`](https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#EXAMPLES)文档.
6. 运行[存储库清理](#repository-cleanup) .
## Repository cleanup[](#repository-cleanup "Permalink")
在 GitLab 11.6 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/19376) .
仓库清理允许您上传对象的文本文件,并且 GitLab 将删除对这些对象的内部 Git 引用. 您可以使用[`git filter-repo`](https://github.com/newren/git-filter-repo)生成对象列表(在`commit-map`文件中),该对象列表可与存储库清理一起使用.
要清理存储库:
1. 转到存储库的项目.
2. 导航 **设置>存储库** .
3. 上载对象列表. 例如,一个`commit-map`文件.
4. Click **开始清理**.
这将:
* 删除所有对旧提交的内部 Git 引用.
* 针对存储库运行`git gc` .
完成后,您将收到一封电子邮件.
When using repository cleanup, note:
* 项目统计信息已缓存. 您可能需要等待 5 到 10 分钟才能看到存储利用率下降.
* 客房部修剪 2 周以上的松散物品. 这意味着在最近 2 周内添加的对象将不会立即删除. 如果您有权访问[Gitaly](../../../administration/gitaly/index.html)服务器,则可以运行`git gc --prune=now`立即修剪所有松散的对象.
* 此过程将从 GitLab 的缓存和数据库中删除一些重写提交的副本,但是覆盖范围仍然存在许多空白,并且某些副本可能会无限期地存在. [清除实例缓存](../../../administration/raketasks/maintenance.html#clear-redis-cache)可能有助于删除其中的一些[实例](../../../administration/raketasks/maintenance.html#clear-redis-cache) ,但出于安全考虑,不应依赖它!
## Storage limits[](#storage-limits "Permalink")
储存库大小限制:
* 可以[由管理员](../../admin_area/settings/account_and_limit_settings.html#repository-size-limit-starter-only)在自我管理实例上设置.
* Are [set for GitLab.com](../../gitlab_com/index.html#repository-size-limit).
当项目达到其大小限制时,您不能:
* 推送到项目.
* 创建一个新的合并请求.
* 合并现有的合并请求.
* 上载 LFS 对象.
您仍然可以:
* 创造新问题.
* 克隆项目.
如果超出存储库大小限制,则可以尝试:
1. 删除一些数据.
2. 进行新的提交.
3. 推回存储库.
也许您还可以:
* 将一些斑点移到 LFS.
* 从历史记录中删除一些旧的依赖项更新.
不幸的是,该工作流程无法正常工作. 实际上,在提交中删除文件并不会减小存储库的大小,因为早期的提交和 Blob 仍然存在.
您需要做的是重写历史记录. 我们建议使用开源社区维护的工具[`git filter-repo`](https://github.com/newren/git-filter-repo) .
**注意:**在 GitLab 端运行`git gc`之前,"已删除"的提交和 blob 仍将存在. 您还必须能够将重写的历史记录推送到 GitLab,如果您已经超过最大大小限制,则可能无法实现.
为了解除这些限制,自我管理的 GitLab 实例的管理员必须增加对超出它的特定项目的限制. 因此,最好始终主动保持在限制之下. 如果您达到了极限,并且无法暂时提高极限,则唯一的选择是:
1. 在本地修剪所有不需要的东西.
2. 在 GitLab 上创建一个新项目,然后开始使用它.
**Caution:** This process is not suitable for removing sensitive data like password or keys from your repository. Information about commits, including file content, is cached in the database, and will remain visible even after they have been removed from the repository.
\ No newline at end of file
# 分支[](#分支 "Permalink")
分支是项目工作树的版本. 您为所做的每组相关更改创建一个分支. 这样可以使每组更改彼此独立,从而可以并行进行更改,而不会互相影响.
将更改推送到新分支后,您可以:
* 创建[合并请求](../../merge_requests/index.html)
* 执行内联代码审查
* 与团队[讨论](../../../discussions/index.html)实施情况
* 使用[Review Apps](../../../../ci/review_apps/index.html)预览提交到新分支的更改.
使用[GitLab Starter](https://about.gitlab.com/pricing/) ,您还可以请求经理的[批准](../../merge_requests/merge_request_approvals.html) .
有关使用 GitLab UI 管理分支的更多信息,请参见:
* [Default branches](#default-branch)
* [Create a branch](../web_editor.html#create-a-new-branch)
* [Protected branches](../../protected_branches.html#protected-branches)
* [Delete merged branches](#delete-merged-branches)
* [Branch filter search box](#branch-filter-search-box)
您也可以使用[命令行](../../../../gitlab-basics/start-using-git.html#create-a-branch)管理分支.
观看视频[GitLab Flow](https://www.youtube.com/watch?v=InKNIvky2KE) .
也可以看看:
* [Branches API](../../../../api/branches.html) ,有关使用 GitLab API 在存储库分支上进行操作的信息.
* [GitLab Flow](../../../../university/training/gitlab_flow.html) documentation.
* [Git](../../../../topics/git/index.html)和 GitLab [入门](../../../../topics/git/index.html) .
## Default branch[](#default-branch "Permalink")
创建新[项目时](../../index.html) ,GitLab 会将`master`设置为存储库的默认分支. 您可以在项目的**设置>存储库**下选择另一个分支作为项目的默认分支.
通过[问题关闭模式](../../issues/managing_issues.html#closing-issues-automatically)直接从合并请求中[关闭问题时](../../issues/managing_issues.html#closing-issues-automatically) ,目标是项目的**默认分支** .
初始还对默认分支进行了[保护,以](../../protected_branches.html#protected-branches)防止意外删除和强制推送.
### Custom initial branch name[](#custom-initial-branch-name-core-only "Permalink")
版本历史
* 在 GitLab 13.2 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/221013) .
* 它部署在默认情况下启用的功能标志后面.
* 在 GitLab.com 上启用了它.
* 不能根据项目启用或禁用它.
* 建议用于生产.
* 对于 GitLab 自我管理的实例,GitLab 管理员可以选择[禁用它](#enable-or-disable-custom-initial-branch-name-core-only) .
默认情况下,当您在 GitLab 中创建新项目时,初始分支称为`master` . 对于自我管理的实例,GitLab 管理员可以将初始分支名称自定义为其他名称. 这样,此后创建的每个新项目都将从自定义分支名称开始,而不是`master` . 为此:
1. 转到 **在管理区域>设置>存储库中** ,展开**默认初始分支名称** .
2. 将默认的初始分支更改为您选择的自定义名称.
3. **保存更改**.
#### Enable or disable custom initial branch name[](#enable-or-disable-custom-initial-branch-name-core-only "Permalink")
正在设置默认的初始分支名称,但已准备好用于生产. 它部署在**默认情况下启用**的功能标志的后面. [有权访问 GitLab Rails 控制台的 GitLab 管理员](../../../../administration/feature_flags.html)可以选择为您的实例禁用它.
禁用它:
```
Feature.disable(:global_default_branch_name)
```
要启用它:
```
Feature.enable(:global_default_branch_name)
```
## Compare[](#compare "Permalink")
要比较存储库中的分支:
1. 导航到项目的存储库.
2. 在边栏中选择**存储库>比较** .
3. 使用[分支过滤器搜索框](#branch-filter-search-box)选择要比较的[分支](#branch-filter-search-box)
4. 单击" **比较** "以内联查看更改:
[![compare branches](img/b4e4d114d9b2244a7848961617e05a95.png)](img/compare_branches.png)
## Delete merged branches[](#delete-merged-branches "Permalink")
在 GitLab 8.14 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6449) .
[![Delete merged branches](img/6de450be845a1f48a3feae9ce8e7be6e.png)](img/delete_merged_branches.png)
此功能允许合并的分支被批量删除. 作为此操作的一部分,只有已合并[但未受保护的](../../protected_branches.html)分支才会被删除.
清理合并请求时未自动删除的旧分支尤其有用.
## Branch filter search box[](#branch-filter-search-box "Permalink")
在 GitLab 11.5 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22166) .
[![Branch filter search box](img/f380fbb3646558d8becf561df5894c38.png)](img/branch_filter_search_box.png)
此功能使您可以快速搜索和选择分支. 搜索结果按以下顺序显示:
* 名称与搜索字词完全匹配的分支.
* 名称包含搜索词的其他分支,按字母顺序排序.
有时,当您有数百个分支时,可能需要更灵活的匹配模式. 在这种情况下,您可以使用以下方法:
* `^feature`将仅匹配以'feature'开头的分支名称.
* `feature$` will only match branch names that end with ‘feature’.
\ No newline at end of file
# 创建合并请求[](#创建合并请求 "Permalink")
在创建合并请求之前,请通读"合并请求"的[简介,](getting_started.html)以熟悉概念,术语并了解如何使用它们.
每个合并请求都从创建一个分支开始. 您可以通过[命令行](#new-merge-request-from-your-local-environment) ,Git CLI 应用程序或[GitLab UI](#new-merge-request-from-a-new-branch-created-through-the-ui)在本地进行操作.
本文档介绍了创建合并请求的几种方法.
启动新的合并请求时,无论使用哪种方法,都将转到" [**新合并请求"**页面,](#new-merge-request-page)以在其中添加有关合并请求的信息.
如果将新分支推送到 GitLab,也不管使用哪种方法,都可以单击[**Create Merge Request**](#create-merge-request-button)按钮并从此处启动合并请求.
## New Merge Request page[](#new-merge-request-page "Permalink")
在" **新合并请求"**页面上,首先填写**合并请求**的标题和描述. 如果分支上已经有提交,则标题将用第一条提交消息的第一行预填充,描述将用提交消息中的任何其他行预填充. 在所有情况下,标题都是唯一的必填字段.
在此处,您可以在其中填充信息(标题,描述,受让人,里程碑,标签,批准人),然后点击**创建合并请求** .
在初始屏幕上,您还可以查看提交合并请求之前推送到分支的所有提交,管道和文件更改.
[![New Merge Request page](img/9255a795b62eb0bbe1c91eab2f85c149.png)](img/new_merge_request_page_v12_6.png)
**提示:**您可以在创建合并请求之前将一次或多次推送到 GitLab 中的分支.
## Create Merge Request button[](#create-merge-request-button "Permalink")
将新分支推送到 GitLab 后,请访问 GitLab 中的存储库,并在屏幕顶​​部看到一个号召性用语,您可以从中单击**创建合并请求**按钮.
[![Create Merge Request button](img/2257f7989872604ba6ce6506ba811b15.png)](img/create_merge_request_button_v12_6.png)
您还可以在以下页面的右上方看到" **创建合并请求"**按钮:
* **Project** page.
* **资料库>文件** page.
* **合并请求** page.
In this case, GitLab will use the most recent branch you pushed changes to as the source branch, and the default branch in the current project as the target.
## New merge request by adding, editing, and uploading a file[](#new-merge-request-by-adding-editing-and-uploading-a-file "Permalink")
当您选择通过 GitLab UI 编辑,添加或上传文件时,在文件末尾,您会看到以下选项:添加**Commit 消息** ,选择该**提交****Target 分支** ,然后选中**Start new**复选框. **具有这些更改的合并请求** .
同样,如果通过 Web IDE 更改文件,则在左侧边栏中导航到" **提交"**时,将看到这些相同的选项.
添加,编辑或上传文件后,请执行以下操作:
1. 在提交消息中描述您的更改.
2. 选择一个现有分支以将您的提交添加到其中,或者,如果您想创建一个新分支,请键入新的分支名称(不带空格,大写字母或特殊字符).
3. 保持选中复选框以立即开始新的合并请求,或者取消选中该复选框以在开始合并请求之前向该分支添加更多更改.
4. Click **提交变更**.
如果您选择开始合并请求,则将转到" [**新合并请求"**页面](#new-merge-request-page) ,您可以在其中填写信息并提交合并请求.
合并请求将针对存储库的默认分支. 如果要更改它,可以稍后通过编辑合并请求来进行更改.
## New merge request from a new branch created through the UI[](#new-merge-request-from-a-new-branch-created-through-the-ui "Permalink")
要通过 GitLab UI 快速开始处理文件,请导航至项目的" **存储库">"分支"** ,然后单击" **新建分支"** . 将创建一个新分支,您可以开始编辑文件.
提交并推送后,您可以单击" [**创建合并请求"**](#create-merge-request-button)按钮以打开" [**新合并请求"**页面](#new-merge-request-page) . 将使用当前分支作为源,并使用当前项目中的默认分支作为目标来启动新的合并请求.
## New merge request from your local environment[](#new-merge-request-from-your-local-environment "Permalink")
假设您已将存储库克隆到计算机中,并且想要开始处理文件更改,请先创建并签出一个新分支:
```
git checkout -b my-new-branch
```
处理文件更改,暂存并提交它们:
```
git add .
git commit -m "My commit message"
```
完成后, [将分支推送到 GitLab](../../../gitlab-basics/start-using-git.html#send-changes-to-gitlabcom)
```
git push origin my-new-branch
```
在输出中,GitLab 将提示您一个直接链接来创建合并请求:
```
...
remote: To create a merge request for docs-new-merge-request, visit:
remote: https://gitlab-instance.com/my-group/my-project/merge_requests/new?merge_request%5Bsource_branch%5D=my-new-branch
```
复制该链接并将其粘贴到浏览器中,将显示" [**新合并请求"页面**](#new-merge-request-page) .
[通过命令行推送时](../push_options.html)[还可以向命令添加](../push_options.html)一些[标志,](../push_options.html)以减少通过 UI 手动编辑合并请求的需要.
如果您没有通过命令行将分支推送到 GitLab(例如,您使用 Git CLI 应用程序来推送更改),则可以通过单击" [**创建合并请求"**](#create-merge-request-button)按钮通过 GitLab UI [**创建合并请求**](#create-merge-request-button) .
## New merge request from an issue[](#new-merge-request-from-an-issue "Permalink")
您也可以[直接从 issue 创建一个新的合并请求](../repository/web_editor.html#create-a-new-branch-from-an-issue) .
## New merge request from the Merge Requests page[](#new-merge-request-from-the-merge-requests-page "Permalink")
您可以通过在项目中的" **合并请求"**页面上单击" **新建合并请求"**按钮来开始创建新的合并请求. 然后选择包含更改的源项目和分支,以及要将更改合并到的目标项目和分支. 单击**比较分支,然后继续**转到" [**新合并请求"**页面](#new-merge-request-page)并填写详细信息.
## New merge request from a fork[](#new-merge-request-from-a-fork "Permalink")
分叉项目并应用本地更改后,请完成以下步骤,从您的 fork 创建一个合并请求以贡献回主项目:
1. 转到**项目>您的项目,**然后选择存储库的分支.
2. 在左侧菜单中,转到**合并请求** ,然后点击**新建合并请求** .
3. 在" **源分支"**下拉列表框中,在分支的存储库中选择您的分支作为源分支.
4. 在" **目标分支"**下拉列表框中,从上游存储库中选择分支作为目标分支.
5. 输入凭据后,单击" **比较分支",然后继续**将本地更改与上游存储库进行比较.
6. 分配用户以查看您的更改,然后点击**提交合并请求** .
合并更改后,您的更改将按照规范添加到上游存储库和分支中. 合并工作后,如果您不想对上游项目做出任何其他贡献,则可以通过[删除分支关系](../settings/index.html#removing-a-fork-relationship) ,在**Settings> Advanced Settings**部分[中将 fork 与](../settings/index.html#removing-a-fork-relationship)上游项目断开链接.
有关更多详细信息, [请参阅分叉工作流文档](../repository/forking_workflow.html) .
## New merge request by email[](#new-merge-request-by-email-core-only "Permalink")
*要使用此功能,需要由 GitLab 管理员配置[传入电子邮件](../../../administration/incoming_email.html)才能使用.* 它在 GitLab.com 中不可用.
您可以通过将电子邮件发送到特定于用户的电子邮件地址来创建新的合并请求. 通过单击**将新的合并请求**通过**电子邮件发送到该项目**按钮,可以在合并请求页面上获取地址. 该主题将用作新合并请求的源分支名称,而目标分支将是项目的默认分支. 消息正文(如果不为空)将用作合并请求描述. 您需要启用["通过电子邮件回复"](../../../administration/reply_by_email.html)才能使用此功能. 如果您的实例未启用它,则可以要求您的 GitLab 管理员这样做.
这是一个私人电子邮件地址,仅为您生成. **将其保存在自己**手中,因为拥有它的任何人都可以像您一样创建问题或合并请求. 您可以将此地址添加到您的联系人列表中以便于访问.
[![Create new merge requests by email](img/4f0a47acf91c1135738d76e1c06eec3a.png)](img/create_from_email.png)
*在 GitLab 11.7 中,我们更新了生成的电子邮件地址的格式. 但是,仍支持较旧的格式,从而允许现有别名或联系人继续工作.*
### Adding patches when creating a merge request via e-mail[](#adding-patches-when-creating-a-merge-request-via-e-mail "Permalink")
在 GitLab 11.5 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22723) .
您可以通过将补丁添加为电子邮件的附件,将提交添加到正在创建的合并请求中. 文件名以`.patch`结尾的所有附件都将被视为补丁程序,并将按名称顺序对其进行处理.
补丁的总大小可以是 2MB.
如果主题的源分支不存在,那么将从存储库的 HEAD 或指定的目标分支创建源分支以应用补丁. 可以使用[`/target_branch`快速操作](../quick_actions.html)指定目标分支. 如果源分支已经存在,则将在其顶部应用补丁.
## Reviewing and managing Merge Requests[](#reviewing-and-managing-merge-requests "Permalink")
提交合并请求后,可以通过 GitLab 进行[审查和管理](reviewing_and_managing_merge_requests.html) .
\ No newline at end of file
# 合并请求[](#合并请求 "Permalink")
合并请求使您可以可视化并协作对作为对指定 Git 分支的提交而存在的源代码的建议更改.
[![Merge request view](img/44dfa1e85103f88c82598a4ef9f8d0ae.png)](img/merge_request.png)
合并请求( **MR** )是 GitLab 作为代码协作和版本控制平台的基础. 顾名思义,它就是一个*将*一个分支*合并*到另一个分支的*请求* .
## Use cases[](#use-cases "Permalink")
答:考虑您是一个团队中的软件开发人员:
1. 您签出新分支,并通过合并请求提交更改
2. 您从团队中收集反馈
3. 您可以使用["代码质量"报告来进行](code_quality.html)优化代码的实现
4. 您可以在 GitLab CI / CD 中使用[JUnit 测试报告](../../../ci/junit_test_reports.html)来验证您的更改
5. 通过" [许可证合规性"报告,](../../compliance/license_compliance/index.html)可以避免使用许可证与您的项目不兼容的依赖项
6. 您要求您的经理[批准](merge_request_approvals.html)
7. 您的经理:
1. 推动提交并进行最终审查
2. [批准合并请求](merge_request_approvals.html)
3. 将其设置为[在管道成功时合并](merge_when_pipeline_succeeds.html)
8. 您的更改将通过[手动操作](../../../ci/yaml/README.html#whenmanual) GitLab CI / CD 部署到生产中
9. 您的实施已成功交付给客户
B.考虑您是为您公司网站编写网页的 Web 开发人员:
1. 您签出新分支,并通过合并请求提交新页面
2. 您从审稿人那里收集反馈
3. 您的更改将通过[Review Apps](../../../ci/review_apps/index.html)进行预览
4. 您要求您的网页设计师实施
5. 您要求您的经理[批准](merge_request_approvals.html)
6. 一旦批准,您的合并请求将被[压缩和合并](squash_and_merge.html) ,并[部署到带有 GitLab 页面的暂存中](https://about.gitlab.com/blog/2016/08/26/ci-deployment-and-environments/)
7. 您的生产团队[选择](cherry_pick_changes.html)合并提交到生产中
## Overview[](#overview "Permalink")
合并请求(也称为" MR")显示有关建议的更改的大量信息. MR 的主体包含其描述以及其小部件(显示有关 CI / CD 管道的信息,如果存在的话),然后是与该 MR 合作的人员的讨论线程.
MR 还包含导航选项卡,从中可以查看线程上正在进行的讨论,提交列表,管道和作业列表,代码更改以及内联代码审阅.
首先,请阅读[合并请求简介](getting_started.html) .
## Merge request navigation tabs at the top[](#merge-request-navigation-tabs-at-the-top "Permalink")
在 GitLab 12.6 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/33813) . 此定位是实验性的.
到目前为止,在合并请求窗口小部件之后,位于合并请求中以显示" **讨论区"** ," **提交"** ," **管道** "和" **更改"**的导航选项卡.
To facilitate this navigation without having to scroll up and down through the page to find these tabs, based on user feedback, we’re experimenting with a new positioning of these tabs. They are now located at the top of the merge request, with a new **Overview** tab, containing the description of the merge request followed by the widget. Next to **Overview**, you can find **Pipelines**, **Commits**, and **Changes**.
[![Merge request tab positions](img/9e7b70cdf92b88509713225035e8e964.png)](img/merge_request_tab_position_v12_6.png)
请注意,此更改当前位于默认情况下启用的功能标志之后. 对于自我管理的实例,GitLab 管理员可以通过 Rails 控制台使用以下命令将其禁用:
```
Feature.disable(:mr_tabs_position)
```
## Creating merge requests[](#creating-merge-requests "Permalink")
Learn [how to create a merge request](creating_merge_requests.html).
## Reviewing and managing merge requests[](#reviewing-and-managing-merge-requests "Permalink")
查看可使用的功能来[查看和管理合并请求](reviewing_and_managing_merge_requests.html) .
## Testing and reports in merge requests[](#testing-and-reports-in-merge-requests "Permalink")
了解有关合并请求中的[测试](testing_and_reports_in_merge_requests.html)选项[和报告](testing_and_reports_in_merge_requests.html)更改的信息.
## Authorization for merge requests[](#authorization-for-merge-requests "Permalink")
使用 GitLab 进行合并请求的主要方法有两种:
1. 在单个存储库中使用[受保护的分支](../protected_branches.html)
2. 使用权威项目的分支
[Learn more about the authorization for merge requests.](authorization_for_merge_requests.html)
\ No newline at end of file
# 合并请求版本[](#合并请求版本 "Permalink")
每次您推送到与合并请求绑定的分支时,都会创建新版本的合并请求 diff. 当您访问包含多个推送的合并请求时,可以选择并比较那些合并请求差异的版本.
[![Merge request versions](img/0d2f752f5d8c7352da5333f4f0d27835.png)](img/versions.png)
## Selecting a version[](#selecting-a-version "Permalink")
默认情况下,显示更改的最新版本. 但是,您可以从版本下拉列表中选择一个较旧的版本.
[![Merge request versions dropdown](img/1864a1996bbb1636d65648dd8b0857df.png)](img/versions_dropdown.png)
合并请求版本基于推送而不是提交. 因此,如果您单次推送了 5 次提交,那么下拉菜单中的选项就是一个. 如果您按了 5 次,则算上 5 个选项.
您还可以将合并请求版本与旧版本进行比较,以查看此后发生了什么变化.
[![Merge request versions compare](img/f0a8b71ac0a74f03724937e45e8782b9.png)](img/versions_compare.png)
在查看过时的合并版本或与基本版本以外的版本进行比较时,将禁用注释.
每次将新更改推送到分支时,系统都会显示一个用于比较最后更改的链接.
[![Merge request versions system note](img/8201105b83669750c4d60036b41f6c6d.png)](img/versions_system_note.png)
## Find the merge request that introduced a change[](#find-the-merge-request-that-introduced-a-change "Permalink")
在 GitLab 10.5 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/2383) .
在查看提交详细信息页面时,GitLab 将链接到包含该提交的合并请求(或合并请求,如果存在多个).
这仅适用于最新版本的合并请求中的提交-如果某个提交位于合并请求中,然后根据该合并请求重新建立基础,则不会链接它们.
## `HEAD` comparison mode for Merge Requests[](#head-comparison-mode-for-merge-requests "Permalink")
在 GitLab 12.10 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/27008) .
合并请求(尤其是" **更改"**选项卡)是查看和讨论源代码的地方. 在目标分支被合并到合并请求的源分支的情况下,源分支和目标分支中的更改可以显示为混合在一起,这使得很难理解目标分支中正在添加哪些更改以及已经存在哪些更改.
在 GitLab 12.10 中,我们添加了一个比较模式,该模式显示了通过模拟合并后的差异计算出的差异-更准确地表示更改,而不是使用两个分支的基础. 通过选择**master(HEAD),**可以从比较目标下拉列表中使用新模式. 将来它将[替换](https://gitlab.com/gitlab-org/gitlab/-/issues/198458)当前的默认比较.
[![Merge request versions compare HEAD](img/3478cae6da4e529f7c9cf2f4e71dd462.png)](img/versions_compare_head_v12_10.png)
\ No newline at end of file
# 子组织[](#子组织 "Permalink")
我们可支持20+ 层级的子组织(也称为嵌套结构或层次结构)。
通过子组织您可以:
* **独立的子组织** 由于每个组都有自己的可见性级别,因此您可以在同一保护范围内创建不同子组织以满足您不同的使用目的;
* **组织大型项目** 对于大型项目,子组织可能会更容易分隔源代码的权限
* **使管理人员和控制可见性变得更加容易** 根据人们的组织[成员身份](#成员身份)赋予他们不同的[权限](../../permissions.html#group-members-permissions)
有关组织和项目中允许的权限的更多信息,请参考[可见性级别](../../../development/permissions.html#general-permissions)
## 概览[](#概览 "Permalink")
一个组织中可以有许多子组织,且每个组织只能有一个直接父组, 它类似于目录或嵌套项目列表:
* 第一组
* 1.1 组
* 1.2 组
* 1.2.1 组
* 1.2.2 组
* 1.2.2.1组
假设维护一个 GNU / Linux 发行版,其中第一个子组织是发行版的名称,随后的子组织则按如下所示拆分:
* Organization Group - GNU/Linux distro
* 类别子组-包
* (项目)配套 01
* (项目)配套 02
* 类别子组-软件
* (项目)核心
* (项目)CLI
* (项目)Android 应用
* (项目)iOS 应用
* 类别子组-红外线工具
* (项目)Ansible 剧本
当执行诸如在子组织之间转移或导入项目的操作时,其行为与在`group/project`级别执行这些操作时的行为相同。
## 新建一个子组织[](#新建一个子组织 "Permalink")
要在组织中创建子组织,您必须是该组织的所有者或维护者,具体取决于该组织的设置(默认情况下,允许所有者和维护者创建子组)。
有关权限的更多信息,请检查[权限表](../../permissions.html#group-members-permissions) 。有关不允许用作组名的单词列表,请参见[保留名称](../../reserved_names.html) .
如果用户明确地作为所有者(或维护者,如果启用了此设置)被添加到父组织中,则用户始终可以创建子组,即使管理员在其组织设置中禁用了组创建也是如此。
您可以通过以下操作创建一个子组织:
1. 在组织详情页中,展开右上角**新建项目**旁的下拉按钮,选择**新建子组织** ,然后单击 **新建子组**按钮;
[![Subgroups page](img/c3c27ff673c33bcd50004c2adb617d5f.png)](img/create_subgroup_button.png)
2. 像平常一样直接创建一个新组织。 需要注意的是,父组织名称空间在 **组路径**下是不可修改的,但 可见性级别可以与父组织不同;
[![Subgroups page](img/7fb24fed9f39dcdabb530523bcb8dc08.png)](img/create_new_group.png)
3. 单击**创建组织**按钮
## 成员身份[](#成员身份 "Permalink")
将成员添加到子组织时,它们将从父组织继承成员资格和权限级别。如果您是其父组织成员之一,则您可以被允许访问该组织下所有的子组织。
成员的组权限只能由所有者更改,您可以通过查看组织的**组织设置-组织成员设置**页面来确定成员是否从父组织继承了权限。
[![Group members page](img/e18ff80d06980688066f9ec9404bd2da.png)](img/group_members.png)
从上图我们可以了解到:
* 有 5 位成员可以访问第`four`组.
* User0 是一个 Reporter,已从组`four`的层次结构上方的组`one`继承了该权限
* User1 是一个开发者,已从组`one/two`的层次结构上方的组`two`继承了该权限
* User2 是一个开发者,已从组`one/two/three`的层次结构上方的组`three`继承了该权限
* 对于 User3,没有任何父组织的指示,因此它属于`four`
* 管理员是**所有**子组织的所有者和成员,与 User3 一样也没有任何父组织的指示
您可以使用右侧的下拉列表过滤此列表:
[![Group members filter](img/8215c374294289cd2bd24399439403fd.png)](img/group_members_filter_v12_6.png)
* **仅显示直接成员**仅显示 Administrator 和 User3,因为这是属于`four`组的唯一用户
* **仅显示继承的成员**将显示 User0,User1 和 User2,无论层次结构上方的哪个组都可以作为继承权限的来源
## 提及子组织[](#提及子组织 "Permalink")
在Issue,提交和合并请求中提及组织( `@group` )将通知该组的所有成员。当有了子组织后,如果您想拆分组织的结构,将有更精细的支持。提及方式与以前一样,您可以选择要通知的人群.
[![Mentioning subgroups](img/0d1089161431c5f21751458027d84535.png)](img/mention_subgroups.png)
*访问[codechina.csdn.net/docs,](codechina.csdn.net/docs)以获得优化的导航,可发现性和可读性。*
## 概览[](#概览 "Permalink")
欢迎您使用CODEChina,如果您是 Github 或 GitLab 的初级用户,我们建议您从查看本文档开始学习如何使用 CODEChina。如果您熟悉以上两个产品中的一个或多个,您可以直接开始 CODEChina 产品,在产品中我们也会为您设置帮助提示,您可以随时回来查看我们的产品文档。
| 基础入门 | 基本入门 |
| --- | --- |
| [**用户文件**](user/index.html)熟悉CODEChina 中的功能和概念. | [**管理员文件**](administration/index.html)管理员入门 |
| [**为 CODEChina 做贡献**](#为codechina开源做贡献)为CODEChina开源贡献力量! | [**是 Git 和 GitLab/GitHub 的新手吗?**](#刚开始使用git吗)我们有资源可以帮助您入门 |
| [**从另一个平台进入 CODEChina?**](#从另一个平台进入到codechina)请查阅我们的便捷指南 |&nbsp; |
## 热门话题[](#热门话题 "Permalink")
以下是我们推荐的一些主题:
### 计划[](#计划 "Permalink")
无论您使用 Waterfall,敏捷还是会话开发,CODEChina 均可简化您的协作工作流程。
使用 CODEChina 灵活的项目管理工具可视化,确定优先级,协调和跟踪进度。
以下文档与 DevOps **计划**阶段有关:
| 计划主题 | 描述 |
| --- | --- |
| [Burndown Charts](user/project/milestones/burndown_charts.html) | 在特定的里程碑中观察项目的进度 |
| [讨论](user/discussions/index.html) | 问题,提交和合并请求中的线程,注释和可解决线程 |
| [截止日期](user/project/issues/due_dates.html) | 跟踪发行期限|
| [Epics](user/group/epics/index.html) | 跟踪共享主题的问题组|
| [问题](user/project/issues/index.html) ,包括[机密问题](user/project/issues/confidential_issues.html)[发布和合并请求模板](user/project/description_templates.html) ,和[移动的问题](user/project/issues/managing_issues.html#moving-issues) | 项目问题并限制对问题的访问,并创建用于提交新问题和合并请求的模板。 此外,在项目之间转移问题。|
| [标签](user/project/labels.html) | 分类问题或使用描述性标签合并请求|
| [里程碑](user/project/milestones/index.html) | 设置发布问题和合并请求的里程碑,并带有可选的截止日期|
| [看板](user/project/issue_board.html) | 在 Scrum 或看板上显示问题|
| [快捷方式](user/project/quick_actions.html) | 针对问题或合并请求的常见操作的快捷方式,而无需单击按钮或在WEB界面中使用下拉菜单。 |
| [关联 Issue](user/project/issues/related_issues.html) | 在问题之间建立关系. |
| [Roadmap](user/group/roadmap/index.html) | 可视化史诗般的时间表 |
| [时间跟踪](user/project/time_tracking.html) | 跟踪花费在问题和合并请求上的时间 |
| [代办事项](user/todos.html) | 通过在简单仪表板上显示的时间顺序列表,跟踪需要注意的工作。 |
[返回概览](#概览)
### 新建[](#新建 "Permalink")
将源代码整合到一个易于管理和控制的[分布式版本控制系统中](https://en.wikipedia.org/wiki/Distributed_version_control) ,而不会中断您的工作流程。
CODEChina 存储库随附分支工具和访问控制,可为项目和代码的协作提供可扩展的单一事实来源。
以下文档与 DevOps **新建**阶段有关:
#### 项目和组织[](#项目和组织 "Permalink")
| 创建主题-项目和组 | 描述 |
| --- | --- |
| [全局搜索](user/search/advanced_global_search.html) | 利用 Elasticsearch 在整个 CODEChina 实例上进行更快,更高级的代码搜索|
| [语法检索](user/search/advanced_search_syntax.html) | 使用高级查询获得更具针对性的搜索结果|
| [Contribution analytics](user/group/contribution_analytics/index.html) | 请参阅小组贡献者的详细统计信息|
| [创建](basics/create-project.html)[fork](basics/fork-project.html)项目,以及[导入项目](user/project/settings/import_export.html) [](user/project/settings/import_export.html) [实例之间](user/project/settings/import_export.html) | 创建,复制和移动项目 |
| [锁定文件](user/project/file_lock.html) | 锁定文件以避免合并冲突 |
| [组织](user/group/index.html) and [子组织](user/group/subgroups/index.html) | 分组组织您的项目 |
| [Issue 分析](user/group/issues_analytics/index.html) | 检查每月创建了多少个问题|
| [项目](user/project/index.html) ,包括[项目访问](public_access/public_access.html)[设置](user/project/settings/index.html) | 托管源代码,并控制项目的可见性和设置配置。|
| [Search through CODEChina](user/search/index.html) | 搜索问题,合并请求,项目,组和待办事项。|
| [Web IDE](user/project/web_ide/index.html) | 在 WebIDE 中编辑文件|
| [Wikis](user/project/wiki/index.html) | 使用内置的 Wiki 来管理您的文档|
[返回概览](#概览)
#### 代码仓库[](#代码仓库 "Permalink")
| 创建主题-代码仓库 | 描述 |
| --- | --- |
| [分支](user/project/repository/branches/index.html)[默认分支](user/project/repository/branches/index.html#default-branch) | 如何在 CODEChina 中使用分支 |
| [提交](user/project/repository/index.html#commits) and [署名提交](user/project/repository/gpg_signed_commits/index.html) | 处理提交,并使用 GPG 对您的提交进行签名。 |
| [创建分支](user/project/repository/web_editor.html#create-a-new-branch)[创建](user/project/repository/web_editor.html#create-a-file)[上传](user/project/repository/web_editor.html#upload-a-file)文件,并[创建目录](user/project/repository/web_editor.html#create-a-directory) | 创建分支,创建和上传文件以及创建目录。|
| [删除已合并的分支](user/project/repository/branches/index.html#delete-merged-branches) | 合并更改后的批量删除分支|
| [文件模板](user/project/repository/web_editor.html#template-dropdowns) | 通用文件的文件模板 |
| [文件](user/project/repository/index.html#files) | 文件管理 |
| [Jupyter Notebook 文件](user/project/repository/jupyter_notebooks/index.html#jupyter-notebook-files) | 对`.ipynb`文件的支持 |
| [保护分支](user/project/protected_branches.html) | 使用受保护的分支 |
| [推送规则](push_rules/push_rules.html) | 对项目推送的附加控制 |
| [代码仓库](user/project/repository/index.html) | 在网页中管理源代码仓库 |
| [镜像代码仓库](user/project/repository/repository_mirroring.html) | 推入或拉出外部的代码仓库 |
| [处理合并请求](user/project/repository/web_editor.html#tips) | 在提交时启动合并请求 |
[返回概览](#概览)
#### 合并请求[](#合并请求 "Permalink")
| 创建主题-合并请求 | 描述 |
| --- | --- |
| [在本地处理合并请求](user/project/merge_requests/reviewing_and_managing_merge_requests.html#checkout-merge-requests-locally) | 在本地处理合并请求的提示|
| [Cherry-pick](user/project/merge_requests/cherry_pick_changes.html) | 对更改进行 Cherry Pick |
| [Merge request thread resolution](user/discussions/index.html#moving-a-single-thread-to-a-new-issue) | 解析线程,将合并请求中的线程移至问题,并且仅在解决所有线程后才允许合并请求。 |
| [合并请求](user/project/merge_requests/index.html) | 合并请求管理 |
| [草稿合并请求](user/project/merge_requests/work_in_progress_merge_requests.html) | 防止合并草稿合并请求 |
[返回概览](#概览)
## 刚开始使用Git/CODEChina/GitLab/Github?[](#刚开始使用git吗 "Permalink")
使用新系统可能让您觉得难以入手,我们有以下文档可快速提升您的相关知识:
| 主题 | 描述 |
| --- | --- |
| [Basics guides](basics/README.html) | 开始在命令行和 CODEChina 上工作 |
| [Workflow overview]() | 利用最佳的工作流程增强您的工作流程 |
| [Markdown](user/markdown.html) | 高级格式化系统(Markdown) |
[返回概览](#概览)
### 账户管理[](#账户管理 "Permalink")
了解有关帐户管理的更多信息:
| 主题 | 描述 |
| --- | --- |
| [用户账号](user/profile/index.html) | 管理您的帐户 |
| [账号验证](topics/authentication/index.html) | 具有两因素身份验证的帐户安全性,设置您的 SSH 密钥,并部署密钥以安全地访问您的项目。 |
| [用户权限](user/permissions.html) | 了解项目中的每个角色可以做什么 |
[返回概览](#概览)
### Git 和 CODEChina[](#Git和CODEChina "Permalink")
了解有关使用 Git 以及将 Git 与 CODEChina 结合使用的更多信息:
| 主题 | 描述 |
| --- | --- |
| [Git](topics/git/index.html) | Git 入门,分支策略,Git LFS 和高级用法 |
| [Git cheat sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf) | 下载描述最常用的 Git 操作的 PDF|
| [Work Flow](topics/flow.html) | 使用 Work Flow 策略探索 Git 的精华 |
[返回概览](#概览)
## 从另一个平台进入到 CODEChina?[](#从另一个平台进入到 codechina "Permalink")
如果您是从另一个平台进入 CODEChina,您会发现以下有用信息:
| 主题 | 描述 |
| --- | --- |
| [导入项目](user/project/import/index.html) | 从 GitHub,Bitbucket,GitLab.com,FogBugz 和 SVN 导入项目 |
| [从SVN迁移](user/project/import/svn.html) | 将 SVN 存储库转换为 Git 和 CODEChina |
[返回概览](#概览)
## 为CODEChina开源做贡献[](#为codehina开源做贡献 "Permalink")
CODEChina 是开源的,您可以通过以下方式为我们的开源社区做出贡献:
| 主题 | 描述 |
| --- | --- |
| [开发](development/README.html) | 如何在开发上做贡献 |
| [协议](legal/README.html) | 贡献者许可协议 |
| [文档](development/documentation/index.html) | 如何在文档上做贡献|
[返回概览](#概览)
\ No newline at end of file
此差异已折叠。
# 徽章[](#徽章 "Permalink")
在 GitLab 10.7 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41174) .
徽章是呈现有关您的项目的简要信息的统一方法. 它们由一个小图像以及该图像指向的 URL 组成. 徽章的示例可以是[管道状态](../../ci/pipelines/settings.html#pipeline-status-badge)[测试范围](../../ci/pipelines/settings.html#test-coverage-report-badge)或与项目维护者联系的方式.
[![Badges on Project overview page](img/0e0e78d03e98ec2ac04952defaba83ff.png)](img/project_overview_badges.png)
## Project badges[](#project-badges "Permalink")
维护者或所有者可以将徽章添加到项目中,然后在项目的概述页面上可见. 如果发现必须将相同的徽标添加到多个项目,则可能需要在[组级别](#group-badges)添加它们.
要将新徽章添加到项目:
1. 导航到项目的**设置>常规>徽章** .
2. 在"链接"下,输入徽章应指向的 URL,在"徽章图像 URL"下输入应显示的图像的 URL.
3. 通过单击**添加徽章**按钮来提交**徽章** .
将徽章添加到项目后,您可以在表单下方的列表中看到它. 您可以通过单击旁边的笔图标进行编辑,也可以通过单击垃圾箱图标将其删除.
与组关联的徽章只能在[组级别](#group-badges)上进行编辑或删除.
## Group badges[](#group-badges "Permalink")
可以将徽章添加到组中,然后将在该组下的每个项目的概述页面上看到它们. 在这种情况下,无法在项目级别上对其进行编辑或删除. 如果每个项目需要单独的徽章,请考虑将其添加到[项目级别](#project-badges)或使用[占位符](#placeholders) .
要将新徽章添加到组:
1. 导航到组的**"设置">"常规">"徽章"** .
2. 在"链接"下,输入徽章应指向的 URL,在"徽章图像 URL"下输入应显示的图像的 URL.
3. 通过单击**添加徽章**按钮来提交**徽章** .
将徽章添加到组后,您可以在表格下方的列表中看到它. 您可以通过单击徽章旁边的笔图标来编辑徽章,也可以通过单击垃圾箱图标来删除徽章.
与项目直接关联的徽章可以在[项目级别](#project-badges)上配置.
## Placeholders[](#placeholders "Permalink")
徽章指向的 URL 以及图像 URL 可以包含占位符,在显示徽章时将对其进行评估. 可以使用以下占位符:
* `%{project_path}` :包含父组的项目的路径
* `%{project_id}` :与项目关联的数据库 ID
* `%{default_branch}` :为项目存储库配置的默认分支名称
* `%{commit_sha}` :对项目存储库的默认分支的最新提交的 ID
**Note:** Placeholders allow badges to expose otherwise-private information, such as the default branch or commit SHA when the project is configured to have a private repository. This is by design, as badges are intended to be used publicly. Avoid using these placeholders if the information is sensitive.
## API[](#api "Permalink")
您还可以通过 GitLab API 配置徽章. 与设置一样,在[项目级别](../../api/project_badges.html)[组级别的](../../api/group_badges.html)徽章端点之间也有所区别.
\ No newline at end of file
此差异已折叠。
# 快进合并请求[](#快进合并请求 "Permalink")
有时,工作流策略可能会强制要求没有合并提交的干净提交历史记录. 在这种情况下,快速合并是理想的选择.
使用快速转发合并请求,您可以保留线性 Git 历史记录以及一种无需创建合并提交即可接受合并请求的方法.
## Overview[](#overview "Permalink")
启用快进合并( [`--ff-only`](https://git-scm.com/docs/git-merge#git-merge---ff-only) )设置时,将不会创建任何合并提交,并且所有合并都将被快速转发,这意味着仅当分支可以被快速转发时才允许合并.
当无法进行快速合并时,将为用户提供重新设置基准的选项.
## Enabling fast-forward merges[](#enabling-fast-forward-merges "Permalink")
1. 导航到项目的**设置,**然后搜索"合并方法"
2. 选择**快速合并**选项
3. 点击**保存更改**以使更改生效
现在,当您访问合并请求页面时, **只有在可能进行快速**合并的情况下,您才能接受它.
[![Fast forward merge request](img/50ab118d473b61d3d08773d6ea65a8ac.png)](img/ff_merge_mr.png)
如果无法进行快速合并,但可以进行无冲突的变基,则将提供一个变基按钮.
[![Fast forward merge request](img/51192310b3785dec5f60b6d59717a7a6.png)](img/ff_merge_rebase.png)
如果目标分支位于源分支的前面,并且无法进行无冲突的变基,则需要先在本地对源分支进行变基,然后才能进行快速合并.
[![Fast forward merge rebase locally](img/d241e2868510cfa5755170c1f02c78f3.png)](img/ff_merge_rebase_locally.png)
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
# 文件查找[](#文件查找 "Permalink")
在 GitLab 8.4 中[引入](https://github.com/gitlabhq/gitlabhq/pull/9889) .
文件查找器功能使您可以使用 GitLab UI 在存储库中搜索文件.
您可以在项目的" **文件"**部分中找到" **查找文件"**按钮.
[![Find file button](img/264ee345c8d001f9b7cabf52e10f47bf.png)](img/file_finder_find_button_v12_10.png)
对于那些喜欢用手指触摸键盘的人,还有一个[快捷按钮](../../shortcuts.html) ,您可以从项目中的*任何地方*调用它.
**问题****合并请求****里程碑**甚至项目设置中,按`t`键启动文件搜索功能.
开始输入您要搜索的内容,然后观察魔术的发生. 使用向上/向下箭头,您可以向上和向下搜索结果,使用`Esc`可以关闭搜索并返回" **文件"**
## How it works[](#how-it-works "Permalink")
文件查找器功能由[模糊过滤器](https://github.com/jeancroy/fuzz-aldrin-plus)库提供支持.
它通过突出显示来实现模糊搜索,并试图通过识别人们在搜索时使用的模式来提供直观的结果.
例如,考虑[GitLab FOSS 存储库](https://gitlab.com/gitlab-org/gitlab-foss/tree/master) ,并且我们要打开`app/controllers/admin/deploy_keys_controller.rb`文件.
使用模糊搜索,我们首先输入使我们更接近文件的字母.
**提示:**要缩小搜索范围,请在搜索词中包含`/` .
[![Find file button](img/ead8d62e426d9309f25a82da77770f59.png)](img/file_finder_find_file_v12_10.png)
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册