有时候项目里引用了一些大文件,导致 .git
容量高达几个 G。
如果这些大文件丢失并不敏感,也没什么用处,可以清理掉来节约一下空间。
操作前建议备份。
1. gc
使用 git-gc 将对象打包。
$ git gc --prune=now
.git
已经从 4 个 G 变成了 322M。
$ du -sh .git
322M .git
2. 查找最大的 3 个文件
$ 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. 删除文件
$ 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. 清除缓存
$ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
$ git reflog expire --expire=now --all
$ git gc --prune=now
5. 查看成果
$ du -sh .git
212M .git
一个几十 M 的文件清除后,整个包减小了大概 100 M,多清理几个就降下来了。
最后 Push 时需使用 --force
参数覆盖远端。