将目录从现有Git存储库移动到维护历史记录和缩小大小的新存储库

时间:2014-05-07 09:39:32

标签: git

场景:一个大型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/

我错过了什么?如何让回购品达到理智的尺寸?

1 个答案:

答案 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

之后,我刚刚添加了一个指向空的远程存储库的遥控器并推到那里。