列表和删除没有分支机构的git提交(悬挂?)
-
04-10-2019 - |
题
我有一个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