如何修复被 hg unshelve 损坏的存储库?

How can I repair a repository broken by hg unshelve?

我在存储库中使用了 hg shelve,其中有一些未完成的更改,因为我需要切换到不同的头并执行不相关的更改。

一旦我在另一个头上的工作被提交,我就切换回我最初使用 hg shelve 和 运行 一个 hg unshelve 命令的头。这是结果:

$ hg unshelve
unshelving change 'default'
adding changesets
adding manifests
adding file changes
added 1 changesets with 4 changes to 4 files (+1 heads)
abort: uncommitted changes
$ hg diff
warning: ignoring unknown working parent 893e15ecb5b4!
$ 

我在 unshelve 命令前后执行了 运行 hg head 并看到了相同的输出。提交 893e15ecb5b4 从未存在过,我不知道 Mercurial 从哪里得到它。

如果它有任何相关性,我在 Ubuntu 14.04 运行ning Mercurial 版本 2.8.2。

如何让我的存储库恢复工作状态,以及如何恢复搁置的更改?

以下步骤为我解决了问题:

  1. 使用 hg debugsetparents 将损坏的父版本号 893e15ecb5b4 替换为我在使用 unshelve
  2. 之前更新到的正确版本
  3. 因为上面的内容让我处于 Mercurial 忘记了所有本地更改的状态,所以我不得不使用 hg manifest | tr '\n' '[=13=]' | xargs -0 touch 让它再次注意到任何本地更改。
  4. 可以使用 patch -p1 < .hg/shelved/default.patch 恢复搁置的更改,在我的情况下,这正是 hg unshelve 首先应该为我做的。