适用于 Git 2.36+,在完整本地 clone 的仓库根目录执行;下面这些先做只读检查。Git LFS 是可选项,没安装就跳过。
git --version
git rev-parse --is-inside-work-tree
git rev-parse --is-shallow-repository
du -sh .git
git count-objects -vH
command -v git-lfs >/dev/null && git lfs ls-files | head -n 20
count、size 高,通常是松散对象多;size-pack 高,空间主要在 pack。工作树里删掉大文件并不等于历史中的 blob 消失,LFS 当前有指针也不代表迁移前的旧 blob 已经离开历史。完整 clone 里可以继续找逻辑尺寸最大的对象:
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| sort -k3nr | head -n 20
OID='粘贴上一步的对象 ID'
git log --all --find-object="$OID" --oneline --decorate
这里的 objectsize 是未压缩逻辑尺寸,不等同于网络传输量,但很适合定位误提交的镜像、归档和数据库文件。先别直接删 .git/objects,也别一上来重写历史:重写会改变提交 ID,还要同步处理分支、标签、保护规则和其他 clone。单纯 git gc 能整理对象并回收符合条件的不可达对象,不能让仍被引用的大 blob 消失。
处理后至少跑 git fsck --full 和 git count-objects -vH;clone 或 CI 变快则要用同一远端、相近网络和全新目录复测,避免把本地缓存命中当成修复。