我最近在我的存储库上运行了git fsck --lost-found
。
我希望看到几个悬空提交,我重置了HEAD
。
然而,我惊讶地看到可能有数千条悬空的blob消息。
我不相信我的存储库有任何问题,但我很好奇是什么原因导致这些悬空斑块?只有两个人在存储库上工作,我们没有做任何与众不同的事情。
我不认为它们是由旧版本的文件替换为新版本而创建的,因为git需要保留两个blob以便它可以显示历史记录。
想想看,有一次我们错误地将一个非常大的目录(数千个文件)添加到项目中然后将其删除。这可能是所有悬空斑点的来源吗?
只是想深入了解这个谜团。
答案 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中引用的。