Version control Mercurial工作流:重定补丁分支时删除旧提交
我想了解哪种方法是实现我将要介绍的Mercurial工作流的更好方法。我知道我将如何在Git中实现它,我对Git更加自信,但在Mercurial中找不到令人满意的方法 工作流程如下:我想跟踪一个上游分支,其中开发工作由其他人完成,并在其上维护一个相当小的补丁分支。使用Git我要做的是:每次我想包含一些新的上游提交时,我都会在上游分支(或相关提交,顺便说一句)上重新设置补丁分支的基础,可能会修改一些提交,并强制将补丁分支推送到与我的合作者共享的存储库中(我知道非快进推进的问题,我的合作者也是如此;我们知道如何避免问题) 我想对Mercurial也这么做,主要的问题是每次我推一个新的头,前一个头不会像Git那样被删除(好的,提交并没有被真正删除,但它们实际上已经消失了,因为它们不再是任何分支的祖先;它们最终会被Version control Mercurial工作流:重定补丁分支时删除旧提交,version-control,mercurial,workflow,rebase,Version Control,Mercurial,Workflow,Rebase,我想了解哪种方法是实现我将要介绍的Mercurial工作流的更好方法。我知道我将如何在Git中实现它,我对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
- 仅提交并推入您的回购
branchANYNAME
(副作用:来自上游的mergeset的父级也将被推入)hg push-b ANYNAME
- 在您的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;我从来没有看过或者。谢谢。供将来参考:为了删除注释,您必须进入存储库管理页面,然后选择“删除更改集”。查看更改集时,您不能直接这样做。