是否可以强制删除Git中所有无法访问的对象?

问题描述 投票:0回答:1

我已经尝试了这个答案中的命令,但没有达到预期的效果。

考虑一个带有悬空提交的存储库:

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
1个回答
0
投票

在尝试了更多的事情之后,我发现以下内容适用于

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.
© www.soinside.com 2019 - 2024. All rights reserved.