当其父级或祖先被移除/剥离时,如何恢复 hg 搁置?

问题描述

我在执行一系列 rebase、strip 和 shelve 操作时似乎犯了一个错误。结果是我无法上架。当我在当前状态下运行 hg unshelve 时,它只会抛出一个丑陋的错误

# hg unshelve
unshelving change 'repo-02'
abort: 00changelog.i@5bd4b71e0176: unkNown parent!

我认为发生的事情是在搁置更改(或者可能是一系列搁置)之后,我剥离/重新确定了作为搁置依赖项的提交。

货架对许多“随机文件进行了更改 - 这意味着它们的更改是不相关的(主要是临时调试输出,诸如此类)。因此,即使单个剥离的文件消失了,搁架的其余部分也应该可以使用 - 但我怎样才能克服这个错误

解决方法

解决此问题的一种方法可能是撤消剥离的变更集。但在我这样做之前,我找到了另一种有效的方法,我认为这最终更简单,因为我有大量的条带备份要处理。


查看 .hg\shelved\ 文件夹,我实际上有来自几个搁置“事件”的数据文件。它们看起来像这样:

repo-01.hg
repo-01.patch
repo-01.shelve
repo-02.hg
repo-02.patch
repo-02.shelve
repo.hg
repo.patch
repo.shelve

阅读这些文件内容后,我注意到 .patch 文件确实是标准的差异样式补丁。

此外,通过查看所有 3 个书架的内容,我可以确定我真正需要的只是“repo.patch”(最旧的)。

(最初我尝试删除 01 和 02 文件并取消搁置,但这产生了不同的错误,所以我改变了方向。)

然后我跑了:

hg patch --no-commit repo.patch

来自该文件夹。这基本上工作正常,现在我的工作文件夹再次包含修改过的文件,并且它们检查出具有预期的内容。

有趣的是,由于原始错误(剥离提交),该补丁中的一个文件未能应用 - 因为该文件不再存在。但幸运的是,hg patch 的弹性足以跳过这一点。由于文件是故意删除的,所以这不是问题。

按照上述,我使用了:

hg shelve --cleanup

摆脱凌乱的状态。搁置/取消搁置现在再次正常工作。