混帐:晃来晃去的斑点

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

我期望看到一些悬而未决的提交,我已经重置了HEAD

然而,我惊奇地发现数千条悬而未决的信息。

我不相信我的存储库有什么问题,但是我对这些悬挂的blob是什么原因感到好奇? 只有两个人在存储库上工作,我们没有做任何不寻常的事情。

我不认为它们是由一个旧版本的文件replace成一个新版本创build的,因为git需要保存在两个blob中,所以它可以显示历史logging。

来想一想,有一点我们确实添加了一个非常大的目录(数千个文件)到项目中,然后删除它。 这可能是所有晃来晃去的斑点的来源?

只是寻找这个神秘的见解。

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

你也可以用包装中的悬挂物体结束。 当包装被重新包装时,这些物品将被放松,并最终在上述规则下过期。 不过,我相信gc不会总是重新包装旧包装, 它会制造新的包装,直到你有很多包装,然后把它们全部结合起来(至less这就是“gc – auto”会做的;我不记得是否只是“git gc”遵循相同的规则)。

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

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

 git gc --prune="0 days" 

我非常不耐烦和使用:

 git gc --prune="0 days" 

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

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