如何使用Mercurial和IntelliJ IDEA 2016.1.3去除移植物

时间:2016-07-26 19:16:04

标签: intellij-idea mercurial tortoisehg

我向当地一家分店执行了31次移植手术,并想剥去2个移植物。问题是2个移植物位于中间的某个位置,31个中的第5个和第23个。

如何剥离这些移植物?另外,是否可以专门剥离这两个移植物而不是去除后续的移植物?

由于

1 个答案:

答案 0 :(得分:1)

您可以使用evolve扩展程序执行此操作。 Here are the evolve docs.这是一把锋利的刀,但却是一个非常人性化的刀。主要建议:不要在已推送的变更集上使用它。让我们重复一遍:

假设:您尚未推送任何您要删除的更改集,也不推送任何后代。

检查这个假设。 Do(如果4是您要修剪的最早变更集的编号):

hg log -r 'descendants(4)' --template '{rev}: {phase}\n{desc|firstline}\n'

这将打印每个changset,然后是其阶段,以及其提交消息的第一行。

这些阶段都不应该是public;所有这些都应该是draft。 (或secret,但如果您了解secret阶段,那么您就可以清楚地了解阶段。)

另一个假设:

hg log --version
# Should be at least 3.4

安装hg-evolve

the wiki获取的说明。首先,克隆evolve存储库,并签出与您运行的任何版本的mercurial相对应的标记。有3.4,3.5,3.6,3.7和3.8的标签。 Ubuntu Xenial附带Mercurial 3.7。

cd <dir>
hg clone https://www.mercurial-scm.org/repo/evolve/ --updaterev mercurial-3.7

然后编辑你的.hgrc:

[extensions]
evolve = <dir>/src/evolve-main/hgext/evolve.py

在克隆中工作,只是为了感觉安全

为了您的安心,请在克隆中执行此操作。要确保克隆的变更集保持在draft阶段,请将当前仓库设置为非发布,然后再将其撤消;否则,克隆的提交将在服务器repo(与之对话的服务器)和客户端(运行clone / pull / push命令的服务器)上标记为public。 Evolve扩展只会更改包含草稿更改集的历史记录树的部分内容。

将服务器仓库,即您当前正在处理的服务器仓库标记为非发布,在其hgrc中:

cd my-project
hg config --local

在回购协议中:

[phases]
publish = False

接下来,创建克隆。

cd ..
hg clone my-project my-project2
cd my-project2

告诉hg修剪变更集和修复历史记录

hg prune -r 23

这将使所有变更集在23&#39;不稳定之后,因为它们现在基于标记为过时的修订版。你可以看到历史的新状态:

hg log --graph

过时的提交23将标有x

要修复因修改历史记录而导致的不稳定,请运行

hg evolve

哪个会

  • 采取第一个不稳定的变更集(24),
  • 在23岁以上的继任者中创造了一个稳定的继任者 - 因为23人被修剪,24人将被移到22号.24的继任者将是例如32。
  • mark 24 assolete。
  • 如果存在合并冲突,因为变更集24假设由23提供的上下文,系统将提示您解决冲突。

然后,再次运行hg evolve;这将在正确的位置创建下一个不稳定变更集的继任者(25位于24位; 24位的继任者位于32位,因此在32位上创建33位)。

反复运行hg evolve,直到所有不稳定的变更集都已解决。一旦你确信hg evolve做了正确的事情(确实如此),你可以运行hg evolve --all一个接一个地移动它们,直到没有不稳定的变化为止。

现在,过时的变更集将自动隐藏:不再存在依赖于它们的非过时变更集。

hg log --graph  # hides obsolete commits if they are irrelevant
hg log --graph --hidden  # also shows all obsolete commits

完成后,您可以以相同的方式删除提交4:

hg prune -r 4
hg evolve --all

如果您想查看包含过时变更集的历史记录

hg log --graph --hidden

将您的更改恢复为主仓库

my-project2回购中,只需推迟更改

即可
hg push

这会将新的继承者提交回my-project。它还将推动被继承者修剪或替换的过时标记。

清理

  • 删除my-project2个回购(除非你想保留它)
  • 再次将my-project配置为publish = True(除非您从中提取/克隆除外)
  • 决定是否在您的扩展程序中保留hg-evolve。 Core Mercurial了解过时标记,因此您可以安全地使用{ - 1}}。另一方面,如果hg log --hidden未处于有效状态并且您的仓库中存在过时标记,则有时(例如,当您运行evolve时)会收到类似hg log <的警告/ LI>