Version control Mercurial工作流:重定补丁分支时删除旧提交

Version control Mercurial工作流:重定补丁分支时删除旧提交,version-control,mercurial,workflow,rebase,Version Control,Mercurial,Workflow,Rebase,我想了解哪种方法是实现我将要介绍的Mercurial工作流的更好方法。我知道我将如何在Git中实现它,我对Git更加自信,但在Mercurial中找不到令人满意的方法 工作流程如下:我想跟踪一个上游分支,其中开发工作由其他人完成,并在其上维护一个相当小的补丁分支。使用Git我要做的是:每次我想包含一些新的上游提交时,我都会在上游分支(或相关提交,顺便说一句)上重新设置补丁分支的基础,可能会修改一些提交,并强制将补丁分支推送到与我的合作者共享的存储库中(我知道非快进推进的问题,我的合作者也是如此;

我想了解哪种方法是实现我将要介绍的Mercurial工作流的更好方法。我知道我将如何在Git中实现它,我对Git更加自信,但在Mercurial中找不到令人满意的方法

工作流程如下:我想跟踪一个上游分支,其中开发工作由其他人完成,并在其上维护一个相当小的补丁分支。使用Git我要做的是:每次我想包含一些新的上游提交时,我都会在上游分支(或相关提交,顺便说一句)上重新设置补丁分支的基础,可能会修改一些提交,并强制将补丁分支推送到与我的合作者共享的存储库中(我知道非快进推进的问题,我的合作者也是如此;我们知道如何避免问题)

我想对Mercurial也这么做,主要的问题是每次我推一个新的头,前一个头不会像Git那样被删除(好的,提交并没有被真正删除,但它们实际上已经消失了,因为它们不再是任何分支的祖先;它们最终会被
git gc
真正删除,这对我来说没什么关系)。所以我的存储库仍然被许多我不想要的旧提交所污染。我找不到任何方法来删除它们(除了可能一个接一个地删除它们,但这并不是一个真正的解决方案)

Mercurial有没有更好的方法

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

编辑:由于有人询问更多详细信息,我尝试更准确地回答。我从以下存储库开始:

C <upstream>
|
B
|
A
|
F' <patch>  F
|           |
E'          E
|           |
D'          D
|           |
I ----------+ <upstream>
|
H
|
G
|
C
|
B
|
A
|
C
|
B
|
A.
|
然后我在上面开发了一些补丁:

F <patch>
|
E
|
D
|
C <upstream>
|
B
|
A
|
F
|
E
|
D
|
C
|
B
|
A.
|
在某个点上,上游会添加更多提交:

F <patch>  I <upstream>
|          |
E          H
|          |
D          G
|          |
C ---------+
|
B
|
A
|
fi
|          |
E H
|          |
D G
|          |
C---------+
|
B
|
A.
|
我在上面重新设置了我的补丁分支的基础,或许可以修改补丁中的某些内容,然后到达这里:

F' <patch>
|
E'
|
D'
|
I <upstream>
|
H
|
G
|
C
|
B
|
A
|
F'
|
E'
|
D'
|
我
|
H
|
G
|
C
|
B
|
A.
|
然后我将所有内容推送到远程Mercurial存储库:

C <upstream>
|
B
|
A
|
F' <patch>  F
|           |
E'          E
|           |
D'          D
|           |
I ----------+ <upstream>
|
H
|
G
|
C
|
B
|
A
|
F'F
|           |
E'E
|           |
D'D
|           |
我-----------+
|
H
|
G
|
C
|
B
|
A.
|
Mercurial不会自动删除D、E、F头,但我希望它消失。我经常做这个拉/重基/修改/推循环,并希望删除不再相关的旧遗留命令。我该怎么做


谢谢。

如果您的业务任务是

  • 从RepoOne获取更改
  • 将这些更改与主线合并
  • 将合并结果发布为两个
你至少有两种(不需要深入测试的肮脏思维)方法可以用更灵活的方式来实现

分支方式

  • 在单独命名的分支中维护主线
    ANYNAME
    !=默认值(默认值最可能由上游使用)
  • 在.hgrc的路径部分中设置upsteam repo,以便能够从中提取
  • 需要时,从团队中拉出
  • 合并到
    ANYNAME
    ,解决冲突(如果有)
  • 仅提交并推入您的回购
    ANYNAME
    branch
    hg push-b ANYNAME
    (副作用:来自上游的mergeset的父级也将被推入)
MQ方式

  • 在您的repo中启用MQ扩展
  • 在公共分支中将本地修补程序转换为MQ的修补程序集(位于上游代码之上)
  • 在.hgrc的路径部分中设置upsteam repo,以便能够从中提取
  • 需要时,从上游拉动
  • 对于修补程序交换,有两种方法
    • 如果将修补程序队列创建为存储库(
      hg qinit-c
      ),则除了“基本”之外,还可以推送此存储库
    • 在MQ上使用扩展将允许您直接与协作者交换和同步修补程序(协作者还必须具有MQ和MQCOLAB)

我知道痛苦,手边没有自动解决方案。我尽量不让太多的积垢堆积(定期使用
hg heads-t
检查),并使用
hg strip
从存储库中删除不需要的变更集。剥离不是一个接一个地完成的(变更集)相反,如果您选择了正确的变更集,那么通常每个重基周期只有一个条带,因为所有剥离的变更集的子代也会被剥离——存储库不能有孤儿。找到正确的变更集有点繁琐,但由于通常只涉及少数补丁,因此使用
hg glog

我认为您的问题在于Mercurial不会进行有损推送。也就是说,它没有内置的方式来远程删除分支(在拓扑意义上)。您可以访问远程吗?只需开始少考虑Git方式(并以更独立于VCS的方式描述您的业务任务,顺便说一句)我试图以一种与CVS无关的方式更清楚地重新表述。谢谢,这很有用。有没有办法在远程存储库上执行此操作?我正在使用的存储库托管在BitBucket上,因此我没有shell访问权限。据我所知不是这样,但您可以使用web界面剥离BitBucket上的更改集。它们可能有用于此目的的API;我从来没有看过或者。谢谢。供将来参考:为了删除注释,您必须进入存储库管理页面,然后选择“删除更改集”。查看更改集时,您不能直接这样做。