我有一个存储库,由于几年前检查了许多大blob,它已经变得非常大。它们在随后的版本中被删除了,不再需要了,所以我现在应该能够清除对它们的任何引用。
我看过一些使用git filter-branch
的参考资料,但是使用这个命令似乎很危险和笨拙,所以我试着这样做:
git checkout --orphan new-master
git rm -rf --cached *
git merge --squash master
git branch -D master
git gc --prune=now
这难道不意味着在历史记录中创建并随后删除的任何内容都将永久删除吗?
由于某些原因,它似乎不工作-大小或多或少是相同的。
有什么建议吗?
对不起,filter-branch
是唯一的方法。
如果您感到紧张,您应该尝试在您的存储库的一个单独的克隆中进行测试。只要记住,当你这样做的时候,git会为你备份所有的东西,所以你克隆的存储库会在本地增加的大小,直到你推送更改的历史记录。
我会查看GitHub的有用页面。
另外,如果你能原谅我无耻的插入,我最近一直在做一个Ruby gem,它提供了一些关于历史记录和工作副本中的大文件的基本指标。它仍在积极开发中,但它可以工作,希望你会发现它有用。
编辑:为什么你的方法不起作用
首先,git是一个分布式的版本控制系统,这意味着当你做clone
时,所有的分支和历史都是在本地复制的。因此,您可以对存储库历史中的任何提交执行git checkout <commit-sha>
,以获得存储库在过去某个时刻的确切情况。
创建一个新的分支并不能使你从存储库的历史中解脱出来;实际上,分支只是指向提交的指针。所以为了简化,所有分支都有一个共同的祖先,这就是为什么你的new-master
分支与你的旧master
分支完全相同。大小的小幅减少可能是因为git从垃圾收集中获得了稍微更好的优化。
当你运行git gc --prune=now
,你只是删除loose objects
即对象不在你的packfile
。packfile
是git有效存储对象的地方,以提高效率并减少存储库的大小。你可以在这里找到更多信息。
如果你是一个菜鸟,这是很多要考虑的,但我已经试着给一个高层次的概述。我将探索优秀的 git文档,并准备好突破git filter-branch
命令,以真正减少存储库的大小。