mercurial - 当 hg 恢复中止时如何恢复存储库?

标签 mercurial

由于未知原因,HG 命令失败并显示以下消息:

abort: abandoned transaction found - run hg recover!

但是当我尝试使用recover来摆脱废弃的交易时,我得到了一个不同的错误:

$ hg recover
rolling back interrupted transaction
attempted to truncate path/to/file to 12345 bytes, but it was already 456 bytes

然后就中止了。实际文件的命名如下:

_some_filename.cs.i

这是一个内部 HG 数据文件。因此,some_filename.cs 的 HG 数据记录似乎已严重损坏。事实上,运行 hg verify 会显示如下错误:

# hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
 warning: revlog 'data/project/folder/some_filename.cs.i' not in fncache!
 13691: empty or missing project/folder/some_filename.cs
 project/folder/some_filename.cs@13691: manifest refers to unknown revision b269f6036278
 project/folder/some_filename.cs@13741: manifest refers to unknown revision 651b96abf6da
 ...

(持续很长时间)

这证实了文件已损坏,但没有做任何有用的事情来修复它。

hg recovery --help 没有显示我可以做的任何其他事情...

除了这个文件明显损坏之外,此时普通的 HG 命令不起作用。他们都报告存储库已损坏。我该如何恢复?

最佳答案

我的结论是,这只是 HG 无法处理的情况。无论出于何种原因,HG 的内部数据文件(.i 文件)被破坏。

查看产生关键错误的 HG 源代码很有帮助:

if fp.tell() < o:
    raise error.Abort(
        _(
            b"attempted to truncate %s to %d bytes, but it was "
            b"already %d bytes\n"
        )
        % (f, o, fp.tell())
    )

( https://fossies.org/linux/mercurial/mercurial/transaction.py )

我对 HG 的内部结构不是特别熟悉,但这似乎足够清楚地表明 HG 无法处理这种情况(可以理解 - 任意破坏其数据文件之一几乎没有选择!)。

我能想到的最佳解决方法是从存储库的另一个副本(在另一台 PC 上)手动复制损坏的 .i 文件。我实际上没有对该源文件进行本地更改,因此这似乎是合理的。

我复制了该文件(先备份并替换损坏的原始文件)。

然后运行hg recovery现在能够解决原来的“放弃交易”问题。其他 HG 命令也可以工作。

值得注意的是,运行 hg verify 仍然会报告一些错误(尽管少得多)。也许这个单一文件的历史仍然不正确;最终我认为我需要重新克隆这个存储库,但至少我可以完成我的即时任务而不会丢失任何工作。

关于mercurial - 当 hg 恢复中止时如何恢复存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68729834/

相关文章:

mercurial - 是否可以通过添加 subrepos 来更新?

mercurial - 如何修复 "AttributeError: ' 模块“对象没有属性 'set_binary'”?

mercurial - hg 对中央存储库的访问控制

visual-studio-2010 - 在 Visual Studio 中本地使用 BitBucket 存储库

svn - Git 对比 Mercurial 对比 SVN

windows - 没有管理员权限的用户的独立 Mercurial(或其他 SCM)客户端?

regex - 如何忽略除一个目录及其子目录中的特定扩展名的所有文件?

Mercurial 用于 merge 多个头

mercurial - 如何设置默认存储库

带有 DiffMerge 设置的 git 来模仿带有 diffmerge 的 Mercurials 设置