通过删除旧提交紧凑的回购

时间:2013-05-31 09:46:15

标签: git

有没有办法通过删除有关旧提交的本地数据副本来减少回购协议的大小?

类似于git clone --depth 5如何生成只有最近提交数据的小型本地克隆。

回购包含数十亿字节的游戏资产,过去曾多次被覆盖。

编辑:我不想只是清除过去的历史;我希望历史记录与远程保持一致,但我不希望旧提交在本地存储和可用。

2 个答案:

答案 0 :(得分:7)

不幸的是,不可能仅保留历史记录中的最新提交,并且完全可用存储库。浅拷贝不能完全使用,因为它不能被提交。

换句话说,由于git将数据保存在对象存储库中的方式,除了从头开始重写历史记录之外,您没有很多选项。

可能最简单的方法是将所有当前游戏资产文件的副本复制到git存储库之外的某个位置,然后使用git filter-branch作为described here从历史记录中删除您的资产,就像它从未存在过一样。最后,将资产复制回正确的位置并再次提交。这将以游戏资产仅出现在最近的提交中的方式重写您的历史记录。

但是,它仍然不会回收磁盘空间,直到你执行:

git reflog expire --expire=now --all
git gc --prune=now

答案 1 :(得分:3)

git gc --prune=<date>应该做你想做的事。请查看文档:{​​{3}}

更新1:我建议您阅读有关git gc的博文:https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

Update2: @mvp是正确的,经过深入研究git gc只会删除未跟踪的对象。为了删除对象,解决方案之一是使用git filter-branch。我建议您阅读有关http://gitfu.wordpress.com/2008/04/02/git-gc-cleaning-up-after-yourself/removing objects文档的此主题。感谢@mvp的抬头。