有时候项目里引用了一些大文件,导致 .git 容量高达几个 G。

如果这些大文件丢失并不敏感,也没什么用处,可以清理掉来节约一下空间。

操作前建议备份。

1. gc

使用 git-gc 将对象打包。

1
$ git gc --prune=now

.git 已经从 4 个 G 变成了 322M。

1
2
$ du -sh .git
322M	.git

2. 查找最大的 3 个文件

1
2
3
4
5
$ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -3 | awk '{print$1}')"

4badfe287e3f1d6e4e288b2c3b47261119ce2fca foo/bar1.xxx
00e7645c93c2368b0634bda72507b40c936dd1b3 foo/bar2.xxx
4088cefbbc3dcd6a17dfa656423ad20137fad9dd foo/bar3.xxx

3. 删除文件

1
2
3
4
5
$ git filter-branch --force --index-filter "git rm -rf --cached --ignore-unmatch <filename>"  --prune-empty --tag-name-filter cat -- --all

如:

$ git filter-branch --force --index-filter "git rm -rf --cached --ignore-unmatch foo/bar1.xxx"  --prune-empty --tag-name-filter cat -- --all

1000 多个提交大概运行了 2 分钟。

4. 清除缓存

1
2
3
$ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
$ git reflog expire --expire=now --all
$ git gc --prune=now

5. 查看成果

1
2
$ du -sh .git
212M	.git

一个几十 M 的文件清除后,整个包减小了大概 100 M,多清理几个就降下来了。

最后 Push 时需使用 --force 参数覆盖远端。

参考 & 感谢

Git清理删除历史提交文件

如何解决 GitHub 提交次数过多 .git 文件过大的问题?