如何修复GIT错误:HEAD:无效的reflog条目xxxxxxxxxxxxxxx

9

之前我遇到过一个错误(GIT error: object file is empty)

error_object_file_is_empty

然后我使用了在如何修复GIT错误:object file is empty?中提到的方法。我更新了HEAD指针指向一个好的对象,它确实可以解决问题。但是当我重启机器时,同样的错误(object file is empty)又出现了。 我尝试使用find . -type f -empty -delete来删除所有空文件,并输入git fsck --full,然后就出现了新的错误(GIT error: HEAD: invalid reflog entry xxxxxxxxxxxxxxxx)。

error_invalid_reflog_entry

我的GIT有什么问题吗?还是只是因为我的操作不当? 如何解决这个问题?


首先,请备份整个代码库以防万一。接下来,请尝试在代码库内运行“git update-ref -d”。这可能有助于您解决此问题,但我对此特定问题并不是很熟悉。如果这不起作用,请告诉我,以便我可以提供更多帮助。如果正确的话,让我发布一个答案,以便您可以标记它。 - Daniel Anner
2个回答

23

使用的命令是git reflog expire --stale-fix --all

这里的奥秘在于--stale-fix选项,它将修剪任何指向无法访问的提交并引用缺失对象的reflog条目。


2
这个命令成功地清理了我在 git fsck --full 中遇到的所有错误。 - mikew
修复仓库后,我应该执行 git commitgit push 吗? - arielma
@arielma 现在应该可以使用 git commitgit push 了(但最好使用 git fsck --full 进行验证)。 - lucvoo
对我来说没有起作用,我得到了“fatal: bad tree object 727e795836deba03ac658a22f1e714ede7ea3c8a”。 - R Nanthak
如果您不想过期任何东西,除了损坏的条目,您还可以使用“--expire=never”。 - Stavros

1

使用的命令是 git reflog expire --stale-fix --all

但请确保使用 Git 2.31(2021年第一季度)

"git reflog expire --stale-fix"(man) 可用于修复reflog,通过删除指向已被修剪的对象的条目,但不会小心地容忍缺失的对象。

请看提交 c809798(2021年2月10日),作者为Johannes Schindelin (dscho)
(由Junio C Hamano -- gitster --合并于提交 e68f62b,2021年2月17日)

reflog expire --stale-fix:对丢失的对象要宽容些

签名作者:Johannes Schindelin

每当用户运行 git reflog(man) expire --stale-fix 命令时,最有可能的原因是他们的存储库至少在某种程度上已经损坏。
这意味着某些对象可能已经丢失。 如果是这种情况,当前命令会尝试标记所有可达对象的阶段可能会中止。 在这种情况下,我们不应该雪上加霜,而是应该尽可能地继续进行,通过忽略缺失的对象并继续执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接