在Mercurial中找到拉,移植,剥离工作流的尖端的根变更集

时间:2013-03-14 19:34:00

标签: mercurial

如果我有一个看起来像这样的回购:

A--B--C--D
    \
     E--F--G

如何指定修订版E?我可以做一些像-r'祖先(D,G)'来获得B,但我想要一种合理的方式来指定E。

另外,让我解释为什么我这样做以防万一有更好的工作流程。

在上图中,A - B - C位于主存储库中。 A - B - E - F - G在我自己的私有分叉存储库中,我需要将F(和F)合并到主仓库中。要做到这一点,我将我的私人仓库拉入主,然后移植F(创建D),然后使用hg strip扩展删除E - F - G然后再推回到主仓库。

目前,我通过打开gui工具并查看分支图片并手动从该工具复制粘贴修订版E来实现此目的。我不喜欢使用GUI工具来实际管理repo,所以我只是将该修订版粘贴到hg strip的终端中。这是我在gui工具中唯一需要做的事情,而且每次我这样做时我都不需要启动它。我想要的是弄清楚如何指定修订版,然后在该修订版上做一个hg strip的alais

2 个答案:

答案 0 :(得分:2)

我认为min(descendants(max(ancestor(D,G))) and not ancestors(D))会得到你想要的东西。

它找到D和G的最新共同祖先(max(ancestor(D,G))),得到它的所有后代,然后排除D的祖先。最后,它使用min()来获得该组中最老的这是E。

在您的示例中并不真正需要max(),但是您可以在某个时刻将主分支合并到您的分支中。您可以删除它以缩短查询时间。您也可以使用::作为ancestors()descendants()以及!的快捷方式缩短它,作为not的快捷方式,这会让您看起来很疯狂{{1} }}

我真的不会把这个转换传递给min(ancestor(D,G)::) and !::D)。我会确保它在剥离之前提供你想要的修订。

我会考虑在此工作流程中使用Mercurial Queues扩展名。您基本上将E,F和G保留在补丁队列中,取消应用所有这些,拉,更新到C,应用F并丢弃E和G.这将是这样的:

hg strip

其中F,E和G是您使用> hg qpop all > hg pull -u > hg qpush --move F > hg qdelete E > hg qdelete G 创建的补丁文件的名称。对我来说这似乎是一个更好的工作流程,并且不涉及使用复杂的revset查询删除提交。

答案 1 :(得分:0)

我实际上找到了一个更好的解决方案,因为我正在使用远程存储库。

我有一个remote1包含A--B--C和一个remote2 A--B--E--F--G,我想将F移植到remote1。< / p>

这是我提出的工作流程,从remote1的本地克隆开始(使用outgoing解决根问题)

$ hg pull remote2
$ hg graft F
$ hg push -r tip
$ hg strip -r 'roots(outgoing())'