要在 macOS 上查找存储在仓库可达 Git 历史记录中的最大文件,请打开终端,切换到该仓库,并通过 git cat-file 和 sort 管道传递 Git 的对象列表。这将报告每个 blob 的未压缩字节大小以及路径提示。它可以找出已被删除或替换,但仍保留在分支或标签可达的提交中的文件。

在终端中运行历史记录扫描

在终端中,使用 cd 进入仓库。如果文件夹路径包含空格,请用引号括起来。然后运行:

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectsize) %(objectname) %(rest)' |
  awk '$1 == "blob"' |
  sort -k2,2nr |
  head -20

输出结果按从大到小的顺序排列。每行显示对象类型、字节数、对象 ID 以及(如果 Git 提供了)路径提示。git rev-list --objects --all 会遍历可从引用(如本地分支和标签)到达的提交所引用的对象;git cat-file --batch-check 会报告每个对象的类型和大小。该流水线会筛选出 blob,即保存文件内容的对象。Git 的 rev-list 文档介绍了对象遍历和名称,cat-file 则说明了批量大小和类型的输出。

sort -k2,2nr 使用 macOS 内置的 sort 命令,按第二个以空格分隔的字段(即字节大小)进行逆序数值排序。head -20 将显示限制为 20 行;修改该数字或删除最后一行可查看更多内容。该命令仅读取仓库数据,不会修改提交或文件。

仔细解读结果

每一行都标识了一个 blob 对象,但不一定代表当前存在于工作区中的文件。大对象可能来自文件的旧版本,并且路径提示并不是完整的历史路径索引:Git 文档说明,在使用 --objects 时,名称仅为提示,可能会因换行符而被更改,且当一个对象具有多个名称时可能仅显示其中一个。请将列出的路径作为线索,然后检查相关提交以确认该内容出现的时间和位置。Git 的 rev-list 对象名称说明解释了这些限制。

此扫描涵盖了由 --all 发现的引用可达的对象,并非物理残留在对象数据库中的每个对象。要检查本地对象存储(包括不可达的对象),请运行:

git cat-file --batch-all-objects \
  --batch-check='%(objecttype) %(objectsize) %(objectname)' |
  awk '$1 == "blob"' |
  sort -k2,2nr |
  head -20

--batch-all-objects 会访问仓库和备用对象库中的所有对象,包括无法从引用到达的对象。第二个命令省略了文件路径,因此可以使用对象 ID 进行进一步排查。 cat-file 文档指出了更广泛的对象覆盖范围,并指出即使多次存储,每个对象也仅显示一次。

Blob 大小不等于磁盘空间

报告的 objectsize 是 Git 对象的未压缩大小。Git 可能会压缩对象或将其作为增量存储在打包文件(packfiles)中,因此大 blob 并不一定会占用完全相同的磁盘空间。要查看存储使用情况的概览,请运行 git count-objects -vH;其 size-pack 字段报告打包数据的大小,其他字段则汇总松散对象和相关存储。Git 的 count-objects 手册详细记录了这些数据。要检查打包对象的大小和增量详情,git verify-pack -v 会列出每个打包对象的大小及其在打包文件中的大小,但这需要相关的 .idx 文件。 verify-pack 手册定义了该输出。

如果发现了体积庞大的历史文件

首先确定你的目标是了解当前的签出内容,还是缩减仓库历史记录。如果仅针对当前版本,请在访达(Finder)中检查文件,或在终端中使用文件大小列表命令;历史记录扫描通过搜索可达的 Git 对象来回答不同的问题。

如果应该从每个修订版本中删除某个大文件,仅在新的提交中将其删除并不能从历史记录中擦除较旧的副本。重写历史记录会更改提交 ID 并影响使用该仓库的其他人员,因此在执行此操作之前应进行协调并保留备份。git-filter-repo 项目提供了只读分析模式 git filter-repo --analyze,它可以生成报告以帮助决定要过滤的内容;在分析模式下不会执行重写操作。该项目的文档描述了分析选项,并警告过滤操作会重写历史记录。

当目标是找出本地仓库历史背后最大的文件内容时,第一条流水线是实用的切入点。当不可达的残留对象很关键时,请使用全对象扫描;在将磁盘占用归因于特定 blob 之前,请将 Git 对象大小与打包存储进行对比。

来源