在Mercurial中,过时的变更集可能会被迫变得过时吗?

Pet*_*ter 11 mercurial

在Mercurial中,具有后继的变更集标记为过时.

这个标记可以(强制)以某种方式被移除吗?

在使用hg strip删除后继者之后,原始变更集仍然标记为过时和已灭绝).hg evolve拒绝重新创建继任者.

小智 10

您无法将更改标记为已过时,但您可以使用" hg touch <rev> --hidden" 将其恢复生命,其中touch是一个新命令,它是evolve扩展的一部分.

FWIW.也可以改变过时的变化,但如果使用触摸,你可能会减少并发症.

  • 有趣.我测试了两个过时的变更集`2`和`3`.`hg touch 2 :: 3 --hidden`将两者都带回`4 :: 5`.只需`hg touch 2 --hidden`然后`hg touch 3 --hidden`也会将它们带回"4"和"5",但"5"不是"4"的后代.出于这个原因(以及在TortoiseHG中还没有`touch`的事实)我发现rebase实际上更方便.是否有任何特殊的并发症需要注意? (3认同)
  • 对于任何想知道`hg touch`在内部做什么的人来说,`hg log --debug --hidden`表明它添加了一个`__touch-noise __ = <somenumber>``extra`属性,所以即使所有其他的变换集散列也是不同的变更集属性保持不变. (3认同)

小智 8

是! 您现在可以删除过时标记。有人问这个问题,也许在2015年是不可能的。

解决方案在user377178的 2018年4月18日的答案中: hg --hidden debugobsolete --delete <revindex>

请注意,您不使用变更集ID。您必须使用索引号(至少在Mercurial 4.1.3中使用)。运行hg --hidden debugobsolete --index以获取带有过时标记的变更集列表。查找您要变得不再过时的变更集的索引,然后hg --hidden debugobsolete --delete <revindex>使用代替revindex的索引运行。然后,您过时的变更集将不再过时。(它可能多次出现在列表中-我尚未进行彻底调查。)

目前,即使在关于恢复过时变更集的部分中,debugobsolete命令也未在Evolution 用户指南中列出。但是,它在“ 演变方式”指南中列出。

非常感谢user377178。