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

仓库大小

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

Git 仓库的大小会显著影响性能和存储成本。 由于压缩、清理操作和其他因素,不同实例之间的大小可能会有轻微差异。

大小计算

项目概览页面显示仓库中所有文件的大小,包括仓库文件、构件(artifacts)和 LFS。此大小每 15 分钟更新一次。

仓库的大小是通过计算仓库中所有文件的累积大小来确定的。 此计算类似于在仓库的哈希存储路径上执行 du --summarize --bytes

大小和存储限制

管理员可以为 GitLab 自托管版设置仓库大小限制。 对于 GitLab SaaS,大小限制是预定义的

当项目达到其大小限制时,某些操作(如推送、创建合并请求和上传 LFS 对象)会受到限制。

减少仓库大小的方法

以下方法可用于减少仓库的大小:

在减少仓库大小之前,您应该创建仓库的完整备份。 这些方法是不可逆的,可能会影响您项目的历史和数据。

当您使用任何可用方法减少仓库大小时,您不需要阻止对项目的访问。 您可以在项目保持对用户可访问的同时执行这些操作。 这些方法没有已知的性能影响,也不会导致停机。 但是,您应该在活动较少的时期执行这些操作,以最大限度地减少对用户的潜在影响。

从仓库历史中清除文件

您可以使用 git filter-repo 来清除 Git 历史中的大文件。不要使用此方法删除密码或密钥等敏感数据。 请改用删除 blobs

此过程:

  • 修改整个 Git 历史。
  • 可能会影响打开的合并请求。
  • 可能会影响现有的流水线。
  • 需要重新克隆本地仓库。
  • 不影响 LFS 对象。
  • 不指定提交签名。
  • 是不可逆的。

关于提交的信息(包括文件内容)缓存在数据库中,即使它们已从仓库中删除,仍然可见。

清理仓库

使用此方法从您的仓库中删除内部 Git 引用和未引用的对象。 不要使用此方法删除敏感数据。 请改用删除 blobs

此过程:

  • 运行 git gc --prune=30.minutes.ago 来删除未引用的对象。
  • 取消未使用的 LFS 对象的链接,释放存储空间。
  • 重新计算磁盘上的仓库大小。
  • 是不可逆的。

删除内部 Git 引用会导致相关的合并请求提交、流水线和变更详情变得不可用。

先决条件:

  • 要删除的对象列表。使用 git filter-repocommit-map 文件中生成对象列表。

清理仓库的步骤:

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

  2. 转到 Settings > Repository

  3. 展开 Repository maintenance

  4. 上传要删除的对象列表。例如,filter-repo 目录中的 commit-map 文件。

    如果您的 commit-map 文件太大,后台清理过程可能会超时并失败。 结果,仓库大小没有按预期减少。为了解决这个问题,请分割文件并分部分上传。 从 20000 开始,根据需要减少。例如:

    split -l 20000 filter-repo/commit-map filter-repo/commit-map-
  5. 选择 Start cleanup

清理完成后,GitLab 会发送一封包含重新计算的仓库大小的电子邮件通知。

删除 blobs

Git 二进制大对象(blob)存储没有元数据的文件内容。 每个 blob 都有一个唯一的 SHA 哈希,代表仓库中文件的特定版本。

使用此方法永久删除包含敏感或机密信息的 blobs。

此过程:

  • 重写 Git 历史。
  • 删除提交签名。
  • 可能导致打开的合并请求无法合并,需要手动变基。
  • 可能导致引用旧提交 SHA 的流水线中断。
  • 可能影响基于旧提交历史的历史标签和分支。
  • 需要重新克隆本地仓库。
  • 是不可逆的。

要将字符串替换为 ***REMOVED***,请参阅编辑信息

先决条件:

  • 您必须拥有项目的 Owner 角色
  • 要删除的对象 ID 列表
  • 您的项目不能是:
    • 公共上游项目的分支。
    • 有下游分支的公共上游项目。

为确保成功删除 blobs,请在过程中考虑临时限制仓库访问。 在删除 blobs 期间推送的新提交可能导致操作失败。

从您的仓库中删除 blobs 的步骤:

  1. 在左侧边栏,选择 Search or go to 并找到您的项目。
  2. 选择 Settings > Repository
  3. 展开 Repository maintenance
  4. 选择 Remove blobs
  5. 输入要删除的 blob ID 列表,每个 ID 占一行。
  6. 选择 Remove blobs
  7. 在确认对话框中,输入您的项目路径。
  8. 选择 Yes, remove blobs
  9. 在左侧边栏,选择 Settings > General
  10. 展开标记为 Advanced 的部分。
  11. 选择 Run housekeeping。等待至少 30 分钟让操作完成。
  12. 在同一个 Settings > General > Advanced 部分,选择 Prune unreachable objects。 此操作大约需要 5-10 分钟完成。

