列出并删除没有分支的Git提交(悬空?)

列出并删除没有分支的Git提交(悬空?)

我有一个Git存储库,有很多提交,没有特定的分支,我可以git show,但当我尝试列出包含它们的分支时,它报告什么都没有。

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

$ git fetch origin$ git fsck --unreachable$ git fsck

没有输出,没有悬空(对吧?)。但提交存在

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042commit 793db7f272ba4bbdd1e32f14410a52a412667042Author: ...

它不能通过任何分支到达

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

没有输出。

这个提交的状态究竟是什么?如何列出处于类似状态的所有提交?如何删除那些提交?


www说
浏览 1127回答 3
3回答

拉风的咖菲猫

没有输出,没有悬空(对吧?)请注意,从您的reflog引用的提交被认为是可访问的。这个提交的状态究竟是什么?如何列出具有类似状态的所有提交通过--no-reflogs说服git fsck向他们展示。如何删除那些提交?一旦您的reflog条目过期,那么这些对象也将被清除git gc。到期由调控gc.pruneexpire,gc.reflogexpire和gc.reflogexpireunreachable设置。参看 git help config。默认值都很合理。

慕运维8079593

要删除所有悬空提交以及可从reflog中访问的提交,请执行以下操作:git reflog expire --expire-unreachable=now --allgit gc --prune=now但请确保这是你想要的。我建议你阅读手册页,但这里是要点:git gc删除无法访问的对象(提交,树,blob(文件))。如果某个对象不属于某个分支的历史记录,则该对象无法访问。实际上它有点复杂:git gc 做其他一些事情,但它们在这里并不重要,也没有危险。不会删除小于两周的无法访问的对象,因此我们使用的--prune=now方法是“删除之前创建的无法访问的对象”。也可以通过reflog访问对象。虽然分支记录了某个项目的历史记录,但是reflog记录了这些分支的历史记录。如果你修改,重置等提交将从分支历史记录中删除,但是如果你意识到你犯了错误,git会保留它们。Reflogs是一种方便的方法,可以找出在分支(或HEAD)上执行的破坏性(和其他)操作,从而更容易撤消破坏性操作。因此,我们还必须删除reflog以实际删除从分支无法访问的所有内容。我们通过使--allreflogs 到期来实现这一目标。git再次保留了一些reflog以保护用户,所以我们再次告诉它不要这样做:--expire-unreachable=now。由于我主要使用reflog来从破坏性操作中恢复,我通常会使用--expire=now它来完全消除reflog。

不负相思意

我有同样的问题,仍然遵循这个线程中的所有建议:git reflog expire --expire-unreachable=now --allgit gc --prune=nowgit fsck --unreachable --no-reflogs&nbsp; &nbsp;# no outputgit branch -a --contains <commit>&nbsp; &nbsp; &nbsp;# no outputgit show <commit>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# still shows up如果它不是reflog而不是分支,...它必须是一个标签!git tag&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# showed several old tags created before the cleanup我删除了标签git tag -d <tagname>并重新进行了清理,旧的提交已经消失。
打开App,查看更多内容
随时随地看视频慕课网APP