我已经尝试了这个答案中的命令,但没有达到预期的效果。
考虑一个带有悬空提交的存储库:
git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (179/179), done.
dangling commit 133e2422a9ce64d8e784d3a8f9af37b2d6812b19
dangling commit 71e42dc763ac71460f5e17751e5ae5de330134c8
dangling commit 0e9bd340ab447fcd158a59dbcb617c1e77a21c08
dangling commit 5c173ab15f032f36ffdaa16edae30df6382a8183
dangling commit 9f1babbe53fdcfa7eb8e470de50177fbd885ee36
我运行了以下命令:
git reflog expire --expire-unreachable=now --all
git repack -a -d
git gc --aggressive --prune=now
然后我运行了
git fsck
并得到了相同的结果。
我正在跑步
git version 2.17.1
。
gc
命令是否有一些变体可以强制删除这些悬空提交?
更新:我将 git 升级到
git version 2.47.0
并观察到以下行为:
git fsck --no-reflogs
显示与以前相同的悬空提交。git fsck
不显示任何悬空提交。git reflog
显示没有输出。这表明清理引用日志的命令根本没有按预期工作,尽管它们确实导致
git reflog
的输出消失。
在尝试了更多的事情之后,我发现以下内容适用于
git 2.47
,尽管我不知道它是否也适用于旧的git
版本:
git reflog expire --expire=now --expire-unreachable=now --all
git prune
git repack -ad
结果是旧对象终于被清除了!
$ git fsck --unreachable --full --no-reflogs
Checking object directories: 100% (256/256), done.
Checking objects: 100% (49/49), done.