GitHub仓库clone时下载大量对象体积过大中断,如何查找并删除大文件?
问题原因
- Git会保留所有提交历史中的文件版本,即便你当前工作目录的文件数量少,只要历史提交中曾经上传过大文件(如数据集、压缩包、编译产物、模型文件等),哪怕后续在工作区删除了这些文件,它们依然会存储在Git的提交对象中。克隆仓库时默认会拉取全量历史对象,所以会出现对象数多、总体积大的情况。
- 你当前的下载速度仅18KiB/s,GitHub链路不稳定是下载中途崩溃的直接诱因。
查找仓库大文件的操作步骤
- 先执行浅克隆拿到最小可用的仓库副本,避免全量克隆失败:
git clone --depth=1 https://github.com/puraminy/mt5-comet cd mt5-comet
- 拉取完整提交历史后执行以下命令,扫描所有历史中的大文件:
git fetch --unshallow git rev-list --objects --all | \ git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \ sed -n 's/^blob //p' | \ sort --numeric-sort --key=2 | \ cut -c 1-12,41- | \ numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
命令输出结果按文件大小从小到大排序,末尾条目即为仓库中体积最大的文件,会显示文件哈希、大小、对应路径。
大文件的忽略与清理方案
仅存在于未提交的本地文件
直接编辑仓库根目录的.gitignore文件,添加对应大文件的匹配规则,示例如下:
# 忽略所有zip压缩包 *.zip # 忽略pt模型文件 *.pt # 忽略整个build目录 build/
随后执行git rm --cached 大文件路径将文件从Git追踪列表中移除,正常提交改动即可。
已经存入提交历史的大文件
推荐使用git filter-repo工具清理历史记录,操作前请务必备份完整的仓库文件,避免数据丢失:
- 拉取仓库的完整镜像:
git clone --mirror https://github.com/puraminy/mt5-comet
- 执行清理命令,按路径删除指定大文件:
# 删除单个指定路径的大文件 git filter-repo --path 大文件的完整路径 --invert-paths # 批量删除所有匹配后缀的大文件,示例为删除所有zip文件 git filter-repo --path-glob '*.zip' --invert-paths
- 清理完成后强制推送覆盖远程仓库的历史记录:
git push origin --force --all git push origin --force --tags
如果不需要保留历史提交记录,也可以直接删除现有GitHub仓库,将本地最新的工作区文件重新初始化提交为新仓库,操作更简便。
临时解决克隆失败的方法
如果暂时不需要处理历史大文件,仅需要拿到最新版本的代码,可以直接用浅克隆命令:
git clone --depth=1 https://github.com/puraminy/mt5-comet
该命令仅拉取最近一次提交的内容,不会下载全量历史对象,体积小、速度快,可规避下载崩溃问题。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

