hg mq(嵌套|子|子)队列

时间:2013-06-20 19:20:29

标签: version-control mercurial dvcs

我知道这不是一个hg功能,但也许有人知道如何获得类似的东西。希望我的描述有意义:

我发现保持主线(即默认分支)在补丁队列中提交几周让它们“解决”是有用的。但是,我也希望能够通过新队列创建主题分支。这两个想法是互斥的,因为您无法从应用的补丁开始创建新队列。听起来这样做的唯一方法是最终确定我的主线补丁,并从qparent提交开始分支队列,并通过将最终补丁导回mq来处理调整。还有其他想法吗? git在这种工作流程中更好吗?

3 个答案:

答案 0 :(得分:0)

您可能需要查看https://www.mercurial-scm.org/wiki/ChangesetEvolution

很有可能这个工作流程在git中稍微容易一些。

答案 1 :(得分:0)

我将以“我没有尝试过,并且不知道它是否会起作用,或者它是否是您想要的”来回答这个问题。

当您为存储库创建MQ时,它会将其创建为当前存储库中的新Mercurial存储库,因此您的内部结构如下所示:

.hg\
  cache\
  patches\
    .hg\
    .hgignore
    patch1
    patch2
    series
    status
  store\
  hgrc
  ...

你可以直接在补丁库上进行操作(事实上,如果你像我一样,你会设置一些脚本来轻松地在那个仓库上工作 - 对我来说,我有mq命令)。

由于MQ本身就是一个存储库,它可以被提交,拉取,推送等。理论上,这可能包括分支。

可能的工作流程是,每当您认为自己对补丁感到满意时,就会将其提交到补丁回购:

hg qnew Patch3 -m "something"
...
hg qref
mq commit -m "happy with patch3"

请注意,这不是将补丁提交到主存储库,而是简单地存储补丁的历史记录。如果在某些时候你决定要创建一个分支,你可以用:

mq branch SomeBranch
hg qnew Patch4 -m "something else"
...
hg qref
mq commit -m "Committing to the new patch branch"
mq update default

Patch4补丁现已分支,并且即使在未应用的列表中也不会出现在补丁系列中。

这是一个可行的解决方案,但是需要在测试存储库上进行全面测试,如果你不小心它也可能会出错。

答案 2 :(得分:0)

mq具有guard功能,可以为您提供所需的灵活性,如in the hgbook所述。假设您有三个补丁:

  • patch-a - 您正在让“解决”的主线补丁
  • patch-b - 对feature1进行了不完整工作的新补丁
  • patch-c - 一个新的补丁开始feature2

您只需要在需要时指定一名警卫:

hg qpop -a
hg qguard patch-b +feature1
hg qguard patch-c +feature2
hg qselect feature2
hg qpush -a

此时,mq将推送所有无人看守的(patch-a)和受到保护的(patch-c)补丁,跳过patch-b,因为它有一个不是目前已选中。始终应用无人看守的补丁。还有一些负面防护装置(例如hg qguard -- -feature1)可以防止在选择防护装置时应用补丁。

切换到feature1:

hg qpop -a
hg qselect feature1
hg qpush -a

请注意,如果您在修补程序队列中执行了大量工作,则应经常提交队列本身以跟踪队列中的更改(使用hg com --mq)。