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

从远程仓库拉取

  • Tier: Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

即使仓库没有托管在 GitLab 上,你也可以使用 GitLab 界面浏览其内容和活动。创建一个拉取 mirror 来将上游仓库的分支、标签和提交复制到你的仓库中。

push mirrors 不同,拉取镜像会按计划从上游(远程)仓库获取变更。为防止镜像与上游仓库产生分歧,不要直接向下拉取镜像推送提交。应该将提交推送到上游仓库。远程仓库的变更会被拉取到 GitLab 仓库中:

UI 和 API 更新受默认的 pull mirroring intervals (5 分钟)限制。此间隔可以在 GitLab Self-Managed 实例上进行配置。

默认情况下,如果下游拉取镜像中的任何分支或标签与本地仓库产生分歧,GitLab 会停止更新该分支。这可以防止数据丢失。上游仓库中被删除的分支和标签不会反映在下游仓库中。

从下游拉取镜像仓库中删除,但仍存在于上游仓库中的项目,会在下次拉取时恢复。例如:仅在镜像仓库中删除的分支会在下次拉取后重新出现。

拉取镜像的工作原理

将 GitLab 仓库配置为拉取镜像后:

  1. GitLab 将仓库添加到队列中。
  2. 每分钟一次,Sidekiq cron 作业会根据以下条件安排仓库镜像更新:
    • 可用容量,由 Sidekiq 设置决定。对于 GitLab.com,请阅读 GitLab.com Sidekiq 设置
    • 队列中已有多少镜像等待更新。是否到期取决于仓库镜像上次更新的时间,以及更新重试的次数。
  3. 当 Sidekiq 可用于处理更新时,镜像会被更新。如果更新过程:
    • 成功:再次安排更新,至少等待 30 分钟。
    • 失败:稍后重试更新。经过 14 次失败后,镜像会被标记为 hard failure 并且不再被安排更新。分支与其上游对应分支产生分歧可能导致失败。为防止分支产生分歧,在创建镜像时配置 Overwrite diverged branches

配置拉取镜像

先决条件:

  1. 在左侧边栏,选择 Search or go to 并找到你的项目。

  2. 选择 Settings > Repository

  3. 展开 Mirroring repositories

  4. 输入 Git repository URL

    要镜像 gitlab 仓库,请使用 gitlab.com:gitlab-org/gitlab.githttps://gitlab.com/gitlab-org/gitlab.git

  5. Mirror direction 中,选择 Pull

  6. Authentication method 中,选择你的认证方法。更多信息,请参阅 镜像的认证方法

  7. 选择你需要的任何选项:

  8. 要保存配置,选择 Mirror repository

覆盖分歧分支

即使分支已经与远程版本产生分歧,也要始终用远程版本更新本地分支,请在创建镜像时选择 Overwrite diverged branches

对于镜像分支,启用此选项会导致本地变更丢失。

为镜像更新触发流水线

你可以配置镜像,在远程仓库更新分支或标签时自动触发流水线。在启用此功能前:

  • 确保你的 CI runner 能够处理来自远程仓库活动的额外负载。

  • 考虑安全影响。流水线使用拉取镜像的凭据并运行未经审查的代码。

    仅为你自己的项目或具有可信维护者的项目启用此功能。

使用 API 触发更新

拉取镜像使用轮询来检测上游新增的分支和提交,通常会有几分钟的延迟。你可以使用 API 调用 通知 GitLab,但仍会强制执行 拉取镜像的最小间隔限制

更多信息,请阅读 为项目启动拉取镜像流程

修复镜像时的硬性失败

经过 14 次连续不成功的重试后,镜像过程会被标记为硬性失败,并且镜像尝试停止。此失败在以下位置可见:

  • 项目的主仪表板。
  • 拉取镜像设置页面。

要恢复项目镜像,强制更新

如果多个项目受此问题影响,例如在长时间的网络或服务器中断后,你可以使用 Rails console 通过以下命令识别并更新所有受影响的项目:

Project.find_each do |p|
  if p.import_state && p.import_state.retry_count >= 14
    puts "Resetting mirroring operation for #{p.full_path}"
    p.import_state.reset_retry_count
    p.import_state.set_next_execution_to_now(prioritized: true)
    p.import_state.save!
  end
end

相关主题