mercurial - hg recover 中止时如何恢复存储库?
问题描述
由于未知原因,HG 命令失败并显示以下消息:
中止:发现被遗弃的事务 - 运行 hg 恢复!
但是当我试图用它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 数据文件。所以看起来 HG 数据记录some_filename.cs
被严重破坏了。确实运行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 recover --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 无法处理这种情况(可以理解 - 任意破坏其数据文件之一几乎没有选择!)。
我能想到的最佳解决方法是.i
从存储库的另一个副本(在另一台 PC 上)手动复制损坏的文件。我实际上并没有对该源文件进行本地更改,所以这似乎是合理的。
我复制了文件(先备份了损坏的原件)。
然后跑了hg recover
。这现在能够解决最初的“放弃交易”问题。其他 HG 命令也可以。
值得注意的是,运行hg verify
仍然会报告一些错误(尽管少得多)。也许这个单一文件的历史仍然不正确;最终我认为我需要重新克隆这个存储库,但至少我可以完成我的即时任务而不会丢失任何工作。
推荐阅读
- javascript - 在空数组上调用 .find() 会导致错误
- python - 在 Python Selenium 中获取视频的长度
- c - 如何使我的 if else 语句继续?
- firebase - Firebase Web Analytics:什么是应用版本以及如何设置它
- php - 预期响应代码为 250,但得到代码“550”,在 SendGrid 中显示消息“550 Unauthenticated senders not allowed”
- junit5 - 如何生成与 spring restdocs 和 spring contract 匹配的请求正文正则表达式?
- wordpress - 无法使用 get_post() 通过 REST API 检索自定义帖子类型数据
- php - 如何在 php 中从数据库中获取图像
- assembly - 为什么我不能在 linux 中使用 `write` 系统调用来实现写入?
- javascript - express-jwt-blacklist 抛出一个错误,例如 Error: JWT missing tokenId claimsub in my code