11

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

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

该存储库包含数千兆字节的游戏资产,这些资产过去被多次覆盖。

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

4

2 回答 2

8

不幸的是,不可能只保留历史上最近的提交并拥有完全可用的存储库。浅拷贝不能完全使用,因为它不能被提交。

换句话说,由于 git 将数据保存在对象存储中的方式,除了从头重写历史记录之外,您别无选择。

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

但是,在您执行以下操作之前,它仍然不会回收磁盘空间:

git reflog expire --expire=now --all
git gc --prune=now
于 2013-05-31T10:45:48.373 回答
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/

更新2 : @mvp 是对的,经过深入研究git gc只会删除未跟踪的对象。为了移除对象,解决方案之一是使用git filter-branch. 我建议您阅读有关删除对象的主题和git filter-branch文档。感谢@mvp 的提醒。

于 2013-05-31T09:51:33.387 回答