65

我最近git fsck --lost-found在我的存储库上运行。

我希望看到几个悬空提交,我已经重置了HEAD

然而,我很惊讶地看到可能有数千条悬空的 blob 消息。

我不相信我的存储库有什么问题,但我很好奇是什么导致了这些悬空的斑点?只有两个人在处理存储库,我们没有做任何不寻常的事情。

我不认为它们是由旧版本的文件被新版本替换创建的,因为 git 需要保留两个 blob 以便它可以显示历史记录。

想一想,有一次我们确实错误地将一个非常大的目录(数千个文件)添加到项目中,然后将其删除。这可能是所有悬垂斑点的来源吗?

只是想深入了解这个谜团。

4

3 回答 3

56

上次我看这个时,我偶然发现了这个线程,特别是这部分:

你也可以在包中得到悬挂的物体。当该包装重新包装时,这些物品将被松开,然后根据上述规则最终过期。但是,我相信 gc 不会总是重新打包旧包;它会制作新的包,直到你有很多包,然后将它们全部组合起来(至少“gc --auto”会这样做;我不记得“git gc”是否遵循相同的规则)。

所以这是正常行为,我相信最终会被收集。

编辑:每丹尼尔,你可以通过运行立即收集它

git gc --prune="0 days"
于 2012-03-31T12:17:04.430 回答
27

我真的很不耐烦并且习惯了:

git gc --prune="0 days"
于 2013-06-11T05:00:11.540 回答
16

每当您add将文件添加到索引时,该文件的内容都会作为 blob 添加到 Git 的对象数据库中。当您然后reset/rm --cached该文件时,blob 仍然存在(下次运行时它们将被垃圾收集gc

但是,当这些文件是提交的一部分并且您稍后决定查看reset历史记录时,旧的提交仍然可以从 Git 的 reflog 访问,并且只会在一段时间后(通常是一个月,iirc)被垃圾收集。这些对象不应该显示为悬空,因为它们仍然从 reflog 中引用。

于 2012-03-31T12:18:06.013 回答