2

由于几年前签入了许多大 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

这难道不应该意味着在历史的任何时候创建并随后删除的任何内容都将被永久删除吗?

出于某种原因,它似乎不起作用 - 大小或多或少相同。

有什么建议么?

4

1 回答 1

2

抱歉,filter-branch这是唯一的方法。

如果您感到紧张,您应该尝试在存储库的单独克隆中对其进行测试。请记住,当您执行此操作时,git 会为您备份所有内容,因此您的克隆存储库将在本地增加大小,直到您推送更改的历史记录。

我会在此查看GitHub 的有用页面

另外,如果你原谅我的无耻插件,我最近一直在研究一个Ruby gem,它提供了一些关于你的历史和工作副本中的大文件的基本指标。它仍在积极开发中,但它可以工作,希望你会发现它有用。

编辑:为什么你的方法不起作用

首先,git 是一个分布式版本控制系统,这意味着当您执行clone. 因此,您可以git checkout <commit-sha>对存储库历史记录中的任何提交执行 a,以准确获取存储库在过去某个时间点的样子。

创建一个新分支并不能将您从存储库的历史中解放出来;事实上,分支只是提交的指针。所以为了简化,所有分支都有一个共同的祖先,这就是为什么你的new-master分支和你的旧分支完全一样master。大小的小幅减少可能是由于 git 从垃圾收集中获得了更好的优化。

当你跑的时候git gc --prune=now,你只是在移除loose objectsie 不在你的packfile. Apackfile是 git 有效存储对象以提高效率并减小存储库大小的地方。您可以在此处找到更多信息。

如果你是一个 git 新手,你需要接受很多东西,但我试图给出一个高层次的概述。我将探索优秀的 git 文档并准备好使用该git filter-branch命令以真正减少存储库的大小。

于 2013-03-03T21:07:51.080 回答