{{< details >}}

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署

{{< /details >}}

合并请求差异是与合并请求相关的差异的大小受限副本。在查看合并请求时,差异尽可能从这些副本中获取,以优化性能。

默认情况下,合并请求差异存储在名为 merge_request_diff_files 的数据库表中。对于较大的安装,可能会发现该表增长过大,这种情况下,建议切换到外部存储。

合并请求差异可以存储为:

使用外部存储

{{< tabs >}}

{{< tab title=”Linux package (Omnibus)” >}}

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 外部差异存储在 /var/opt/gitlab/gitlab-rails/shared/external-diffs 中。要更改路径,例如更改为 /mnt/storage/external-diffs,请编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['external_diffs_storage_path'] = "/mnt/storage/external-diffs"
    
  3. 保存文件并重新配置极狐GitLab 以使更改生效。极狐GitLab 然后将现有的合并请求差异迁移到外部存储。

{{< /tab >}}

{{< tab title=”Self-compiled (source)” >}}

  1. 编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下行:

    external_diffs:
      enabled: true
    
  2. 外部差异存储在 /home/git/gitlab/shared/external-diffs 中。要更改路径,例如更改为 /mnt/storage/external-diffs,请编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下行:

    external_diffs:
      enabled: true
      storage_path: /mnt/storage/external-diffs
    
  3. 保存文件并重启极狐GitLab 以使更改生效。极狐GitLab 然后将现有的合并请求差异迁移到外部存储。

{{< /tab >}}

{{< /tabs >}}

使用对象存储

{{< alert type=”warning” >}}

迁移到对象存储是不可逆的。

{{< /alert >}}

我们推荐使用类似 AWS S3 的对象存储来代替在磁盘上存储外部差异。此配置依赖于已经配置好的有效 AWS 凭证。

{{< tabs >}}

{{< tab title=”Linux package (Omnibus)” >}}

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['external_diffs_enabled'] = true
    
  2. 设置对象存储设置
  3. 保存文件并重新配置极狐GitLab 以使更改生效。极狐GitLab 然后将现有的合并请求差异迁移到外部存储。

{{< /tab >}}

{{< tab title=”Self-compiled (source)” >}}

  1. 编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下行:

    external_diffs:
      enabled: true
    
  2. 设置对象存储设置
  3. 保存文件并重启极狐GitLab 以使更改生效。极狐GitLab 然后将现有的合并请求差异迁移到外部存储。

{{< /tab >}}

{{< /tabs >}}

阅读更多关于在极狐GitLab 中使用对象存储的信息

对象存储设置

您应该使用整合的对象存储设置

数据库存储的替代方案

启用外部差异可能会降低合并请求的性能,因为它们必须通过与其他数据分开的操作来检索。可以通过仅将过时的差异存储在外部,同时将当前差异保存在数据库中来达成折衷。

要启用此功能,请执行以下步骤:

{{< tabs >}}

{{< tab title=”Linux package (Omnibus)” >}}

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['external_diffs_when'] = 'outdated'
    
  2. 保存文件并重新配置极狐GitLab 以使更改生效。

{{< /tab >}}

{{< tab title=”Self-compiled (source)” >}}

  1. 编辑 /home/git/gitlab/config/gitlab.yml 并添加或修改以下行:

    external_diffs:
      enabled: true
      when: outdated
    
  2. 保存文件并重启极狐GitLab 以使更改生效。

{{< /tab >}}

{{< /tabs >}}

启用此功能后,差异最初存储在数据库中,而不是外部。当任何这些条件变为真时,它们会被移动到外部存储:

  • 存在更高版本的合并请求差异
  • 合并请求在七天前已合并
  • 合并请求在七天前已关闭

这些规则在空间和性能之间达到了平衡,仅将频繁访问的差异存储在数据库中。不太可能被访问的差异则被移动到外部存储中。

从外部存储切换到对象存储

自动迁移会移动存储在数据库中的差异,但不会在存储类型之间移动差异。要从外部存储切换到对象存储:

  1. 手动将存储在本地或 NFS 存储上的文件移动到对象存储。
  2. 运行此 Rake 任务以更改其在数据库中的位置。

    对于 Linux 软件包安装:

    sudo gitlab-rake gitlab:external_diffs:force_object_storage
    

    对于自编译安装:

    sudo -u git -H bundle exec rake gitlab:external_diffs:force_object_storage RAILS_ENV=production
    

    默认情况下,sudo 不会保留现有的环境变量。您应该像这样附加它们,而不是前缀它们:

    sudo gitlab-rake gitlab:external_diffs:force_object_storage START_ID=59946109 END_ID=59946109 UPDATE_DELAY=5
    

这些环境变量修改 Rake 任务的行为:

名称 默认值 目的
ANSI true 使用 ANSI 转义代码使输出更易理解。
BATCH_SIZE 1000 以此大小的批次迭代遍历表。
START_ID nil 如果设置,从此 ID 开始扫描。
END_ID nil 如果设置,停止在此 ID 处扫描。
UPDATE_DELAY 1 每次更新之间休眠的秒数。
  • START_IDEND_ID 可用于并行运行更新,通过将不同的进程分配到表的不同部分。
  • BATCHUPDATE_DELAY 使迁移速度可以与对表的并发访问进行权衡。
  • 如果您的终端不支持 ANSI 转义代码,则应将 ANSI 设置为 false