场景:一个大型Git存储库(~16k提交),包含许多分支,二进制文件等。<repo>/a/b
内部的工具已经发展得如此之多,以至于我希望它拥有一个代码。单独的存储库我希望保留历史。我只对一个分支的历史和单个目录中的代码感兴趣。
这是我做的:
$ git clone <old git repo>
$ git remote rm origin
$ git filter-branch --subdirectory-filter <directory I want> -- --all
结果是我想要的 - 约80个提交,一个分支和大约10个源文件。
问题:存储库很大。 Git gc没什么用。
$ du -sh .
904M .
$ git gc && du -sh .
617M .
$ cd .. && mkdir tmp && cd tmp && git clone ../repo && du -sh repo
615M repo/
我错过了什么?如何让回购品达到理智的尺寸?
答案 0 :(得分:2)
Git documentation解决了尺寸问题:
$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
$ git reflog expire --expire=now --all
$ git gc --prune=now
$ du -sh .
2.1M .
我还注意到所有现有的标签都是不需要的,并且在运行上述标签之前删除了这些标签:
$ for t in $(git tag -l|xargs); do git tag -d $t; done
之后,我刚刚添加了一个指向空的远程存储库的遥控器并推到那里。