git:悬挂的水滴

git:悬挂的水滴,git,git-dangling,Git,Git Dangling,我最近在我的存储库上运行了git-fsck--lost-found 我希望看到一些悬空的提交,在这里我重置了头 然而,我很惊讶地看到可能有几千条悬空的blob消息 我不相信我的存储库有任何问题,但我很好奇是什么导致了这些悬垂的斑点?只有两个人在处理存储库,我们没有做任何异常的事情 我不认为它们是由一个文件的旧版本被一个新版本替换而成的,因为git需要保留这两个blob,这样它才能显示历史 回想一下,我们曾经错误地向项目中添加了一个非常大的目录(数千个文件),然后将其删除。这可能是所有悬垂斑点的来

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

我希望看到一些悬空的提交,在这里我重置了

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

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

我不认为它们是由一个文件的旧版本被一个新版本替换而成的,因为git需要保留这两个blob,这样它才能显示历史

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


只是想了解这个谜团。

上次我看到这个时,我无意中发现了,特别是这一部分:

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

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

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

git gc --prune="0 days"

每当您
将文件添加到索引中时,该文件的内容将作为blob添加到Git的对象数据库中。然后,当您重置该文件时,BLOB将仍然存在(下次运行
gc
时,它们将被垃圾收集)


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

我真的很不耐烦并且使用了:

git gc --prune="0 days"

同样值得注意的是,如果您修复了一个文件并重新添加它,那么前一个文件也会以同样的方式变成一个悬空的blob。(我通常使用以下顺序:hack away、
git add
git diff--cached
和/或
git status
,直到happy,然后
git commit
,所以我得到了很多这样的结果。:-)如果这些blob被删除了,会发生什么?@nferocious76那么你就无法修复那些,例如,被添加到暂存但没有提交的文件,然后被移除(通过rm-f)。GC运行后,文件将永久丢失。@DavidBrower我明白了,谢谢。因此它也会删除未链接或未引用的文件。git gc--prune=all