我向当地一家分店执行了31次移植手术,并想剥去2个移植物。问题是2个移植物位于中间的某个位置,31个中的第5个和第23个。
如何剥离这些移植物?另外,是否可以专门剥离这两个移植物而不是去除后续的移植物?
由于
答案 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
从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 prune -r 23
这将使所有变更集在23&#39;不稳定之后,因为它们现在基于标记为过时的修订版。你可以看到历史的新状态:
hg log --graph
过时的提交23将标有x
。
要修复因修改历史记录而导致的不稳定,请运行
hg evolve
哪个会
然后,再次运行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 log --hidden
未处于有效状态并且您的仓库中存在过时标记,则有时(例如,当您运行evolve
时)会收到类似hg log
<的警告/ LI>