有没有办法通过删除有关旧提交的数据的本地副本来减少 repo 大小?
类似于如何git clone --depth 5
生成仅包含最近提交数据的小型本地克隆。
该存储库包含数千兆字节的游戏资产,这些资产过去被多次覆盖。
编辑:我不想只是清除过去的历史;我希望历史记录与远程保持一致,但我不希望旧的提交在本地存储并可用。
有没有办法通过删除有关旧提交的数据的本地副本来减少 repo 大小?
类似于如何git clone --depth 5
生成仅包含最近提交数据的小型本地克隆。
该存储库包含数千兆字节的游戏资产,这些资产过去被多次覆盖。
编辑:我不想只是清除过去的历史;我希望历史记录与远程保持一致,但我不希望旧的提交在本地存储并可用。
不幸的是,不可能只保留历史上最近的提交并拥有完全可用的存储库。浅拷贝不能完全使用,因为它不能被提交。
换句话说,由于 git 将数据保存在对象存储中的方式,除了从头重写历史记录之外,您别无选择。
可能最简单的方法是在 git 存储库之外的某个地方制作所有当前游戏资产文件的副本,然后git filter-branch
按照此处所述使用从历史记录中删除您的资产,就像它从未存在一样。最后,将资产复制回其应有的位置并再次提交。这将以游戏资产仅出现在最近提交中的方式重写您的历史记录。
但是,在您执行以下操作之前,它仍然不会回收磁盘空间:
git reflog expire --expire=now --all
git gc --prune=now
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 的提醒。