我有一个git存储库,其中有很多没有特定分支的投入,我可以 git show 它们,但是当我尝试列出包含它们的分支时,它一无所获。

我认为这是悬空的提交/树问题(由于-D分支),所以我修剪了回购,但是此后我仍然看到相同的行为:

$ git fetch origin

$ git fsck --unreachable
$ git fsck

没有输出,什么都没有悬空(对吗?)。但是该提交存在

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...

而且它无法通过任何分支来达到

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

没有输出。

该提交的状态到底是什么?我如何列出类似状态的所有提交?我如何删除这样的提交?

有帮助吗?

解决方案

没有输出,什么都没有悬空(对吗?)

请注意,从回流中提到的提交被认为可以达到。

该提交的状态到底是什么?我如何列出所有使用类似状态的提交

经过 --no-reflogs 说服 git fsck 向您展示。

我如何删除这样的提交?

一旦您的回流条目过期,这些对象也将通过 git gc.

到期受 gc.pruneexpire, gc.reflogexpire, , 和 gc.reflogexpireunreachable 设置。参见 git help config.

默认值都非常合理。

其他提示

要删除所有悬挂的提交,而从倒流中到达的提交则这样做:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

但是,请确保这就是您想要的。我建议您阅读男人页面,但这是要点:

git gc删除无法到达的对象(提交,树,斑点(文件))。如果对象不属于某些分支的历史,则无法实现。实际上,它更加复杂:

git gc 做其他事情,但在这里没有关系,也不是危险的。

未删除两个以下的未访问的物体,因此我们使用 --prune=now 这意味着“删除以前创建的无法到达的对象”。

也可以通过反射仪到达对象。当分支记录某些项目的历史时,回流记录了这些分支的历史。如果您进行修改,请重置等。将提交从分支历史记录中删除,但如果您意识到自己犯了一个错误,则git将它们保持在附近。回流是一种方便的方法,可以找出在分支(或头部)上执行的破坏性(和其他)操作,从而更容易撤销破坏性操作。

因此,我们还必须删除回流,以实际删除所有无法从分支到达的所有内容。我们通过到期 --all 回流。再次,git保留了一些回流以保护用户,因此我们必须再次告诉它不要这样做: --expire-unreachable=now.

由于我主要使用回流从破坏性操作中恢复,所以我通常会使用 --expire=now 相反,它完全击败了回流。

我也遇到了同样的问题,但仍在遵循此线程中的所有建议之后:

git reflog expire --expire-unreachable=now --all
git gc --prune=now
git fsck --unreachable --no-reflogs   # no output
git branch -a --contains <commit>     # no output
git show <commit>                     # still shows up

如果不是倒流,也不是分支机构,那一定是 标签!

git tag                             # showed several old tags created before the cleanup

我删除了标签 git tag -d <tagname> 并重新清理了,旧的委托消失了。

git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

可能只需要

git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042

还报告遥控器的分支机构

我也有类似的问题。我跑了 git branch --contains <commit>, ,并且它没有像问题一样返回输出。

但是即使在跑步之后

git reflog expire --expire-unreachable=now --all
git gc --prune=now

我的承诺仍然可以使用 git show <commit>. 。这是因为在其独立/悬空的“分支”中标记了其中一项委托。我删除了标签,再次运行了上述命令,我是金色的。 git show <commit> 回来 fatal: bad object <commit> - 正是我需要的。希望这对其他像我一样困扰的人有帮助。

git gc --prune=<date> 默认为两周前的修剪物体。您可以设置一个最新的日期。但是,创建松散对象的git命令通常会运行git gc -auto(如果其数字超过配置变量gc.auto的值,则将其修剪为松散的对象)。

您确定要删除这些提交吗? gc.auto的默认设置将确保松动对象不会占据不合理的内存,并且在一定时间内存储松散的对象通常是一个好主意。这样,如果您明天意识到您的删除分支包含您需要的提交,则可以恢复它。

我意外地遇到了同样的情况,发现我的藏匿处包含对无法实现的提交的引用,因此可以从藏匿处达成的假定的未达到的提交。

这些是我为使其真正无法达到的。

git stash clear
git reflog expire --expire-unreachable=now --all
git fsck --unreachable
git gc --prune=now
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top