【问题标题】:How to recover an hg shelve when its parent (or an ancestor) has been removed/stripped?当其父(或祖先)已被移除/剥离时,如何恢复 hg 搁置?
【发布时间】:2021-01-19 18:12:35
【问题描述】:

在执行一系列变基、剥离和搁置操作时,我似乎犯了一个错误。结果是我无法取消搁置。当我在当前状态下运行hg unshelve 时,它只会抛出一个丑陋的错误:

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

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

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

【问题讨论】:

  • 听起来您使用的是过时的工作流程。您应该使用 Evolve 扩展和主题,它们使用非破坏性操作。而且您不应该使用hg strip,它具有破坏性并且早已过时。 hg shelve 偶尔有用,但也不应该成为您常规工作流程的一部分。
  • @FaheemMitha 我也使用 Evolve,但我不记得在这种情况下我为什么不这样做。
  • 如果您使用 Evolve,则确实没有理由使用 hg strip。除非 Evolve 有它的非破坏性变体。这似乎不太可能,因为它已经有 hg prune

标签: mercurial


【解决方案1】:

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


查看.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

摆脱凌乱的状态。 Shelve / unshelve 现在又可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多