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

web-editor

上级 96c93584
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
* [Git属性](docs/user/project/git-attr.md) * [Git属性](docs/user/project/git-attr.md)
* [文件指责](docs/user/project/repo/blame.md) * [文件指责](docs/user/project/repo/blame.md)
* [文件历史记录](docs/user/project/repo/history.md) * [文件历史记录](docs/user/project/repo/history.md)
* [镜像仓库](docs/user/project/repo/mirror.md)
* [保护分支](docs/user/project/protected-branch.md) * [保护分支](docs/user/project/protected-branch.md)
* [保护Tag](docs/user/project/protected-tag.md) * [保护Tag](docs/user/project/protected-tag.md)
* [减少仓库大小](docs/user/project/repo/reduce-repo-size.md) * [减少仓库大小](docs/user/project/repo/reduce-repo-size.md)
......
# 文件历史记录[](#文件历史记录 "Permalink") # 文件历史记录[](#file-history "Permalink")
在 GitLab 0.8.0 中[引入](https://gitlab.com/gitlab-org/gitlab/blob/9ba1224867665844b117fa037e1465bb706b3685/app/controllers/commits_controller.rb) Git 文件历史记录提供与文件关联的提交历史记录的信息,您可以在项目中的每个文件中找到**历史记录**按钮。
Git 文件历史记录提供有关与文件关联的提交历史记录的信息. [![File history button](/docs/img/file_history_button_v12_6.png "History button")](/docs/img/file_history_button_v12_6.png)
您可以在项目中的每个文件中找到" **历史记录"**按钮. 当选择**历史记录**按钮时,您将看到提交列表,如果将鼠标悬停在提交时间上,您将看到上次修改提交的确切日期和时间。
[![File history button](img/4b803fd891a7ec7f422522d2ff185864.png "History button")](img/file_history_button_v12_6.png) ## 在 git 中使用[](#associated-git-command "Permalink")
当选择" **历史记录"**按钮时,您将看到一个带有说明信息的屏幕 如果要从`git`查看文件历史记录,则可以使用`git log <filename>`命令。例如,如果要在本地目录中找到有关`README.md`文件的`history`信息,请运行以下命令
[![Git log output](img/0dad61d266449688c931d1703509bca3.png "History button output")](img/file_history_output_v12_6.png) ```markdown
如果将鼠标悬停在 UI 中的提交上,您将看到上次修改提交的确切日期和时间.
## Associated `git` command[](#associated-git-command "Permalink")
如果从命令行运行`git` ,则等效命令为`git log <filename>` . 例如,如果要在本地目录中找到有关`README.md`文件的`history`信息,请运行以下命令:
```
git log README.md git log README.md
``` ```
您将看到类似于以下内容的输出,其中包括 UTC 格式的提交时间: 您将看到类似于以下内容的输出,其中包括 UTC 格式的提交时间:
``` ```markdown
commit 0e62ed6d9f39fa9bedf7efc6edd628b137fa781a commit 0e62ed6d9f39fa9bedf7efc6edd628b137fa781a
Author: Mike Jang <mjang@gitlab.com> Author: Someone <someone@codechina.csdn.net>
Date: Tue Nov 26 21:44:53 2019 +0000 Date: Tue Nov 26 21:44:53 2019 +0000
Deemphasize GDK as a doc build tool Deemphasize GDK as a doc build tool
commit 418879420b1e3a4662067bd07b64bb6988654697 commit 418879420b1e3a4662067bd07b64bb6988654697
Author: Marcin Sedlak-Jakubowski <msedlakjakubowski@gitlab.com> Author: Marcin Sedlak-Jakubowski <someone_else@codechina.csdn.net>
Date: Mon Nov 4 19:58:27 2019 +0100 Date: Mon Nov 4 19:58:27 2019 +0100
Fix typo Fix typo
commit 21cc1fef11349417ed515557748369cfb235fc81 commit 21cc1fef11349417ed515557748369cfb235fc81
Author: Jacques Erasmus <jerasmus@gitlab.com> Author: Jacques Erasmus <someone_else@codechina.csdn.net>
Date: Mon Oct 14 22:13:40 2019 +0000 Date: Mon Oct 14 22:13:40 2019 +0000
Add support for modern JS Add support for modern JS
...@@ -46,7 +38,7 @@ Date: Mon Oct 14 22:13:40 2019 +0000 ...@@ -46,7 +38,7 @@ Date: Mon Oct 14 22:13:40 2019 +0000
Added rollup to the project Added rollup to the project
commit 2f5e895aebfa5678e51db303b97de56c51e3cebe commit 2f5e895aebfa5678e51db303b97de56c51e3cebe
Author: Achilleas Pipinellis <axil@gitlab.com> Author: Achilleas Pipinellis <codechina@codechina.csdn.net>
Date: Fri Sep 13 14:03:01 2019 +0000 Date: Fri Sep 13 14:03:01 2019 +0000
Remove gitlab-foss Git URLs as we don't need them anymore Remove gitlab-foss Git URLs as we don't need them anymore
......
# 镜像仓库[](#镜像仓库 "Permalink")
存储库镜像允许将存储库镜像到外部源或从外部源镜像. 它可用于镜像存储库之间的分支,标签和提交.
GitLab 上的存储库镜像将自动更新. 您也可以最多每 5 分钟手动触发一次更新.
## Overview[](#overview "Permalink")
当您想在 GitLab 之外使用存储库时,存储库镜像很有用.
GitLab 支持两种存储库镜像:
* 推送:用于将 GitLab 存储库镜像到另一个位置.
* Pull: for mirroring a repository from another location to GitLab.
镜像存储库更新后,所有新的分支,标记和提交将在项目的活动提要中可见.
至少具有[开发人员访问](../../permissions.html)项目[权限](../../permissions.html)的用户也可以强制立即更新,除非:
* 镜像已被更新.
* 自上次更新以来,还没有过去 5 分钟.
出于安全原因,在[GitLab 12.10 和更高版本中](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27166) ,原始存储库的 URL 仅显示给对镜像项目具有维护者或所有者权限的用户.
## Use cases[](#use-cases "Permalink")
以下是存储库镜像的一些可能的用例:
* 您迁移到了 GitLab,但仍需要将项目保留在另一个源中. 在这种情况下,您只需将其设置为镜像到 GitLab(拉),所有提交,标签和分支的基本历史记录都将在您的 GitLab 实例中提供.
* 您在另一个源中有旧项目,这些旧项目不再使用,但又不想出于归档目的而删除它们. 在这种情况下,您可以创建一个推送镜像,以便您的活动 GitLab 存储库可以将其更改推送到旧位置.
## Pushing to a remote repository[](#pushing-to-a-remote-repository-core "Permalink")
版本历史
* 在 GitLab 企业版 8.7 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/249) .
* 在 10.8 版中[移至 GitLab Core](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18715) .
对于现有项目,可以按如下所示设置推送镜像:
1. 导航到项目的**"设置">"存储库",**然后展开" **镜像存储库"**部分.
2. 输入存储库 URL.
3.**镜像方向**下拉菜单中选择**推送** .
4. 如有必要,请从" **身份验证方法"**下拉列表中选择一种身份**验证方法** .
5. 如有必要,请选中**仅镜像保护的分支**框.
6. 如果需要, **请**选中" **保持差异引用"**框.
7. 单击**镜像存储库**按钮以保存配置.
[![Repository mirroring push settings screen](img/d67d5681f30c4769c6d92232eada26e4.png)](img/repository_mirroring_push_settings.png)
启用推送镜像后,只有推送会直接提交到镜像存储库,以防止镜像发散. 任何时候,所有更改都将最终存储在镜像存储库中:
* 提交被推送到 GitLab.
* [强制更新](#forcing-an-update-core)已启动.
推送到存储库中文件的更改至少会自动推送到远程镜像:
* 收到后五分钟内.
* 如果启用了**仅受镜像保护的分支,**则在一分钟之内.
如果分支分支不同,您将在" **镜像存储库"**部分看到指示的错误.
### Configuring push mirrors through the API[](#configuring-push-mirrors-through-the-api "Permalink")
您还可以通过[远程镜像 API](../../../api/remote_mirrors.html)创建和修改项目推送镜像.
### Push only protected branches[](#push-only-protected-branches-core "Permalink")
版本历史
*[GitLab Starter](https://about.gitlab.com/pricing/) 10.3 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3350) .
* 在 10.8 版中[移至 GitLab Core](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18715) .
您可以选择仅将受保护的分支从 GitLab 推送到远程存储库.
要使用此选项,请在创建存储库镜像时选中" **仅镜像保护的分支"**框.
### Keep divergent refs[](#keep-divergent-refs-core "Permalink")
在 GitLab 13.0 中[引入](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) .
默认情况下,如果远程镜像上的任何引用都与本地存储库不同,则*整个推送*将失败,并且不会更新任何内容.
例如,如果存储库具有已镜像到远程的`master``develop``stable`分支,然后添加新提交以在镜像上进行`develop` ,则下一次推送尝试将失败,从而使`master``stable`不在可用范围内约会尽管没有分歧. 在解决分歧之前,无法反映任何分支上的更改.
启用" **保持差异引用"**选项后,将跳过`develop`分支,从而可以更新`master``stable` . 镜像状态将反映`develop`已偏离并被跳过,并标记为更新失败.
**注意:**创建镜像后,当前只能通过[API](../../../api/remote_mirrors.html)修改此选项.
## Setting up a push mirror from GitLab to GitHub[](#setting-up-a-push-mirror-from-gitlab-to-github-core "Permalink")
要设置从 GitLab 到 GitHub 的镜像,您需要执行以下步骤:
1. 创建一个[GitHub 个人访问令牌](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) ,并选中`public_repo`框.
2. 使用以下格式填写**Git 存储库 URL**字段: `https://<your_github_username>@github.com/<your_github_group>/<your_github_project>.git` .
3. 使用您的 GitHub 个人访问令牌填写**密码**字段.
4. 单击**镜像存储库**按钮.
镜像的存储库将被列出. 例如, `https://*****:*****@github.com/<your_github_group>/<your_github_project>.git` .
该存储库将很快推送. 要强制按下,请单击适当的按钮.
## Setting up a push mirror to another GitLab instance with 2FA activated[](#setting-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated "Permalink")
1. 在目标 GitLab 实例上,创建一个具有`write_repository`范围的[个人访问令牌](../../profile/personal_access_tokens.html) .
2. 在源 GitLab 实例上:
1. 使用以下格式填写**Git 存储库 URL**字段: `https://oauth2@<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git` .
2. 在目标 GitLab 实例上创建的 GitLab 个人访问令牌中填写**密码**字段.
3. 单击**镜像存储库**按钮.
## Pulling from a remote repository[](#pulling-from-a-remote-repository-starter "Permalink")
版本历史
* 在 GitLab 企业版 8.2 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51) .
*[GitLab Starter](https://about.gitlab.com/pricing/) 11.11 中[添加了 Git LFS 支持](https://gitlab.com/gitlab-org/gitlab/-/issues/10871) .
您可以将存储库设置为自动从上游存储库更新其分支,标记和提交.
当您感兴趣的存储库位于其他服务器上并且您希望能够使用熟悉的 GitLab 界面浏览其内容和活动时,此功能很有用.
要为现有项目配置镜像拉出:
1. Navigate to your project’s **设置>存储库** and expand the **镜像存储库** section.
2. 输入存储库 URL.
3.**镜像方向**下拉菜单中选择**拉** .
4. 如有必要,请从" **身份验证方法"**下拉列表中选择一种身份**验证方法** .
5. 如有必要,请选中以下框:
* **覆盖分散的分支** .
* **触发管道以更新镜像** .
* **仅镜像保护的分支** .
6. 单击**镜像存储库**按钮以保存配置.
[![Repository mirroring pull settings screen - upper part](img/5881da97228cb042e5934f836edfd06c.png)](img/repository_mirroring_pull_settings_upper.png)
* * *
[![Repository mirroring pull settings screen - lower part](img/d5df9e77d389b58908ef235600ccc61c.png)](img/repository_mirroring_pull_settings_lower.png)
Because GitLab is now set to pull changes from the upstream repository, you should not push commits directly to the repository on GitLab. Instead, any commits should be pushed to the upstream repository. Changes pushed to the upstream repository will be pulled into the GitLab repository, either:
* 在一定时间内自动.
* 启动[强制更新时](#forcing-an-update-core) .
**警告:**如果您确实在 GitLab 存储库中更新了分支,则该分支将与上游分叉,并且 GitLab 将不再自动更新该分支以防止丢失任何更改. 另请注意,上游存储库中已删除的分支和标签将不会反映在 GitLab 存储库中.
### How it works[](#how-it-works "Permalink")
为存储库启用拉镜像功能后,会将存储库添加到队列中.
每分钟一次,Sidekiq cron 作业基于以下内容计划存储库镜像的更新:
* 可用容量. 这由 Sidekiq 设置确定. 对于 GitLab.com,请参阅[GitLab.com Sidekiq 设置](../../gitlab_com/index.html#sidekiq) .
* 队列中已经要更新的存储库镜像数. 到期时间取决于存储库镜像的最后更新时间以及重试次数.
随着 Sidekiq 可以处理存储库镜像,它们也会更新. 如果更新存储库镜像的过程为:
* 成功后,至少需要等待 30 分钟,更新才会重新加入队列.
* 失败(例如,分支从上游分支),稍后将再次尝试. 镜像最多可以发生 14 次故障,然后才不会再次进入队列进行更新.
### SSH authentication[](#ssh-authentication "Permalink")
> * 在[GitLab Starter](https://about.gitlab.com/pricing/) 9.5 中[引入](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2551)了拉镜像.
> * 在[GitLab Core](https://about.gitlab.com/pricing/) 11.6 中为推送镜像[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22982)
SSH 身份验证是相互的:
* 您必须向服务器证明您有权访问存储库.
* 服务器还必须向*您*证明它是谁.
您提供凭据作为密码或公共密钥. 另一个存储库所在的服务器提供其凭据作为"主机密钥",其指纹需要手动验证.
如果您通过 SSH 镜像(即使用`ssh://` URL),则可以使用以下方法进行身份验证:
* 基于密码的身份验证,就像通过 HTTPS 一样.
* 公钥认证. 这通常比密码身份验证更安全,尤其是当其他存储库支持[Deploy Keys 时](../../../ssh/README.html#deploy-keys) .
开始:
1. 导航到项目的**"设置">"存储库",**然后展开" **镜像存储库"**部分.
2. 输入`ssh://` URL 进行镜像.
**注意:**目前不支持 SCP 样式的 URL(即`git@example.com:group/project.git` ).
输入 URL 在页面上添加两个按钮:
* **检测主机密钥**.
* **手动输入主机密钥**.
如果单击:
* **检测主机密钥**按钮,GitLab 将从服务器获取主机密钥并显示指纹.
* **手动输入主机密钥**按钮,将显示一个字段,您可以在其中粘贴主机密钥.
假设您使用了前者,那么现在需要验证指纹是否符合您的期望. GitLab.com 和其他代码托管站点公开公开其指纹,供您检查:
* [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html#regions-fingerprints)
* [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
* [GitHub](https://help.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints)
* [GitLab.com](../../gitlab_com/index.html#ssh-host-keys-fingerprints)
* [Launchpad](https://help.launchpad.net/SSHFingerprints)
* [Savannah](http://savannah.gnu.org/maintenance/SshAccess/)
* [SourceForge](https://sourceforge.net/p/forge/documentation/SSH%20Key%20Fingerprints/)
其他提供者将有所不同. 如果您正在运行自我管理的 GitLab,或者可以访问其他存储库的服务器,则可以安全地收集密钥指纹:
```
$ cat /etc/ssh/ssh_host*pub | ssh-keygen -E md5 -l -f -
256 MD5:f4:28:9f:23:99:15:21:1b:bf:ed:1f:8e:a0:76:b2:9d root@example.com (ECDSA)
256 MD5:e6:eb:45:8a:3c:59:35:5f:e9:5b:80:12:be:7e:22:73 root@example.com (ED25519)
2048 MD5:3f:72:be:3d:62:03:5c:62:83:e8:6e:14:34:3a:85:1d root@example.com (RSA)
```
**注意:**对于某些旧版本的 SSH,可能需要排除`-E md5` .
在镜像存储库时,GitLab 现在将在连接之前检查至少一个存储的主机密钥是否匹配. 这样可以防止将恶意代码注入到您的镜像中,或者防止您的密码被盗.
### SSH public key authentication[](#ssh-public-key-authentication "Permalink")
要使用 SSH 公钥身份验证,您还需要从**Authentication method**下拉菜单中选择该选项. 创建镜像后,GitLab 会生成一个 4096 位 RSA 密钥,可以通过单击" **复制 SSH"公共密钥**按钮进行复制.
[![Repository mirroring copy SSH public key to clipboard button](img/c1e086b58ff99dd5c5684a4571e568e3.png)](img/repository_mirroring_copy_ssh_public_key_button.png)
然后,您需要将公共 SSH 密钥添加到另一个存储库的配置中:
* 如果其他存储库托管在 GitLab 上,则应将公共 SSH 密钥添加为[Deploy Key](../../../ssh/README.html#deploy-keys) .
* 如果其他存储库位于其他位置,则可能需要将密钥添加到用户的`authorized_keys`文件中. 将整个公共 SSH 密钥单独粘贴到文件中并保存.
如果您需要随时更改密钥,则可以删除并重新添加镜像以生成新密钥. 您必须使用新密钥更新另一个存储库,以保持镜像运行.
**注意:**生成的密钥存储在 GitLab 数据库中,而不存储在文件系统中. 因此,无法在预接收挂钩中使用针对镜像的 SSH 公钥身份验证.
### Overwrite diverged branches[](#overwrite-diverged-branches-starter "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4559) in [GitLab Starter](https://about.gitlab.com/pricing/) 10.6.
您可以选择始终使用远程版本更新本地分支,即使它们与远程分支不同.
**警告:**对于镜像分支,启用此选项会导致丢失本地更改.
要使用此选项,请在创建存储库镜像时选中" **覆盖分支分支"**框.
### Only mirror protected branches[](#only-mirror-protected-branches-starter "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3326) in [GitLab Starter](https://about.gitlab.com/pricing/) 10.3.
您可以选择仅将受保护的分支从远程存储库拉到 GitLab. 未受保护的分支不会被镜像,并且可能会分开.
要使用此选项,请在创建存储库镜像时选中" **仅镜像保护的分支"**框.
### Hard failure[](#hard-failure-starter "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3117) in [GitLab Starter](https://about.gitlab.com/pricing/) 10.2.
如果镜像过程连续 14 次失败重试,它将被标记为硬盘失败. 这将在以下任一位置中可见:
* 项目的主要仪表板.
* 拉镜设置页面.
当一个项目很难失败时,它将不再需要进行镜像. 用户可以通过[强制更新来](#forcing-an-update-core)再次恢复项目镜像.
### Trigger update using API[](#trigger-update-using-api-starter "Permalink")
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3453) in [GitLab Starter](https://about.gitlab.com/pricing/) 10.3.
拉镜像使用轮询来检测新添加的分支和提交,通常是在几分钟后. 如果您通过[API](../../../api/projects.html#start-the-pull-mirroring-process-for-a-project-starter)通知 GitLab,更新将立即被拉出.
有关更多信息,请参阅[启动项目的拉镜像过程](../../../api/projects.html#start-the-pull-mirroring-process-for-a-project-starter) .
## Forcing an update[](#forcing-an-update-core "Permalink")
当计划将镜像自动更新时,您始终可以使用" **存储** **库设置"**页面的" **镜像存储库"**部分上的"更新"按钮强制进行更新.
[![Repository mirroring force update user interface](img/a6e9b62f94c53cd2f37f7300362137a9.png)](img/repository_mirroring_force_update.png)
## Bidirectional mirroring[](#bidirectional-mirroring-starter "Permalink")
**注意:**双向镜像可能会导致冲突.
如果您将 GitLab 存储库配置为从同一远程源中拉出和推送到同一远程源,则不能保证这两个存储库都将正确更新. 如果为双向镜像设置存储库,则应通过确定谁将解决它们以及如何解决它们来为可能的冲突做准备.
重写任一远程上的任何镜像提交将导致冲突,并且镜像失败. 可以通过以下方法防止此情况:
* [Pulling only protected branches](#only-mirror-protected-branches-starter).
* [Pushing only protected branches](#push-only-protected-branches-core).
您应该[保护](../protected_branches.html)希望在两个远程控制器上镜像[的分支](../protected_branches.html) ,以防止由于重写历史记录而引起的冲突.
双向镜像还会创建竞态条件,在这种竞态条件中,靠近同一分支的提交会引起冲突. 通过使用[Push 事件 Webhook](../integrations/webhooks.html#push-events)触发立即拉到 GitLab,可以通过减少镜像延迟来缓解竞争状况. 当仅推送镜像受保护的分支时,来自 GitLab 的推送镜像的速率限制为每分钟一次.
### Configure a webhook to trigger an immediate pull to GitLab[](#configure-a-webhook-to-trigger-an-immediate-pull-to-gitlab "Permalink")
假设您已经在上游 GitLab 实例中配置了[](#setting-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated)[](#pulling-from-a-remote-repository-starter)镜像,以触发如上所述的立即提拉,则需要在下游实例中配置一个[推事件 Web 挂钩](../integrations/webhooks.html#push-events) .
去做这个:
* 创建具有`API`范围的[个人访问令牌](../../profile/personal_access_tokens.html) .
* 导航到**设置> Webhooks**
* 添加 webhook URL,在这种情况下,它将在存储库更新后使用[Pull Mirror API](../../../api/projects.html#start-the-pull-mirroring-process-for-a-project-starter)请求触发即时提取.
```
https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
```
* 确保已选中" **推送事件"**复选框.
* 单击**添加 Webhook**按钮以保存**Webhook** .
* 要测试集成,请单击" **测试"**按钮,并确认 GitLab 不返回任何错误.
### Preventing conflicts using a `pre-receive` hook[](#preventing-conflicts-using-a-pre-receive-hook "Permalink")
**警告:**提议的解决方案将对 Git 推送操作的性能产生负面影响,因为它们将被代理到上游 Git 存储库.
服务器端`pre-receive`挂钩可通过仅在将提交首先推送到上游 Git 存储库之后才接受推送来防止上述竞争情况. 在此配置中,一个 Git 存储库充当权威的上游,另一个充当下游. `pre-receive`挂钩将安装在下游存储库中.
阅读有关在 GitLab 服务器上[配置服务器挂钩](../../../administration/server_hooks.html)的信息.
下面提供了一个样品`pre-receive`挂钩.
```
#!/usr/bin/env bash
# --- Assume only one push mirror target
# Push mirroring remotes are named `remote_mirror_<id>`, this finds the first remote and uses that.
TARGET_REPO=$(git remote | grep -m 1 remote_mirror)
proxy_push()
{
# --- Arguments
OLDREV=$(git rev-parse $1)
NEWREV=$(git rev-parse $2)
REFNAME="$3"
# --- Pattern of branches to proxy pushes
allowlist=$(expr "$branch" : "\(master\)")
case "$refname" in refs/heads/*)
branch=$(expr "$refname" : "refs/heads/\(.*\)")
if [ "$allowlist" = "$branch" ]; then unset GIT_QUARANTINE_PATH # handle https://git-scm.com/docs/git-receive-pack#_quarantine_environment
error="$(git push --quiet $TARGET_REPO $NEWREV:$REFNAME 2>&1)"
fail=$?
if [ "$fail" != "0" ]; then echo >&2 ""
echo >&2 " Error: updates were rejected by upstream server"
echo >&2 " This is usually caused by another repository pushing changes"
echo >&2 " to the same ref. You may want to first integrate remote changes"
echo >&2 ""
return
fi
fi
;;
esac
}
# Allow dual mode: run from the command line just like the update hook, or
# if no arguments are given then run as a hook script
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
# Output to the terminal in command line mode - if someone wanted to
# resend an email; they could redirect the output to sendmail
# themselves
PAGER= proxy_push $2 $3 $1
else
# Push is proxied upstream one ref at a time. Because of this it is possible
# for some refs to succeed, and others to fail. This will result in a failed
# push.
while read oldrev newrev refname
do proxy_push $oldrev $newrev $refname
done
fi
```
请注意,此示例有一些限制:
* 此示例可能无法完全满足您的用例,并且可能需要进行修改.
* 它不考虑镜像的不同类型的身份验证机制.
* 它不适用于强制更新(重写历史记录).
* 仅匹配`allowlist`模式的分支将被代理推送.
* 该脚本规避了 Git 钩子隔离环境,因为`$TARGET_REPO`的更新被视为参考更新,Git 会对此进行抱怨.
### Mirroring with Perforce Helix via Git Fusion[](#mirroring-with-perforce-helix-via-git-fusion-starter "Permalink")
**警告:**双向镜像不应用作永久配置. 有关替代的迁移方法,请参阅[从 Perforce Helix](../import/perforce.html)迁移.
[Git Fusion](https://www.perforce.com/manuals/git-fusion/#Git-Fusion/section_avy_hyc_gl.html)[Perforce Helix](https://www.perforce.com/products)提供了一个 Git 接口,GitLab 可以使用它来双向镜像 GitLab 项目. 从 Perforce Helix 迁移到 GitLab 的某些情况下,这可能是有用的,因为重叠的 Perforce Helix 工作区无法同时迁移到 GitLab.
如果将镜像与 Perforce Helix 一起使用,则应仅镜像受保护的分支. Perforce Helix 将拒绝任何重写历史记录的推送. 由于 Git Fusion 的性能限制,只应镜像最少数量的分支.
通过 Git Fusion 使用 Perforce Helix 配置镜像时,建议使用以下 Git Fusion 设置:
* `change-pusher`应禁用. 否则,每个提交都将被重写为由镜像帐户提交,而不是映射到现有的 Perforce Helix 用户或`unknown_git`用户.
* 如果 Perforce Helix 中不存在 GitLab 用户,则`unknown_git`用户将用作提交作者.
[在 Perforce.com 上](https://www.perforce.com/manuals/git-fusion/Content/Git-Fusion/section_vss_bdw_w3.html#section_zdp_zz1_3l)了解有关[Git Fusion 设置的信息](https://www.perforce.com/manuals/git-fusion/Content/Git-Fusion/section_vss_bdw_w3.html#section_zdp_zz1_3l) .
## Troubleshooting[](#troubleshooting "Permalink")
如果在推送过程中发生错误,则 GitLab 将在该存储库中显示"错误"突出显示. 然后,将鼠标悬停在突出显示的文本上,即可查看有关错误的详细信息.
### 13:Received RST_STREAM with error code 2 with GitHub[](#13received-rst_stream-with-error-code-2-with-github "Permalink")
如果在镜像到 GitHub 存储库时收到"错误代码为 2 的 13:Received RST_STREAM",则您的 GitHub 设置可能被设置为阻止推送,以暴露用于提交的电子邮件地址. 可以将您在 GitHub 上的电子邮件地址设置为公开,或者禁用[公开我的电子邮件](https://github.com/settings/emails)设置的" [阻止"命令行推送](https://github.com/settings/emails) .
\ No newline at end of file
# 减少仓库大小[](#减少仓库大小 "Permalink") # 减少仓库大小[](#reduce-repo-size "Permalink")
随着时间的流逝,Git 存储库变得越来越大. 将大文件加到 Git 存储库后: 代码仓库会随着时间变得越来越大,将大文件加到 Git 代码仓库后:
* 由于每个人都必须下载文件,因此获取存储库的速度变慢. * 由于每个人都必须下载文件,因此获取存储库的速度变慢
* 它们占用服务器上的大量存储空间. * 它们占用服务器上的大量存储空间
* [可以达到](#storage-limits) Git 仓库的存储限制. * [达到](#storage-limits) Git 仓库的存储限制
重写存储库可能会删除不需要的历史记录,从而使存储库更小. [`git filter-repo`](https://github.com/newren/git-filter-repo)是用于快速重写 Git 存储库历史记录的工具,建议同时使用以下两种工具: 重写代码仓库可能会删除不需要的历史记录,从而使代码仓库变得更小。[`git filter-repo`](https://github.com/newren/git-filter-repo)是用于快速重写 Git 存储库历史记录的工具,建议同时使用以下两种工具:
* [`git filter-branch`](https://git-scm.com/docs/git-filter-branch). * [`git filter-branch`](https://git-scm.com/docs/git-filter-branch).
* [BFG](https://rtyley.github.io/bfg-repo-cleaner/). * [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)消除此限制. **危险:**重写代码仓库历史记录是一种破坏性操作,在开始之前,请确保备份您的代码仓库。备份存储库的最佳方法是[导出项目](/docs/user/project/import.md#exporting-a-project-and-its-data)
## Purge files from repository history[](#purge-files-from-repository-history "Permalink") ## 在从代码仓库历史记录中净化文件[](#purge-files-from-repository-history "Permalink")
为了使克隆项目更快,请重写分支和标签以删除不需要的文件. 为了使克隆项目更快,建议重写分支和标签以删除不需要的文件。
1. 使用受支持的程序包管理器或从源代码[安装`git filter-repo`](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md) . 1. 使用受支持的程序包管理器或从源代码[安装`git filter-repo`](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md)
2. 使用`--bare`克隆存储库的新副本: 2. 使用`--bare`克隆代码仓库的新副本:
``` ```markdown
git clone --bare https://example.gitlab.com/my/project.git git clone --bare https://example.gitlab.com/my/project.git
``` ```
3. 使用`git filter-repo` ,从存储库的历史记录中清除所有文件. 3. 使用`git filter-repo` ,从代码仓库的历史记录中清除所有文件
要清除大文件,可以使用`--strip-blobs-bigger-than`选项: 要清除大文件,可以使用`--strip-blobs-bigger-than`选项:
``` ```markdown
git filter-repo --strip-blobs-bigger-than 10M git filter-repo --strip-blobs-bigger-than 10M
``` ```
要清除使用 Git LFS 存储的大文件,可以使用`--blob--callback`选项. 下面的示例使用回调从 Git LFS 指针读取文件大小,并删除大于 10MB 的文件
要清除使用 Git LFS 存储的大文件,可以使用`--blob--callback`选项. 下面的示例使用回调从 Git LFS 指针读取文件大小,并删除大于 10MB 的文件. ```markdown
```
git filter-repo --blob-callback ' git filter-repo --blob-callback '
if blob.data.startswith(b"version https://git-lfs.github.com/spec/v1"): if blob.data.startswith(b"version https://git-lfs.github.com/spec/v1"):
size_in_bytes = int.from_bytes(blob.data[124:], byteorder="big") size_in_bytes = int.from_bytes(blob.data[124:], byteorder="big")
...@@ -46,157 +45,143 @@ ...@@ -46,157 +45,143 @@
要按路径清除特定的大文件,可以组合使用`--path`和`--invert-paths`选项: 要按路径清除特定的大文件,可以组合使用`--path`和`--invert-paths`选项:
``` ```markdown
git filter-repo --path path/to/big/file.m4v --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)文档. 有关更多示例和完整文档,请参见[`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`会删除所有遥控器. 要为您的项目还原遥控器,请运行: 4. 运行`git filter-repo`会删除所有 remote,要为您的项目还原 remote,请运行:
``` ```markdown
git remote add origin https://example.gitlab.com/<namespace>/<project_name>.git git remote add origin https://codechina.csdn.net/<namespace>/<project_name>.git
``` ```
5. 强制推送更改以覆盖 GitLab 上的所有分支: 5. 强制推送更改以覆盖 CODEChina 上的所有分支:
``` ```markdown
git push origin --force --all git push origin --force --all
``` ```
[受保护的分支](../protected_branches.html)将导致此操作失败. 要继续,您必须删除分支保护,推送,然后重新启用受保护的分支. [受保护的分支](/docs/user/project/protected-branch.md)将导致此操作失败。要继续的话,您必须删除分支保护,推送,然后重新启用受保护的分支。
6. 要从标记的发行版中删除大文件,请强制将更改推送到 GitLab 上的所有标记: 6. 要从标记的 Release 中删除大文件,请强制将更改推送到CODEChina上的所有标记:
``` ```markdown
git push origin --force --tags git push origin --force --tags
``` ```
[受保护的标签](../protected_tags.html)将导致此操作失败. 要继续,您必须删除标签保护,推送,然后重新启用受保护的标签. [受保护的标签](../protected_tags.html)将导致此操作失败. 要继续,您必须删除标签保护,推送,然后重新启用受保护的标签.
7. 手动执行[项目整理](../../../administration/housekeeping.html#manual-housekeeping) 7. 手动执行项目整理
**注意:**为提高性能而缓存了项目统计信息. 您可能需要等待 5 到 10 分钟才能看到存储利用率下降. **注意:**为提高性能我们缓存了项目统计信息,您可能需要等待 5 到 10 分钟才能看到存储利用率下降。
## Purge files from GitLab storage[](#purge-files-from-gitlab-storage "Permalink") ## 在代码仓库中净化文件[](#purge-files-from-repo-storage "Permalink")
要减少 GitLab 中存储库的大小,必须删除 GitLab 内部引用以包含大文件的提交. 在完成这些步骤之前,请[从存储库历史记录中清除文件](#purge-files-from-repository-history) . 要减少代码仓库的大小,必须删除 CODEChina 内部引用包含大文件的提交。在完成这些步骤之前,请[从存储库历史记录中清除文件](#purge-files-from-repository-history) .
除了[分支](branches/index.html)和标签(这是一种 Git 引用)之外,GitLab 还会自动创建其他引用. 这些引用可防止在查看合并请求时死链接到提交或丢失差异. [存储库清理](#repository-cleanup)可用于从 GitLab 中删除它们. 除了[分支](/docs/user/project/repo/branches.md)和标签(这是一种 Git 引用)之外,系统还会自动创建其他引用,[代码仓库清理](#repository-cleanup)可用于从 CODEChina 中删除它们.
以下内部参考文献不做广告 以下为内部参考文献
* `refs/merge-requests/*`用于合并请求. * `refs/merge-requests/*`用于合并请求
* `refs/pipelines/*` for [pipelines](../../../ci/pipelines/index.html#troubleshooting-fatal-reference-is-not-a-tree). * `refs/pipelines/*` 用于 pipelines
* `refs/environments/*`用于环境. * `refs/environments/*`用于环境
这意味着在获取时通常不包含它们,这使得获取速度更快. 另外, `refs/keep-around/*`是隐藏的 refs,以防止与讨论相关的提交被删除并且根本无法被获取. 这意味着在获取时通常不包含它们,这使得获取速度更快。另外, `refs/keep-around/*`是隐藏的 refs,以防止与讨论相关的提交被删除并且根本无法被获取。但是,可以从项目导出内的 Git 捆绑包访问这些引用:
但是,可以从项目导出内的 Git 捆绑包访问这些引用. 1. 使用受支持的程序包管理器或从源代码[安装`git filter-repo`](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md)
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)并下载
2. [从项目中](../settings/import_export.html#exporting-a-project-and-its-data)生成一个新的[导出](../settings/import_export.html#exporting-a-project-and-its-data)并下载.
3. 使用`tar`解压缩备份: 3. 使用`tar`解压缩备份:
``` ```markdown
tar xzf project-backup.tar.gz tar xzf project-backup.tar.gz
``` ```
这将包含一个由[`git bundle`](https://git-scm.com/docs/git-bundle)创建的`project.bundle`文件. 这将包含一个由[`git bundle`](https://git-scm.com/docs/git-bundle)创建的`project.bundle`文件
4. 从包中克隆存储库的新副本: 4. 从包中克隆存储库的新副本:
``` ```markdown
git clone --bare --mirror /path/to/project.bundle git clone --bare --mirror /path/to/project.bundle
``` ```
5. 使用`git filter-repo` ,从存储库的历史记录中清除所有文件. 因为我们正在尝试删除内部引用,所以我们将依靠每次运行生成的`commit-map`来告诉我们要删除哪些内部引用. 5. 使用`git filter-repo` ,从代码仓库的历史记录中清除所有文件。因为我们正在尝试删除内部引用,所以我们将依靠每次运行生成的`commit-map`来告诉我们要删除哪些内部引用。
**注意:** `git filter-repo`每次运行都会创建一个新的`commit-map`文件,并覆盖前一次运行的`commit-map`
**注意:** `git filter-repo`每次运行都会创建一个新的`commit-map`文件,并覆盖前一次运行的`commit-map` . **每次**运行都将需要此文件. 每次运行`git filter-repo`都要执行下一步. **每次**运行都将需要此文件,每次运行`git filter-repo`都要执行下一步
要清除所有大文件,可以使用`--strip-blobs-bigger-than`选项: 要清除所有大文件,可以使用`--strip-blobs-bigger-than`选项:
``` ```markdown
git filter-repo --strip-blobs-bigger-than 10M git filter-repo --strip-blobs-bigger-than 10M
``` ```
要按路径清除特定的大文件,可以组合使用`--path`和`--invert-paths`选项. 要按路径清除特定的大文件,可以组合使用`--path`和`--invert-paths`选项
``` ```markdown
git filter-repo --path path/to/big/file.m4v --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)文档. 有关更多示例和完整文档,请参见[`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") 6. 运行[代码仓库清理](#repository-cleanup)
在 GitLab 11.6 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/19376) . ## 代码仓库清理[](#repository-cleanup "Permalink")
仓库清理允许您上传对象的文本文件,并且 GitLab 将删除对这些对象的内部 Git 引用. 您可以使用[`git filter-repo`](https://github.com/newren/git-filter-repo)生成对象列表(在`commit-map`文件中),该对象列表可与存储库清理一起使用. 代码仓库清理允许您上传对象的文本文件,并且 CODEChina 将删除对这些对象的内部 Git 引用。您可以使用[`git filter-repo`](https://github.com/newren/git-filter-repo)生成对象列表(在`commit-map`文件中),该对象列表可与存储库清理一起使用。
要清理存储库: 要清理代码仓库:
1. 转到存储库的项目. 1. 转到项目的代码仓库
2. 导航 **设置>存储库** . 2. 进入 **项目设置>仓库>仓库清理**
3. 上载对象列表. 例如,一个`commit-map`文件. 3. 上载对象列表,例如,一个`commit-map`文件
4. Click **开始清理**. 4. 点击**开始清理**
这将: 这将:
* 删除所有对旧提交的内部 Git 引用. * 删除所有对旧提交的内部 Git 引用
* 针对存储库运行`git gc` . * 针对存储库运行`git gc`
完成后,您将收到一封电子邮件. 完成后,您将收到一封电子邮件
When using repository cleanup, note: 当在使用代码仓库清理时,需要注意:
* 项目统计信息已缓存. 您可能需要等待 5 到 10 分钟才能看到存储利用率下降. * 项目统计信息已缓存,您可能需要等待 5 到 10 分钟才能看到存储利用率下降
* 客房部修剪 2 周以上的松散物品. 这意味着在最近 2 周内添加的对象将不会立即删除. 如果您有权访问[Gitaly](../../../administration/gitaly/index.html)服务器,则可以运行`git gc --prune=now`立即修剪所有松散的对象. * Housekeeping 会精简2周以上的松散物品,这意味着在最近 2 周内添加的对象将不会被立即删除
* 此过程将从 GitLab 的缓存和数据库中删除一些重写提交的副本,但是覆盖范围仍然存在许多空白,并且某些副本可能会无限期地存在. [清除实例缓存](../../../administration/raketasks/maintenance.html#clear-redis-cache)可能有助于删除其中的一些[实例](../../../administration/raketasks/maintenance.html#clear-redis-cache) ,但出于安全考虑,不应依赖它! * 此过程将从 CODEChina 的缓存和数据库中删除一些重写提交的副本,但是覆盖范围仍然存在许多空白,并且某些副本可能会无限期地存在
## Storage limits[](#storage-limits "Permalink") ## 仓库大小限制[](#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 对象. * 上载 LFS 对象
您仍然可以: 您仍然可以:
* 创造新问题. * 创造新问题
* 克隆项目. * 克隆项目
如果超出存储库大小限制,则可以尝试: 如果超出存储库大小限制,则可以尝试:
1. 删除一些数据. 1. 删除一些数据
2. 进行新的提交. 2. 进行新的提交
3. 推回存储库. 3. 推回代码仓库
也许您还可以: 也许您还可以:
* 将一些斑点移到 LFS. * 将一些 blob 移到 LFS
* 从历史记录中删除一些旧的依赖项更新. * 从历史记录中删除一些旧的依赖项更新
不幸的是,该工作流程无法正常工作. 实际上,在提交中删除文件并不会减小存储库的大小,因为早期的提交和 Blob 仍然存在.
您需要做的是重写历史记录. 我们建议使用开源社区维护的工具[`git filter-repo`](https://github.com/newren/git-filter-repo) .
**注意:**在 GitLab 端运行`git gc`之前,"已删除"的提交和 blob 仍将存在. 您还必须能够将重写的历史记录推送到 GitLab,如果您已经超过最大大小限制,则可能无法实现.
为了解除这些限制,自我管理的 GitLab 实例的管理员必须增加对超出它的特定项目的限制. 因此,最好始终主动保持在限制之下. 如果您达到了极限,并且无法暂时提高极限,则唯一的选择是:
1. 在本地修剪所有不需要的东西. 实际上,在提交中删除文件并不会减小存储库的大小,因为早期的提交和 Blob 仍然存在。
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. 您需要做的是重写历史记录,我们建议使用开源社区维护的工具[`git filter-repo`](https://github.com/newren/git-filter-repo)
\ No newline at end of file \ No newline at end of file
# 文件编辑[](#文件编辑 "Permalink") # 文件编辑[](#文件编辑 "Permalink")
有时,直接从 GitLab 界面进行快速更改要比克隆项目并使用 Gi​​t 命令行工具容易. 在此功能中,我们重点介绍如何从文件浏览器创建新文件,目录,分支或标记. 所有这些操作都可以通过一个下拉菜单获得. 有时,直接从 CODEChina 界面进行快速更改要比克隆项目并使用 Gi​​t 命令行工具更容易。接下来,我们重点介绍如何从文件浏览器创建新文件,目录,分支或标记,以上所有这些操作都可以通过一个下拉菜单获得。
## Create a file[](#create-a-file "Permalink") ## 创建文件[](#create-a-file "Permalink")
在项目的文件页面中,单击分支选择器右侧的" +"按钮. 从下拉列表中选择**新文件** . 在项目的文件页面中,单击分支下拉列表右侧的" +"按钮,从下拉列表中选择**新文件**
[![New file dropdown menu](img/149fa515778bea7ce86903f0c8d9b31f.png)](img/web_editor_new_file_dropdown.png) [![New file dropdown menu](/docs/img/web_editor_new_file_dropdown.png)](/docs/img/web_editor_new_file_dropdown.png)
" **文件名"**框中输入文件名. 然后,在编辑器区域中添加文件内容. 添加描述性提交消息并选择一个分支. 分支字段将默认为您在文件浏览器中查看的分支. 如果输入新的分支名称,将出现一个复选框,允许您在提交更改后启动新的合并请求. **文件名**框中输入文件名,然后在编辑器区域中添加文件内容;添加描述性提交消息并选择一个分支,分支字段将默认为您在文件浏览器中查看的分支;如果输入新的分支名称,将出现一个复选框,允许您在提交更改后启动新的合并请求。
当您对新文件感到满意时,请单击底部的" **提交更改** ". 当您完成新文件的内容后,请单击底部的" **提交更改** "。
[![Create file editor](img/07e4663db45be7313a205a17ec342edb.png)](img/web_editor_new_file_editor.png) ### 文件模板[](#template-dropdowns "Permalink")
### Template dropdowns[](#template-dropdowns "Permalink") 启动新项目时,新项目可能也需要一些通用文件,CODEChina 将在仓库中提示您新建这些文件。
启动新项目时,新项目可能也需要一些通用文件. 因此,GitLab 将显示一条消息,以简化您的操作. [![First file for your project](/docs/img/web_editor_template_dropdown_first_file.png)](/docs/img/web_editor_template_dropdown_first_file.png)
[![First file for your project](img/1e0213e85ced3ac9dcc079f0e1831068.png)](img/web_editor_template_dropdown_first_file.png) 当单击`LICENSE``.gitignore`等时,将显示一个下拉列表,为您提供适合您的项目的模板。
当单击`LICENSE``.gitignore`等时,将显示一个下拉列表,为您提供适合您的项目的模板. [![MuLan license selected](/docs/img/web_editor_template_dropdown_mulan_license.png)](/docs/img/web_editor_template_dropdown_mulan_license.png)
[![MIT license selected](img/097706015c4d2abaaf34d0782cfac635.png)](img/web_editor_template_dropdown_mit_license.png) 许可证,更新日志,贡献指南等文件也都可以通过项目页面上的按钮添加。
许可证, `.gitlab-ci.yml`日志,贡献指南或`.gitlab-ci.yml`文件也可以通过项目页面上的按钮添加. 在下面的示例中,许可证已经创建,这将创建指向许可证本身的链接. ## 上传文件[](#upload-a-file "Permalink")
[![New file button](img/adc0d64a6c4c1979d43d8bf1d8d485e8.png)](img/web_editor_template_dropdown_buttons.png) 当内容为文本时,创建文件将十分方便。但是,这不适用于二进制数据,例如图像,PDF 或其他文件类型,在这种情况下,您可以选择上传文件。
> **Note:** The **设置 CI / CD** button will not appear on an empty repository. You have to at least add a file in order for the button to show up. 在项目的文件页面中,单击分支下拉列表右侧的" +"按钮,从下拉菜单中选择**上传文件**
## Upload a file[](#upload-a-file "Permalink") 弹出上传对话框后,有两种方法可以上传文件:可以在弹出窗口中拖放文件;也可以使用**点击上传**链接,选择要上传的文件后,将显示文件预览。
当内容为文本时,创建文件的能力非常出色. 但是,这不适用于二进制数据,例如图像,PDF 或其他文件类型. 在这种情况下,您需要上传文件. 输入提交消息,选择一个分支,并在准备好后单击**上传文件**
在项目的文件页面中,单击分支选择器右侧的" +"按钮. 从下拉菜单中选择上**载文件** . ## 新建目录[](#create-a-directory "Permalink")
[![Upload file dropdown menu](img/671787cdf6cd1dde3e748fae72d46779.png)](img/web_editor_upload_file_dropdown.png) 为了使代码仓库中的文件井井有条,您可以创建一个目录将相关的文件都归类到同一个目录中。
弹出上传对话框后,有两种方法可以上传文件. 可以在弹出窗口中拖放文件,也可以使用**点击上传**链接. 选择要上传的文件后,将显示文件预览. 在项目的文件页面中,单击分支下拉列表右侧的" + "号,从下拉菜单中选择 **新建目录**
输入提交消息,选择一个分支,并在准备好后单击"上**载文件"** . 在新目录对话框中,输入目录名称,提交消息并选择目标分支,单击**创建目录**完成新建目录操作。
[![Upload file dialog](img/2ed1719eefb651778ccd248f0bbe577c.png)](img/web_editor_upload_file_dialog.png) ## 新建分支[](#create-a-new-branch "Permalink")
## Create a directory[](#create-a-directory "Permalink") 有多种方法可从 CODEChina 的界面创建分支。
为了使档案库中的文件井井有条,创建一个新目录通常会很有帮助. ### 从 Issue 创建一个新分支[](#create-a-new-branch-from-an-issue "Permalink")
在项目的文件页面中,单击分支选择器右侧的加号按钮( `+` ). 从下拉菜单中选择" **新建目录** ". 如果您的开发工作流程要求每个合并请求都存在 Issue,则可以直接从该 Issue 快速创建分支,以加快流程。新分支及其以后的合并请求将被标记为与此问题相关,合并后将自动关闭 Issue。您可以在 Issue 说明下方看到 **创建合并请求**下拉列表。
[![New directory dropdown](img/c65afb6da67de7dea9950e2b151cca40.png)](img/web_editor_new_directory_dropdown.png) **注意:**如果已经有一个具有相同名称的分支或一个引用的合并请求,或者您的项目具有活动的 Fork 关系,则不会看到 **创建合并请求**按钮。如果您想显示此按钮,则可能的解决方法是删除项目的 fork 关系,删除后,Fork 关系将无法恢复,您将不再能够将合并请求发送到源仓库。
在新目录对话框中,输入目录名称,提交消息并选择目标分支. 单击**创建目录**以完成. 该下拉列表包含选项**创建合并请求和分支**以及**创建分支**
[![New directory dialog](img/0b804819bf30ce8e657ad538d376ecc5.png)](img/web_editor_new_directory_dialog.png) [![New Branch Button](/docs/img/web_editor_new_branch_from_issue_v_12_6.png)](/docs/img/web_editor_new_branch_from_issue_v_12_6.png)
## Create a new branch[](#create-a-new-branch "Permalink") 选择这些选项之一后,将基于项目的默认分支(默认为`master`创建新的分支或分支与合并请求. 分支名称将基于 Issue 的标题,并作为前缀具有其内部 ID。因此,上面的示例屏幕快照将创建一个名为`1-webpack`的分支。
有多种方法可从 GitLab 的 Web 界面创建分支. 当您在一个空的项目中单击**创建分支**按钮时,CODEChina 会自动创建一个`master`分支, `README.md`提交一个空白的`README.md`文件,并根据 Issue 标题创建并将您重定向到新分支(如果您的项目已经配置了)。
### Create a new branch from an issue[](#create-a-new-branch-from-an-issue "Permalink") 创建分支后,您可以编辑代码仓库中的文件以解决此 Issue。当基于新创建的分支创建合并请求时,描述字段将自动显示[ Issue 关闭模式](/docs/user/project/issues/manage.md#closing-issues-automatically) `Closes #ID` ,其中`ID`为 Issue 的 ID,一旦合并请求被合并, Issue 将自动关闭。
在 GitLab 8.6 中[引入](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/2808) . ### 从项目页新建分支[](#create-a-new-branch-from-a-projects-dashboard "Permalink")
如果您的开发工作流程要求每个合并请求都存在问题,则可以直接从该问题快速创建分支,以加快流程. 新分支及其以后的合并请求将被标记为与此问题相关. 合并后,MR 将自动关闭问题. 您可以在问题说明下方看到" **创建合并请求"**下拉列表. 如果要在创建新的合并请求之前对多个文件进行更改,则可以预先创建一个新的分支。在项目页的" + "号下拉列表中选择 **新建分支** "。
**注意:**如果已经有一个具有相同名称的分支或一个引用的合并请求,或者您的项目具有活动的派生关系,则不会看到" **创建合并请求"**按钮. 如果您想显示此按钮,则可能的解决方法是[删除项目的 fork 关系](../settings/index.html#removing-a-fork-relationship) . 删除后,派生关系将无法恢复,您将不再能够将合并请求发送到源. [![New branch dropdown](/docs/img/web_editor_new_branch_dropdown.png)](/docs/img/web_editor_new_branch_dropdown.png)
[![Create Button](img/ab48b86f7a0dfe92d4358f705bf938a8.png)](img/web_editor_new_branch_from_issue_create_button_v12_6.png) 输入新的**分支名称** ,更改**从模板创建**字段以选择该新分支将来自哪个分支、标记或提交 SHA(可选)。如果您开始键入现有的分支或标签,则此字段将自动完成。单击**创建分支** ,您将返回到该新分支上的文件列表页。
该下拉列表包含选项**创建合并请求和分支**以及**创建分支** . [![New branch page](/docs/img/web_editor_new_branch_page.png)](/docs/img/web_editor_new_branch_page.png)
[![New Branch Button](img/2f78c411d32ee05e95a1984ef90b2356.png)](img/web_editor_new_branch_from_issue_v_12_6.png) 现在,您可以根据需要更改任何文件。当您准备好将更改合并回 master 分支时,可以使用页面顶部的"创建合并请求"按钮,在创建分支或修改文件后,该按钮将会在页面显示一段时间。
选择这些选项之一后,将基于项目的默认分支(默认为`master`创建新的分支或分支与合并请求. 分支名称将基于问题的标题,并作为前缀具有其内部 ID. 因此,上面的示例屏幕快照将创建一个名为`2-make-static-site-auto-deploy-and-serve`的分支. ## 新建 Tag[](#create-a-new-tag "Permalink")
当您在一个空的存储库项目中单击**创建分支**按钮时,GitLab 会自动创建一个`master`分支, `README.md`提交一个空白的`README.md`文件,并根据问题标题创建并将您重定向到新分支. 如果您的[项目已经配置了](../integrations/overview.html) Kubernetes 等[部署服务](../integrations/overview.html) ,则 GitLab 会更进一步,并通过帮助您创建`.gitlab-ci.yml`文件来提示您设置[自动部署](../../../topics/autodevops/stages.html#auto-deploy) . Tag 可用于标记主要的里程碑,例如 Release 版本,候选版本等等。您可以从分支或提交 SHA 创建 Tag,在项目的文件页面上,从下拉列表中选择" **新建标签** "。
创建分支后,您可以编辑存储库中的文件以解决此问题. 当基于新创建的分支创建合并请求时,描述字段将自动显示[问题关闭模式](../issues/managing_issues.html#closing-issues-automatically) `Closes #ID` ,其中`ID`为问题的 ID. 一旦合并请求被合并,这将解决问题. 给标签起一个名字,例如`v1.0.0` 。选择您要从中创建此新标签的分支或 SHA,您可以选择添加一条消息及 Release说明(可选),发行说明支持 Markdown 格式,您也可以上传附件。单击**创建标签** ,创建成功后将返回标签列表页。
### Create a new branch from a project’s dashboard[](#create-a-new-branch-from-a-projects-dashboard "Permalink") ## 提示[](#tips "Permalink")
如果要在创建新的合并请求之前对多个文件进行更改,则可以预先创建一个新的分支. 在项目的文件页面上,从下拉列表中选择" **新建分支** ". 创建或上传新文件或创建新目录时,均可触发新的合并请求,而不是直接提交给 master。在**目标分支**字段中输入新的分支名称,您会注意到出现一个复选框,标有**通过这些更改启动新的合并请求** ,提交更改后,您将进入新的合并请求表单。
[![New branch dropdown](img/83a4859fc1c1d9fc2ea68819a53eaea8.png)](img/web_editor_new_branch_dropdown.png) 如果你*不*希望使用您的主电子邮件地址通过 Web 编辑器创建的提交,您可以从**用户设置>编辑个人资料**页面选择使用其他的链接的电子邮件地址。
\ No newline at end of file
输入新的**分支名称** . (可选)更改" **创建自"**字段以选择该新分支将来自哪个分支,标记或提交 SHA. 如果您开始键入现有的分支或标签,则此字段将自动完成. 单击**创建分支** ,您将返回到该新分支上的文件浏览器.
[![New branch page](img/dc5fe88e82dc925a618598e1ac284f39.png)](img/web_editor_new_branch_page.png)
现在,您可以根据需要更改任何文件. 当您准备好将更改合并回母版时,可以使用屏幕顶部的小部件. 在创建分支或修改文件后,此窗口小部件仅显示一段时间.
[![New push widget](img/2279c6b38c41208a2726d04b0df15c37.png)](img/web_editor_new_push_widget.png)
## Create a new tag[](#create-a-new-tag "Permalink")
标签可用于标记主要的里程碑,例如生产版本,候选版本等等. 您可以从分支或提交 SHA 创建标签. 在项目的文件页面上,从下拉列表中选择" **新建标签** ".
[![New tag dropdown](img/a8ac57717b491533848b3ebca40aae86.png)](img/web_editor_new_tag_dropdown.png)
给标签起一个名字,例如`v1.0.0` . 选择您要从中创建此新标签的分支或 SHA. 您可以选择添加一条消息和发行说明. 发行说明部分支持 Markdown 格式,您也可以上传附件. 单击**创建标签** ,您将被带到标签列表页面.
[![New tag page](img/36d97eaa1e64c3f6d5b78d205d1ce881.png)](img/web_editor_new_tag_page.png)
## Tips[](#tips "Permalink")
创建或上载新文件或创建新目录时,可以触发新的合并请求,而不是直接提交给 master. 在**目标分支**字段中输入新的分支名称. 您会注意到出现一个复选框,标**有"通过这些更改启动新的合并请求"** . 提交更改后,您将进入新的合并请求表单.
[![Start a new merge request with these changes](img/f293e9e73b2cf8c4ef278104fbd068d5.png)](img/web_editor_start_new_merge_request.png)
如果你*不*希望使用您的主电子邮件地址通过 Web 编辑器创建的提交,您可以选择使用其他的链接的电子邮件地址的从**用户设置>编辑个人资料**页面.
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册