Mercurial的工作流程:在重新定义补丁分支时删除旧的提交

时间:2014-03-14 22:54:36

标签: version-control mercurial workflow rebase

我想了解哪种方式更好地实现了我将与Mercurial展示的工作流程。我知道如何在Git中做到这一点,我对此更有信心,但无法用Mercurial找到令人满意的方式。

工作流程如下:我想跟踪上游分支,其中开发工作由其他人完成,并在其上维护一个相当小的补丁分支。我将如何处理Git如下:每次我想要包含一些新的上游提交,我在上游分支(或相关提交,BTW)上修改我的补丁分支,也许修改一些提交并强制推送补丁分支到与我的协作者共享的存储库(我知道非快进推送的问题,我的协作者也是如此;我们知道如何避免问题)。

我想对Mercurial做同样的事情。主要的问题是,每次我推动一个新头,前一个不会像Git一样被删除(好吧,提交并没有真正删除,但它们几乎消失了,因为它们不是任何祖先分支了;它们最终会被git gc真正删除,这对我来说没问题。所以我的存储库仍然受到许多旧的提交的污染,我不再需要了。我无法找到任何方法来删除它们(除了可能一个一个地删除它们,但这不是一个真正的解决方案)。

使用Mercurial有更好的方法吗?

换句话说,我想要做的是自动删除所有在预定集合中不是某些提交的祖先的提交。

编辑:由于有人要求提供更多详细信息,我会尝试更精确。我从这个存储库开始:

C <upstream>
|
B
|
A
|

然后我开发了一些补丁:

F <patch>
|
E
|
D
|
C <upstream>
|
B
|
A
|

在某些时候,上游增加了一些提交:

F <patch>  I <upstream>
|          |
E          H
|          |
D          G
|          |
C ---------+
|
B
|
A
|

我在其上修改我的补丁分支,也许修改补丁中的内容并到达此处:

F' <patch>
|
E'
|
D'
|
I <upstream>
|
H
|
G
|
C
|
B
|
A
|

然后我推送远程Mercurial存储库中的所有内容:

F' <patch>  F
|           |
E'          E
|           |
D'          D
|           |
I ----------+ <upstream>
|
H
|
G
|
C
|
B
|
A
|

Mercurial并没有自动删除D,E,F头,但我希望它消失。我经常执行pull / rebase / modify / push循环,并且想要删除不再相关的旧剩余的commts。我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:1)

我知道疼痛并没有方便的自动解决方案。我尽量不要过多累积(使用hg heads -t定期检查)并使用hg strip从存储库中删除不需要的更改集。剥离不是逐个完成的(变更集),相反,如果你选择正确的变更集,那么它通常只是每个rebase循环的一个条带,因为所有剥离的变更集的后代也被剥离 - 存储库不能有孤儿。找到正确的变更集有点单调乏味,但由于通常只涉及少量补丁,因此使用hg glog并不太困难。

答案 1 :(得分:0)

如果您的业务任务

  • 从RepoOne获取更改
  • 将这些更改与您的主线
  • 合并
  • 将合并结果发布到RepoTwo

你有至少两个(没有深度测试的肮脏思维)以更多Mercurial方式做到的方法

<强>科路

  • 将主线维护在单独的命名分支ANYNAME中!=默认值(默认最常用于上游)
  • 在.hgrc的paths部分中设置upsteam-repo以便能够从中获取
  • 需要时,从upsteam拉
  • 合并到ANYNAME,解决冲突,如果有的话
  • 只提交并推送您的仓库ANYNAME分支hg push -b ANYNAME(副作用:上游合并的父母也会被推送)

<强> MQ-方式

  • 在您的仓库中启用了MQ扩展程序
  • 将您的本地补丁转换为MQ补丁集(在上游代码之上)的公共分支
  • 在.hgrc的paths部分中设置upsteam-repo以便能够从中获取
  • 需要时从上游拉
  • Merge patches with upstream
  • 对于补丁交换,您有两种方法
    • 如果将补丁队列创建为存储库(hg qinit -c),除了&#34; base&#34;
    • 之外,您还可以推送此存储库
    • 在MQ之上使用MQCollab扩展将允许您直接与协作者交换和同步补丁(必须同时具有MQ和MQCollab)