3 回答
TA贡献1995条经验 获得超2个赞
没有输出,没有悬空(对吧?)
请注意,从您的reflog引用的提交被认为是可访问的。
这个提交的状态究竟是什么?如何列出具有类似状态的所有提交
通过--no-reflogs
说服git fsck
向他们展示。
如何删除那些提交?
一旦您的reflog条目过期,那么这些对象也将被清除git gc
。
到期由调控gc.pruneexpire
,gc.reflogexpire
和gc.reflogexpireunreachable
设置。参看 git help config
。
默认值都很合理。
TA贡献1876条经验 获得超5个赞
要删除所有悬空提交以及可从reflog中访问的提交,请执行以下操作:
git reflog expire --expire-unreachable=now --allgit gc --prune=now
但请确保这是你想要的。我建议你阅读手册页,但这里是要点:
git gc
删除无法访问的对象(提交,树,blob(文件))。如果某个对象不属于某个分支的历史记录,则该对象无法访问。实际上它有点复杂:
git gc
做其他一些事情,但它们在这里并不重要,也没有危险。
不会删除小于两周的无法访问的对象,因此我们使用的--prune=now
方法是“删除之前创建的无法访问的对象”。
也可以通过reflog访问对象。虽然分支记录了某个项目的历史记录,但是reflog记录了这些分支的历史记录。如果你修改,重置等提交将从分支历史记录中删除,但是如果你意识到你犯了错误,git会保留它们。Reflogs是一种方便的方法,可以找出在分支(或HEAD)上执行的破坏性(和其他)操作,从而更容易撤消破坏性操作。
因此,我们还必须删除reflog以实际删除从分支无法访问的所有内容。我们通过使--all
reflogs 到期来实现这一目标。git再次保留了一些reflog以保护用户,所以我们再次告诉它不要这样做:--expire-unreachable=now
。
由于我主要使用reflog来从破坏性操作中恢复,我通常会使用--expire=now
它来完全消除reflog。
TA贡献1777条经验 获得超10个赞
我有同样的问题,仍然遵循这个线程中的所有建议:
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
如果它不是reflog而不是分支,...它必须是一个标签!
git tag # showed several old tags created before the cleanup
我删除了标签git tag -d <tagname>并重新进行了清理,旧的提交已经消失。
- 3 回答
- 0 关注
- 1101 浏览
添加回答
举报