如果我有一个看起来像这样的回购:
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
答案 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())'