在 Mercurial 中,是否可以强制过时的变更集变得不过时?

问题描述 投票:0回答:5

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

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

使用

hg strip
删除后继者后,原始变更集仍被标记为过时和灭绝)。
hg evolve
拒绝重新创造继任者。

编辑:新解决方案:

hg undo
参见下面的答案

mercurial
5个回答
16
投票

您无法取消将更改标记为已过时,但您可以使用“

hg touch <rev> --hidden
”将其恢复生机,其中 touch 是一个新命令,是 evolve 扩展的一部分。

FWIW。也可以对过时的更改进行重新设置,但如果您使用触摸,您可能会遇到更少的并发症。


13
投票

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

解决方案位于user3771782018年4月18日的回答:

hg --hidden debugobsolete --delete <revindex>

请注意,您不使用变更集 ID。 您必须使用索引号(至少在 Mercurial 4.1.3 中)。 运行

hg --hidden debugobsolete --index
获取带有过时标记的变更集列表。找到您想要不再过时的变更集的索引,然后运行
hg --hidden debugobsolete --delete <revindex>
,并将该索引替换为 revindex。 那么你的过时变更集就不再过时了。 (它可能多次出现在列表中——我还没有彻底调查过。)

debugobsolete 命令当前未在 evolve 用户指南中列出,甚至在恢复过时的更改集部分中也是如此。 但是,它列在Evolve How To指南中。

非常感谢用户377178。


3
投票

我提出了以下 bash 函数 - 一个 hack,可能依赖于 Mercurial 版本,但多年来一直运行良好。以转速作为参数。

function hg_unhide() {
  for i in $(hg --hidden  log --template '{node}\n' -r "$1"); do
    hg --hidden debugobsolete --index | grep $i | awk '{ print $1;}' | \
      xargs -r hg --hidden debugobsolete --delete
  done
}

3
投票

当前的 Mercurial 文档 Evolve:用户指南对此进行了讨论。

恢复过时的变更集

有时您可能会废弃某个变更集,然后又改变主意。您可能会开始寻找“未过时”的命令来恢复 更改为正常状态。由于复杂的实施原因, 该命令不存在。 ...

相反,evolve 提供了一个

touch
命令来复活过时的 变更集。

一个意想不到的怪癖:你几乎肯定需要使用

--hidden
,因为过时的变更集往往是隐藏的,而且你不能 否则引用隐藏的变更集。

典型用法如下所示

$ hg --hidden touch REV

这将创建一个新的、正常的变更集,与

REV
相同 - 除了 具有不同的变更集 ID。新的变更集将具有相同的 父代为
REV
,并将成为
REV
的后继者。

目前

hg touch
的实施并不理想,并且很可能 来改变未来。 ...

(强调)


也就是说,我个人发现将过时的变更集重新投入使用更简单。您可以在 TortoiseHG 中轻松完成此操作,例如只需选择所需的过时项并将它们全部移植到一批中即可。从技术上讲,嫁接可能在过时系统之外(或绕过)工作,但考虑到使用上面提到的

graft
的复杂性,我发现简单性是值得的。
    


1
投票

touch


或其别名

hg rewind


我说“前沿”是因为虽然这个命令已经发布并且似乎可以工作,但我找不到太多关于它的文档,尽管

hg undo

命令行帮助确实包含它(如下)。它可能仍被视为

实验性
(截至 2022 年)。

hg

似乎有可能取代

hg rewind

这是一个使用示例:

hg touch

这些命令的最终效果是让事情与我开始的地方完全相同。 
% hg rebase --dest=25707 --source=26017 rebasing 26017:5c78e2af32cb "message 1" rebasing 26018:f156002253b3 "message 2" ... [command completed successfully Fri Apr 29 09:07:15 2022] % hg rewind rewound to 33 changesets (33 changesets obsoleted) working directory is now at 0ad018a90b93

花费的时间与

rewind
一样长。

内置帮助说明如下:

rebase

重要的是,该帮助还包括以下注意事项:

目前的粗糙边缘:

    fold:仅回退到一些最初折叠的变更集 将要 有问题。折叠结果被标记为过时且该部分未标记为过时 倒回至“丢失”。 需要时请使用 --as-divergence 执行这样的操作。
  • “hg rewind”可能会影响当前堆栈之外的变更集。 没有 --确切地说,我们还恢复了倒带目标的祖先,废弃的 他们最新的继任者(除非提供了 --as-divergent )。在一些 在这种情况下,这些最新的继任者将位于与 您回退的变更集。 (我们计划自动检测这种情况 未来)
有关
% hg undo --help hg rewind [--as-divergence] [--exact] [--keep] [--to REV]... [--from REV]... aliases: undo rewind a stack of changesets to a previous state This command can be used to restore stacks of changesets to an obsolete state, creating identical copies. There are two main ways to select the rewind target. Rewinding "from" changesets will restore the direct predecessors of these changesets (and obsolete the changeset you rewind from). Rewinding "to" will restore the changeset you have selected (and obsolete their latest successors). By default, we rewind from the working directory parents, restoring its predecessor. ... % hg --version Mercurial Distributed SCM (version 5.9.2) ...

的一些面向 Mercurial 开发人员的注释是:


    https://www.mercurial-scm.org/wiki/CEDConcept
  • https://octobus.net/blog/2018-09-03-evolve-status-2018-08.html
  • https://www.mail-archive.com/
  • [电子邮件受保护]/msg00052.html
© www.soinside.com 2019 - 2024. All rights reserved.