列出并删除没有分支的Git提交(dangling?)
我有一个Git仓库,其中有很多没有特定分支的提交,我可以git show
它们,但是当我尝试列出包含它们的分支时,它不报告任何内容。
我认为这是悬而未决的提交/树问题(作为-D分支的结果),所以我修剪了回购,但我仍然看到相同的行为:
$ git fetch origin
$ git fsck --unreachable
$ git fsck
没有输出,没有任何悬挂(对吧?)。 但是提交存在
$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...
并且它不能通过任何分支到达
$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042
没有输出。
该提交的状态到底是什么? 我如何列出所有类似状态的提交? 我怎样才能删除这些提交?
没有输出,没有任何悬挂(对吧?)
请注意,从reflog引用的提交被视为可访问。
该提交的状态到底是什么? 我如何列出所有类似状态的提交
通过--no-reflogs
来说服git fsck
向你展示它们。
我怎样才能删除这些提交?
一旦你的reflog条目到期,这些对象也将被git gc
清理。
有效期限由gc.pruneexpire
, gc.reflogexpire
和gc.reflogexpireunreachable
设置规定。 参看 git help config
。
默认值都很合理。
要删除所有悬而未决的提交和从reflog可访问的提交,请执行以下操作:
git reflog expire --expire-unreachable=now --all
git gc --prune=now
但要确定这是你想要的。 我建议你阅读手册页,但这里是要点:
git gc
删除无法访问的对象(提交,树,斑点(文件))。 如果某个对象不属于某个分支的历史记录,则该对象无法访问。 其实它有点复杂:
git gc
做了一些其他的事情,但他们在这里没有关系,也没有危险。
小于两周的无法访问的对象不会被删除,因此我们使用--prune=now
,这意味着“删除现在之前创建的不可访问的对象”。
对象也可以通过reflog访问。 当分支记录某个项目的历史时,reflog记录这些分支的历史。 如果你修改,重置等提交从分支历史记录中删除,但git保持它们以防万一你意识到你犯了一个错误。 Reflogs是一种查找分支(或HEAD)上执行的破坏性(和其他)操作的便捷方式,使撤销破坏性操作变得更容易。
因此,我们还必须删除reflog以实际删除分支中无法访问的所有内容。 我们通过到期这么做--all
reflogs。 再次git保留一些reflogs来保护用户,所以我们再次必须告诉它不要这样做:-- --expire-unreachable=now
。
由于我主要使用reflog从破坏性操作中恢复,因此我通常会使用--expire=now
来完全转换reflog。
git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042
可能只是需要
git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042
也报告遥控分支
链接地址: http://www.djcxy.com/p/49279.html上一篇: Listing and deleting Git commits that are under no branch (dangling?)
下一篇: Undo pushed commits