如果包含敏感信息的项目已被分支,清理任务可能会成功但未完成此过程。 清理必须维护特殊对象池仓库的完整性, 该仓库包含分支的数据。 如需帮助,请联系 GitLab 支持。

获取对象 ID 列表

要删除 blobs,您需要一个要删除的对象列表。 要获取这些 ID,请使用 ls-tree 命令或使用仓库 API 列出仓库树端点。 以下说明使用 ls-tree 命令。

先决条件:

  • 仓库必须已克隆到您的本地机器。

要获取给定提交或分支中按大小排序的 blobs 列表:

  1. 打开终端并转到您的仓库目录。

  2. 运行以下命令:

    git ls-tree -r -t --long --full-name <COMMIT/BRANCH> | sort -nk 4

    示例输出:

    100644 blob 8150ee86f923548d376459b29afecbe8495514e9  133508 doc/howto/img/remote-development-new-workspace-button.png
    100644 blob cde4360b3d3ee4f4c04c998d43cfaaf586f09740  214231 doc/howto/img/dependency_proxy_macos_config_new.png
    100644 blob 2ad0e839a709e73a6174e78321e87021b20be445  216452 doc/howto/img/gdk-in-gitpod.jpg
    100644 blob 115dd03fc0828a9011f012abbc58746f7c587a05  242304 doc/howto/img/gitpod-button-repository.jpg
    100644 blob c41ebb321a6a99f68ee6c353dd0ed29f52c1dc80  491158 doc/howto/img/dependency_proxy_macos_config.png

    输出中的第三列是 blob 的对象 ID。例如:8150ee86f923548d376459b29afecbe8495514e9

故障排除

GUI 中显示的仓库统计信息不正确

如果 GitLab 界面中显示的仓库大小或提交数量与导出的 .tar.gz 或本地仓库不同:

  1. 请 GitLab 管理员使用 Rails 控制台强制更新。

  2. 管理员应运行以下命令:

    p = Project.find_by_full_path('<namespace>/<project>')
    p.statistics.refresh!
  3. 要清除项目统计信息并触发重新计算:

    p.repository.expire_all_method_caches
    UpdateProjectStatisticsWorker.perform_async(p.id, ["commit_count","repository_size","storage_size","lfs_objects_size","container_registry_size"])
  4. 要检查总的构件存储空间:

    builds_with_artifacts = p.builds.with_downloadable_artifacts.all
    
    artifact_storage = 0
    builds_with_artifacts.find_each do |build|
      artifact_storage += build.artifacts_size
    end
    
    puts "#{artifact_storage} bytes"

清理后空间未释放

如果您已完成仓库清理过程但存储使用情况保持不变:

  • 请注意,不可达对象在仓库中会保留两周的宽限期。
  • 这些对象不包含在导出中,但仍占用文件系统空间。
  • 两周后,这些对象会被自动修剪,从而更新存储使用情况统计信息。
  • 要加速此过程,请管理员运行‘修剪不可达对象’清理任务

Blobs 未被删除

当 blobs 成功删除时,GitLab 会在项目审计日志中添加一条记录,并向发起操作的人员发送电子邮件通知。

如果 blob 删除失败,GitLab 会向发起者发送主题为 <project_name> | Project history rewrite failure 的电子邮件通知。 电子邮件正文包含完整的错误消息。

可能的错误和解决方案:

  • validating object ID: invalid object ID

    对象 ID 列表包含语法错误或错误的对象 ID。要解决此问题:

    1. 重新生成对象 ID 列表
    2. 重新运行blob 删除步骤
  • source repository checksum altered

    这发生在有人在 blob 删除过程中推送提交时。要解决此问题:

    1. 临时阻止所有对仓库的推送。
    2. 重新运行blob 删除步骤
    3. 在过程成功完成后重新启用推送。

已达到仓库大小限制

如果您已达到仓库大小限制:

  • 尝试删除一些数据并创建新提交。
  • 如果不成功,考虑将一些 blobs 移动到 Git LFS 或从历史中删除旧的依赖更新。
  • 如果您仍然无法推送更改,请联系您的 GitLab 管理员临时增加您项目的限制
  • 作为最后手段,创建一个新项目并迁移您的数据。

在新提交中删除文件不会立即减少仓库大小,因为之前的提交和 blobs 仍然存在。 要有效减少大小,您必须使用 git filter-repo 等工具重写历史。