新同事 clone 仓库,卡在 Receiving objects 99% 十几分钟,最后报 early EOF。du -sh .git 是 3.4G,源码本身不到 200M。乍看像缓存或者权限的锅,追下去往往不是。

git count-objects -vH
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sort -k3 -n | tail -5

追下去是这么回事:设计稿和安装包被提交进历史,每个版本都完整存一份,clone 要把所有对象拉下来。文件后续删掉也不影响历史,体积只增不减,弱网下很容易超时。

「仓库大文件」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,git count-objects -vH 看 size-pack 找出体积来源;git rev-list --objects --all 配合 git cat-file 定位大文件路径;用 git filter-repo --path 把这类文件从历史移除;强推后通知所有人重新 clone 旧副本不要再用;加 pre-commit 体积检查和 Git LFS 规则挡住下一次。

验收就看一点,重新 clone 在几分钟内完成 .git 体积降到 200M 以内。

作者 9823189