仓库大小
- 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-repo在commit-map文件中生成对象列表。
清理仓库的步骤:
-
在左侧边栏,选择 Search or go to 并找到您的项目。
-
转到 Settings > Repository。
-
展开 Repository maintenance。
-
上传要删除的对象列表。例如,
filter-repo目录中的commit-map文件。如果您的
commit-map文件太大,后台清理过程可能会超时并失败。 结果,仓库大小没有按预期减少。为了解决这个问题,请分割文件并分部分上传。 从20000开始,根据需要减少。例如:split -l 20000 filter-repo/commit-map filter-repo/commit-map- -
选择 Start cleanup。
清理完成后,GitLab 会发送一封包含重新计算的仓库大小的电子邮件通知。
删除 blobs
Git 二进制大对象(blob)存储没有元数据的文件内容。 每个 blob 都有一个唯一的 SHA 哈希,代表仓库中文件的特定版本。
使用此方法永久删除包含敏感或机密信息的 blobs。
此过程:
- 重写 Git 历史。
- 删除提交签名。
- 可能导致打开的合并请求无法合并,需要手动变基。
- 可能导致引用旧提交 SHA 的流水线中断。
- 可能影响基于旧提交历史的历史标签和分支。
- 需要重新克隆本地仓库。
- 是不可逆的。
要将字符串替换为 ***REMOVED***,请参阅编辑信息。
先决条件:
- 您必须拥有项目的 Owner 角色
- 要删除的对象 ID 列表。
- 您的项目不能是:
- 公共上游项目的分支。
- 有下游分支的公共上游项目。
为确保成功删除 blobs,请在过程中考虑临时限制仓库访问。 在删除 blobs 期间推送的新提交可能导致操作失败。
从您的仓库中删除 blobs 的步骤:
- 在左侧边栏,选择 Search or go to 并找到您的项目。
- 选择 Settings > Repository。
- 展开 Repository maintenance。
- 选择 Remove blobs。
- 输入要删除的 blob ID 列表,每个 ID 占一行。
- 选择 Remove blobs。
- 在确认对话框中,输入您的项目路径。
- 选择 Yes, remove blobs。
- 在左侧边栏,选择 Settings > General。
- 展开标记为 Advanced 的部分。
- 选择 Run housekeeping。等待至少 30 分钟让操作完成。
- 在同一个 Settings > General > Advanced 部分,选择 Prune unreachable objects。 此操作大约需要 5-10 分钟完成。
如果包含敏感信息的项目已被分支,清理任务可能会成功但未完成此过程。 清理必须维护特殊对象池仓库的完整性, 该仓库包含分支的数据。 如需帮助,请联系 GitLab 支持。
获取对象 ID 列表
要删除 blobs,您需要一个要删除的对象列表。
要获取这些 ID,请使用 ls-tree 命令或使用仓库 API 列出仓库树端点。
以下说明使用 ls-tree 命令。
先决条件:
- 仓库必须已克隆到您的本地机器。
要获取给定提交或分支中按大小排序的 blobs 列表:
-
打开终端并转到您的仓库目录。
-
运行以下命令:
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 或本地仓库不同:
-
请 GitLab 管理员使用 Rails 控制台强制更新。
-
管理员应运行以下命令:
p = Project.find_by_full_path('<namespace>/<project>') p.statistics.refresh! -
要清除项目统计信息并触发重新计算:
p.repository.expire_all_method_caches UpdateProjectStatisticsWorker.perform_async(p.id, ["commit_count","repository_size","storage_size","lfs_objects_size","container_registry_size"]) -
要检查总的构件存储空间:
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。要解决此问题:
-
source repository checksum altered:这发生在有人在 blob 删除过程中推送提交时。要解决此问题:
- 临时阻止所有对仓库的推送。
- 重新运行blob 删除步骤。
- 在过程成功完成后重新启用推送。
已达到仓库大小限制
如果您已达到仓库大小限制:
- 尝试删除一些数据并创建新提交。
- 如果不成功,考虑将一些 blobs 移动到 Git LFS 或从历史中删除旧的依赖更新。
- 如果您仍然无法推送更改,请联系您的 GitLab 管理员临时增加您项目的限制。
- 作为最后手段,创建一个新项目并迁移您的数据。
在新提交中删除文件不会立即减少仓库大小,因为之前的提交和 blobs 仍然存在。
要有效减少大小,您必须使用 git filter-repo 等工具重写历史。