把 800M 的视频从仓库删掉并提交,.git 还是 4.8G。git count-objects -vH 里 size-pack 4.6 GiB,in-pack 二十多万个对象。乍看像缓存或者权限的锅,追下去往往不是。

git count-objects -vH
git filter-repo --path assets/demo.mp4 --invert-paths
git reflog expire --expire=now --all && git gc --prune=now

追下去是这么回事:删除只影响最新一次提交的树,历史里的对象仍然被引用,pack 文件不会自动缩小。reflog、旧分支和 tag 继续指着那些提交,gc 也不敢回收。

「仓库体积瘦身」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,git count-objects -vH 记下 size-pack 作为基线;用 git filter-repo 按路径移除大文件 保留其他历史;清掉旧 remote 和 reflog 再 git gc --prune=now;强推所有分支和 tag 通知团队重新 clone;加仓库体积监控 超过阈值就告警。

验收就看一点,size-pack 降到 300M 以内 新 clone 不再拉那几个大文件。

作者 9823189