2013-05-31 26 views
8

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

git clone --depth 5产生一个只有最近提交数据的小本地克隆类似。

回购包含千兆字节的游戏资产,这些资产在过去被多次覆盖。

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

+0

当你说“老提交”,我猜你的意思不是晃来晃去不再从到达提交分支指针,在你的历史中只是真的很老,你不可能在不久的将来再次访问,那会是正确的吗? – 2013-05-31 13:56:44

+0

@TheShadow的权利,我会更新问题 –

+1

@Hardex:回答您的更新问题:不可能保留历史上最近的提交,并有完全可用的存储库。浅拷贝不完全可用 - 它不能被提交。 – mvp

回答

7

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

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

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

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

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

git gc --prune=<date>应该做你想做的。看看到文档:https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

UPDATE1:我建议你阅读这篇博客文章git gc还有:http://gitfu.wordpress.com/2008/04/02/git-gc-cleaning-up-after-yourself/

UPDATE2: @mvp是正确的,进行了深入研究后git gc只会移除未跟踪的对象。为了移除物体,其中一个解决方案是使用git filter-branch。我建议您阅读关于removing objectsgit filter-branch文档的主题。感谢@mvp的领导。

+1

你是完全错误的。 'git gc --prune'不会做OP想要的 – mvp

+0

你是对的@mvp,我已经更新了我的答案。抬起头来。 –

+0

@danielcsgomes对于它的价值,如果原始海报**对删除悬挂提交感兴趣,那么'git gc'确实是正确的使用工具。 – 2013-05-31 13:58:23