git:摇摇欲坠的blob

时间:2012-03-31 12:07:42

标签: git git-dangling

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

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

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

我不相信我的存储库有任何问题,但我很好奇是什么原因导致这些悬空斑块?只有两个人在存储库上工作,我们没有做任何与众不同的事情。

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

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

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

3 个答案:

答案 0 :(得分:51)

上次我看到这个时,偶然发现了this thread,特别是这部分:

  

您最终还可以在包中悬挂物品。什么时候包   重新包装,这些对象将被放松,然后最终过期   根据上述规则。但是,我相信gc不会永远   重新包装旧包装;它会制作新包装,直到你有很多包装,   然后将它们全部组合起来(至少那就是“gc --auto”会做的事情;我   不要记得“git gc”是否遵循相同的规则。)

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

编辑:根据Daniel,您可以通过运行

立即收集它
git gc --prune="0 days"

答案 1 :(得分:24)

我真的很不耐烦和使用:

git gc --prune="0 days"

答案 2 :(得分:16)

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

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