仓库镜像
- 层级:Free, Premium, Ultimate
- 提供方式:GitLab.com, GitLab Self-Managed, GitLab Dedicated
您可以将仓库镜像到外部源,也可以从外部源镜像。您可以指定哪个仓库作为源仓库。分支、标签和提交会自动同步。
存在多种镜像方法:
在以下情况下镜像仓库:
- 您项目的权威版本已迁移到 GitLab。为了在旧位置继续提供项目副本,请将您的 GitLab 仓库配置为 推送镜像。您在 GitLab 仓库中所做的更改会被复制到旧位置。
- 您的 GitLab 实例是私有的,但您想开源一些项目。
- 您已迁移到 GitLab,但项目的权威版本在其他地方。请将您的 GitLab 仓库配置为其他项目的 拉取镜像。您的 GitLab 仓库会拉取项目的提交、标签和分支的副本。它们在 GitLab 上即可使用。
以下功能不受支持:
- SCP 格式的 URL。实现 SCP 格式 URL 的工作正在进行中。 更多信息及进度跟踪,请参见 问题 18993。
- 通过 dumb HTTP 协议 镜像仓库。
创建仓库镜像
先决条件:
- 您必须拥有项目的 Maintainer(维护者)角色或更高权限。
- 如果您的镜像通过
ssh://连接,服务器上必须能够检测到主机密钥,或者您必须拥有密钥的本地副本。
-
在左侧边栏,选择 搜索或跳转 并找到您的项目。
-
选择 设置 > 仓库。
-
展开 仓库镜像。
-
选择 添加新镜像。
-
输入 Git 仓库 URL。仓库必须可通过
http://、https://、ssh://或git://访问。 -
如果您输入了
ssh://URL,请选择以下任一选项:- 检测主机密钥:GitLab 从服务器获取主机密钥并显示指纹。
- 手动输入主机密钥,并将主机密钥输入到 SSH 主机密钥 字段中。
镜像仓库时,GitLab 会在连接前确认至少有一个存储的主机密钥匹配。此检查可保护您的镜像免受恶意代码注入,或防止密码被盗。
- 要创建使用 SSH 认证的仓库镜像,请参见 以下示例。
-
选择 认证方法。更多信息,请参见 镜像的认证方法。
-
如果您使用 SSH 主机密钥进行认证,请 验证主机密钥 以确保其正确。
-
为防止强制推送已分化的引用,请选择 保留分化的引用。更多信息,请参见 保留分化的引用。
-
可选。要限制镜像的分支数量,请选择 仅镜像受保护的分支 或在 镜像特定分支 中输入正则表达式。
-
选择 镜像仓库。
示例:使用 SSH 认证创建镜像
如果您选择 SSH 公钥 作为认证方法,GitLab 会为您的 GitLab 仓库生成一个公钥。您必须将此密钥提供给非 GitLab 服务器。更多信息,请参见 获取您的 SSH 公钥。
要使用 SSH 认证镜像仓库:
- 在左侧边栏,选择 搜索或跳转 并找到您的项目。
- 选择 设置 > 仓库。
- 展开 仓库镜像。
- 选择 添加新镜像。
- 输入 Git 仓库 URL。提供以下格式的 URL:
ssh://gitlab.com/gitlab-org/gitlab.git - 选择 镜像方向。更多信息,请参见 拉取镜像 和 推送镜像。
- 选择 检测主机密钥 或 手动输入主机密钥。
- 在 认证方法 字段中,选择 SSH 公钥。
- 在 用户名 字段中,添加
git。 - 可选。配置 镜像用户 和 镜像分支 设置。
- 选择 镜像仓库。
- 复制 SSH 公钥并将其提供给您的非 GitLab 服务器。
仅镜像受保护的分支
您可以选择仅镜像镜像项目中的 受保护的分支,无论是从远程仓库镜像到本地,还是从本地镜像到远程仓库。对于 拉取镜像,镜像项目中的非受保护分支不会被镜像,并且可能分化。
要使用此选项,在创建仓库镜像时选择 仅镜像受保护的分支。
镜像特定分支
- 层级:Premium, Ultimate
- 提供方式:GitLab.com, GitLab Self-Managed, GitLab Dedicated
要仅镜像名称匹配 re2 正则表达式 的分支,请在 镜像特定分支 字段中输入正则表达式。名称不匹配正则表达式的分支不会被镜像。
更新镜像
当镜像仓库更新时,所有新的分支、标签和提交都会在项目的活动提要中可见。GitLab 上的仓库镜像会自动更新。您也可以手动触发更新:
- 在 GitLab.com 上最多每五分钟一次。
- 根据 GitLab 自托管实例上管理员设置的 拉取镜像间隔限制。
GitLab 静默模式 会禁用推送和拉取更新。
强制更新
虽然镜像计划自动更新,但您可以强制立即更新,除非:
- 镜像正在更新中。
- 自上次更新后,拉取镜像限制的间隔(秒) 尚未过去。
先决条件:
- 您必须拥有项目的 Maintainer(维护者)角色或更高权限。
- 在左侧边栏,选择 搜索或跳转 并找到您的项目。
- 选择 设置 > 仓库。
- 展开 仓库镜像。
- 滚动到 已镜像的仓库 并标识要更新的镜像。
- 选择 立即更新( )。
镜像的认证方法
创建镜像时,您必须为其配置认证方法。GitLab 支持以下认证方法:
- SSH 认证。
- 用户名和密码。
对于 项目访问令牌 或 组访问令牌, 请使用用户名(不是令牌名称)和令牌作为密码。
SSH 认证
SSH 认证是双向的:
- 您必须向服务器证明您有权访问仓库。
- 服务器也必须向您证明它确实是其所声称的身份。
对于 SSH 认证,您提供凭据作为密码或公钥。其他仓库所在的服务器提供其凭据作为主机密钥。您必须手动 验证此主机密钥的指纹。
如果您通过 SSH 镜像(使用 ssh:// URL),您可以使用以下方式认证:
- 基于密码的认证,就像通过 HTTPS 一样。
- 公钥认证。此方法通常比密码认证更安全,特别是当其他仓库支持 部署密钥 时。
获取您的 SSH 公钥
当您镜像仓库并选择 SSH 公钥 作为认证方法时,GitLab 会为您生成一个公钥。非 GitLab 服务器需要此密钥来与您的 GitLab 仓库建立信任。要复制您的 SSH 公钥:
- 在左侧边栏,选择 搜索或跳转 并找到您的项目。
- 选择 设置 > 仓库。
- 展开 仓库镜像。
- 滚动到 已镜像的仓库。
- 识别正确的仓库,然后选择 复制 SSH 公钥( )。
- 将公钥 SSH 添加到其他仓库的配置中:
- 如果其他仓库托管在 GitLab 上,请将公钥 SSH 添加为 部署密钥。
- 如果其他仓库托管在其他地方,请将密钥添加到您用户的
authorized_keys文件中。将整个公钥 SSH 粘贴到文件中的单独一行并保存它。
如果您必须随时更改密钥,可以移除并重新添加镜像以生成新密钥。使用新密钥更新其他仓库以保持镜像运行。
生成的密钥存储在 GitLab 数据库中,而不是文件系统中。因此,镜像的 SSH 公钥认证不能在 pre-receive hook 中使用。
验证主机密钥
使用主机密钥时,请始终验证指纹与您期望的匹配。GitLab.com 和其他代码托管站点会发布其指纹供您检查:
其他提供商各不相同。如果您满足以下条件,可以使用以下命令安全地收集密钥指纹:
- 运行 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 [email protected] (ECDSA)
256 MD5:e6:eb:45:8a:3c:59:35:5f:e9:5b:80:12:be:7e:22:73 [email protected] (ED25519)
2048 MD5:3f:72:be:3d:62:03:5c:62:83:e8:6e:14:34:3a:85:1d [email protected] (RSA)旧版本的 SSH 可能需要您从命令中移除 -E md5。