0

如果我有一个看起来像这样的仓库:

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

如何指定修订版 E?我可以执行类似 -r 'ancestors(D,G)' 的操作来获得 B,但我想要一种合理的方式来指定 E。

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

在上图中,A--B--C 位于主存储库中。A--B--E--F--G 在我自己的私有分叉存储库中,我需要将 F(并且只有 F)合并到主存储库中。为此,我将我的私人仓库拉入主仓库,然后嫁接 F(创建 D),然后使用 hg 条扩展删除 E--F--G,然后推回主仓库。

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

4

2 回答 2

2

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

它找到 D 和 G ( ) 的最新共同祖先max(ancestor(D,G)),获取其所有后代,然后排除 D 的祖先。最后,它用于min()获取该集合中最老的 E。

在您的示例中,这max()并不是真正需要的,但涵盖了您可以在某个时候将主分支合并到您的分支中的机会。您可以删除它以使查询更短。您也可以通过将其::用作ancestors()descendants()!快捷方式来缩短notmin(ancestor(D,G)::) and !::D)

我真的不会只是将这个修订集传递给hg strip。我会确保它在剥离之前给出你想要的修订。

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

> hg qpop all
> hg pull -u
> hg qpush --move F
> hg qdelete E
> hg qdelete G

其中 F、E 和 G 是您使用hg qnew. 对我来说,这似乎是一个更好的工作流程,并且不涉及使用复杂的 revset 查询删除提交。

于 2013-03-15T08:42:59.870 回答
0

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

我有一个remote1that containsA--B--C和一个remote2that hasA--B--E--F--G并且我想移植Fremote1.

这是我想出的工作流程,从remote1outgoing用于解决根本问题)的本地克隆开始

$ hg pull remote2
$ hg graft F
$ hg push -r tip
$ hg strip -r 'roots(outgoing())'
于 2013-07-10T20:55:46.520 回答