优化 Git 仓库的额外提示

当你发现 .git 目录有点大了,随手 Google 一下“optimize git repo”,“reduce repository size”之类的关键词然后照做就行,无非是删多余分支以及历史中的大文件然后 gc,repack 什么的。但这里有几点额外提示:

注意远程服务器的更改

按大多数教程完成操作后,本地的体积减小了:

# 折腾一番然后 git push --force (小心!)
$ ~/misc/apps/dua # 1.57 MB .git

但你或许会遇到从远程 Clone 得到仓库体积不变的情况:

git clone https://github.com/kkocdko/kblog .
$ ~/misc/apps/dua # 3.92 MB .git

这有很多可能的原因。例如本地删了分支但远程没删,对于 GitHub 可以在 github.com/user/repo/branches 删掉,其他平台也类似。

也可能是某个 Commit 打了 Tag,造成一些我们希望不可达并被 Trim 掉的 Object 变为可达。在 GitHub 上尝试访问这种 Tag 会显示为:

这时候记得删掉(或备份重建)所有 Tag 就行了。当然若是自己的服务器或者不关心 GitHub 上的 Star 数量那自然删库重新 Push 上去万事大吉。

有关 git-filter-repo

newren/git-filter-repo 挺好用,值得尝试。但在使用前如果你已经执行过 gc,repack 等操作,那么我建议先将 pack 文件解开

mv .git/objects/pack/ ./git_objs/
git unpack-objects < ./git_objs/*.pack
rm -rf ./git_objs/

之后再执行 --analyze 等操作时,速度会更快一些。当然最后别忘了再 repack 回来。

commit-graph 相关报错

重写了一些历史 Commit 后,偶尔会出现以下报错:

failed to parse commit ... from object database for commit-graph
....89 more

这时只需 git commit-graph write 就行了。