git:摇摇欲坠的blob

wad*_*rld 60 git git-dangling

我最近跑git fsck --lost-found了我的存储库.

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

但是,我惊讶地看到可能有数千条悬空blob消息.

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

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

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

只是寻找洞察这个谜.

Way*_*Lue 51

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

你也可以在包中悬挂物体.当重新包装该包时,这些对象将被松开,然后最终根据上述规则到期.但是,我相信gc不会总是重新包装旧包装; 它将使新的包,直到你有很多的包,然后将它们结合起来的所有(至少这就是"GC --auto"会做,我不记得只是"混帐气相色谱法"是否遵循相同的规则).

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

编辑:根据丹尼尔,您可以通过运行立即收集它

git gc --prune="0 days"
Run Code Online (Sandbox Code Playgroud)

  • 如果这些blob被删除会发生什么? (3认同)

Dan*_*iel 24

我真的很不耐烦和使用:

git gc --prune="0 days"
Run Code Online (Sandbox Code Playgroud)


kni*_*ttl 16

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

然而,当这些文件的一部分提交,并决定稍后reset历史,那么旧的提交仍然从Git的引用日志到达,只会在一段时间之后被垃圾收集(通常是一个月,IIRC).这些对象不应该显示为悬空,因为它们仍然是从reflog中引用的.

  • 值得注意的是,如果你修复一个文件并重新添加它,那么前一个文件就会以同样的方式变成一个悬空的blob.(我通常使用序列:hack away,`git add`,`git diff --cached`和/或`git status`直到happy,然后`git commit`,所以我得到了很多这些.:-)) (2认同)