Help us learn about your current experience with the documentation. Take the survey.

仓库镜像

  • 层级:Free, Premium, Ultimate
  • 提供方式:GitLab.com, GitLab Self-Managed, GitLab Dedicated

您可以将仓库镜像到外部源,也可以从外部源镜像。您可以指定哪个仓库作为源仓库。分支、标签和提交会自动同步。

存在多种镜像方法:

  • 推送:将 GitLab 仓库镜像到其他位置。
  • 拉取:从其他位置镜像仓库。在 Premium 和 Ultimate 层级可用。
  • 双向 镜像也可用,但可能导致冲突。

在以下情况下镜像仓库:

  • 您项目的权威版本已迁移到 GitLab。为了在旧位置继续提供项目副本,请将您的 GitLab 仓库配置为 推送镜像。您在 GitLab 仓库中所做的更改会被复制到旧位置。
  • 您的 GitLab 实例是私有的,但您想开源一些项目。
  • 您已迁移到 GitLab,但项目的权威版本在其他地方。请将您的 GitLab 仓库配置为其他项目的 拉取镜像。您的 GitLab 仓库会拉取项目的提交、标签和分支的副本。它们在 GitLab 上即可使用。

以下功能不受支持:

  • SCP 格式的 URL。实现 SCP 格式 URL 的工作正在进行中。 更多信息及进度跟踪,请参见 问题 18993
  • 通过 dumb HTTP 协议 镜像仓库。

创建仓库镜像

先决条件:

  • 您必须拥有项目的 Maintainer(维护者)角色或更高权限。
  • 如果您的镜像通过 ssh:// 连接,服务器上必须能够检测到主机密钥,或者您必须拥有密钥的本地副本。
  1. 在左侧边栏,选择 搜索或跳转 并找到您的项目。

  2. 选择 设置 > 仓库

  3. 展开 仓库镜像

  4. 选择 添加新镜像

  5. 输入 Git 仓库 URL。仓库必须可通过 http://https://ssh://git:// 访问。

  6. 选择 镜像方向。更多信息,请参见 拉取镜像推送镜像

  7. 如果您输入了 ssh:// URL,请选择以下任一选项:

    • 检测主机密钥:GitLab 从服务器获取主机密钥并显示指纹。
    • 手动输入主机密钥,并将主机密钥输入到 SSH 主机密钥 字段中。

    镜像仓库时,GitLab 会在连接前确认至少有一个存储的主机密钥匹配。此检查可保护您的镜像免受恶意代码注入,或防止密码被盗。

    • 要创建使用 SSH 认证的仓库镜像,请参见 以下示例
  8. 选择 认证方法。更多信息,请参见 镜像的认证方法

  9. 如果您使用 SSH 主机密钥进行认证,请 验证主机密钥 以确保其正确。

  10. 为防止强制推送已分化的引用,请选择 保留分化的引用。更多信息,请参见 保留分化的引用

  11. 可选。要限制镜像的分支数量,请选择 仅镜像受保护的分支 或在 镜像特定分支 中输入正则表达式。

  12. 选择 镜像仓库

示例:使用 SSH 认证创建镜像

如果您选择 SSH 公钥 作为认证方法,GitLab 会为您的 GitLab 仓库生成一个公钥。您必须将此密钥提供给非 GitLab 服务器。更多信息,请参见 获取您的 SSH 公钥

要使用 SSH 认证镜像仓库:

  1. 在左侧边栏,选择 搜索或跳转 并找到您的项目。
  2. 选择 设置 > 仓库
  3. 展开 仓库镜像
  4. 选择 添加新镜像
  5. 输入 Git 仓库 URL。提供以下格式的 URL:ssh://gitlab.com/gitlab-org/gitlab.git
  6. 选择 镜像方向。更多信息,请参见 拉取镜像推送镜像
  7. 选择 检测主机密钥手动输入主机密钥
  8. 认证方法 字段中,选择 SSH 公钥
  9. 用户名 字段中,添加 git
  10. 可选。配置 镜像用户镜像分支 设置。
  11. 选择 镜像仓库
  12. 复制 SSH 公钥并将其提供给您的非 GitLab 服务器。

仅镜像受保护的分支

您可以选择仅镜像镜像项目中的 受保护的分支,无论是从远程仓库镜像到本地,还是从本地镜像到远程仓库。对于 拉取镜像,镜像项目中的非受保护分支不会被镜像,并且可能分化。

要使用此选项,在创建仓库镜像时选择 仅镜像受保护的分支

镜像特定分支

  • 层级:Premium, Ultimate
  • 提供方式:GitLab.com, GitLab Self-Managed, GitLab Dedicated

要仅镜像名称匹配 re2 正则表达式 的分支,请在 镜像特定分支 字段中输入正则表达式。名称不匹配正则表达式的分支不会被镜像。

更新镜像

当镜像仓库更新时,所有新的分支、标签和提交都会在项目的活动提要中可见。GitLab 上的仓库镜像会自动更新。您也可以手动触发更新:

  • 在 GitLab.com 上最多每五分钟一次。
  • 根据 GitLab 自托管实例上管理员设置的 拉取镜像间隔限制

GitLab 静默模式 会禁用推送和拉取更新。

强制更新

虽然镜像计划自动更新,但您可以强制立即更新,除非:

先决条件:

  • 您必须拥有项目的 Maintainer(维护者)角色或更高权限。
  1. 在左侧边栏,选择 搜索或跳转 并找到您的项目。
  2. 选择 设置 > 仓库
  3. 展开 仓库镜像
  4. 滚动到 已镜像的仓库 并标识要更新的镜像。
  5. 选择 立即更新 retry )。

镜像的认证方法

创建镜像时,您必须为其配置认证方法。GitLab 支持以下认证方法:

对于 项目访问令牌组访问令牌, 请使用用户名(不是令牌名称)和令牌作为密码。

SSH 认证

SSH 认证是双向的:

  • 您必须向服务器证明您有权访问仓库。
  • 服务器也必须向您证明它确实是其所声称的身份。

对于 SSH 认证,您提供凭据作为密码或公钥。其他仓库所在的服务器提供其凭据作为主机密钥。您必须手动 验证此主机密钥的指纹

如果您通过 SSH 镜像(使用 ssh:// URL),您可以使用以下方式认证:

  • 基于密码的认证,就像通过 HTTPS 一样。
  • 公钥认证。此方法通常比密码认证更安全,特别是当其他仓库支持 部署密钥 时。

获取您的 SSH 公钥

当您镜像仓库并选择 SSH 公钥 作为认证方法时,GitLab 会为您生成一个公钥。非 GitLab 服务器需要此密钥来与您的 GitLab 仓库建立信任。要复制您的 SSH 公钥:

  1. 在左侧边栏,选择 搜索或跳转 并找到您的项目。
  2. 选择 设置 > 仓库
  3. 展开 仓库镜像
  4. 滚动到 已镜像的仓库
  5. 识别正确的仓库,然后选择 复制 SSH 公钥 copy-to-clipboard )。
  6. 将公钥 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 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

相关主题