【发布时间】:2011-04-12 18:03:25
【问题描述】:
这是一个最佳实践问题,我希望答案是“视情况而定”。我只是希望了解更多真实世界的场景和工作流程。
首先,我说的是同一个项目的不同变化,所以请不要使用 subrepo。
假设您的代码库位于 hg 存储库中。您开始研究一个复杂的新功能 A,然后您信任的测试人员报告了一个复杂的错误 B(您有测试人员,对吗?)。
如果(修复)B 依赖于 A,这很简单。您只需 ci A 然后 ci B。
我的问题是当他们独立时该怎么办(或者至少现在看起来如此)。
我可以想到以下几种方式:
- 为 B 使用单独的克隆。
- 在同一存储库中使用匿名或命名分支或书签。
- 使用 MQ(B 补丁位于 A 之上)。
- 使用分支 MQ(我稍后会解释)。
- 使用多个 MQ(自 1.6 起)
1 和 2 由 @Steve Losh 的 excellent blog 覆盖,从 slightly related question 链接。
与其他选择相比,1 的一个巨大优势是,当您从一件事切换到另一件事时,它不需要任何重建,因为文件在物理上是分开且独立的。因此,例如,如果 A 和/或 B 涉及定义三态布尔值并被数千个 C 文件包含的头文件(不要告诉我你没有见过这样的遗留代码),那么它确实是唯一的选择基础)。
3 可能是最简单的(就设置和开销而言),如果 B 是一个小和/或紧急修复,您可以颠倒 A 和 B 的顺序。但是,如果 A 和 B 接触相同的文件,它会变得很棘手。如果 A 和 B 更改在同一个文件中是正交的,则修复无法应用的补丁块很容易,但从概念上讲它仍然有点风险。
4 可能会让你头晕目眩,但它是最强大、最灵活和可扩展的方式。我默认 hg qinit 和 -c 因为我想标记正在进行的补丁并推送/拉取它们,但确实需要一个概念上的飞跃才能意识到您也可以在 MQ 存储库中分支。以下是步骤(mq = hg --mq):
-
hg qnew bugA;对 A 进行更改;hg qref mq branch branchA; hg qcihg qpop; mq up -rtip^-
hg qnew bugB;对 B 进行更改;hg qref mq branch branchB; hg qci- 再次处理 A:
hg qpop; mq up branchA; hg qpush
采取这么多步骤似乎很疯狂,每当你需要换工作时,你必须hg qci; hg qpop; mq up <branch>; hg qpush。但是考虑一下:您在同一个存储库中有多个命名的发布分支,并且您需要同时处理多个项目并为所有这些分支进行错误修复(您最好获得此类工作的保证奖金)。使用其他方法你很快就会迷路。
现在我的汞爱好者,还有其他/更好的选择吗?
(更新)qqueue 几乎使 #4 过时了。请参阅 Steve Losh 的优雅描述 here。
【问题讨论】:
-
好像不是很明显,我要求一种基于 hg 的方法。但是,如果您可以从另一个适用于所有情况的 SCM 给我一个命令,那么我将放弃 hg。把它当作一个挑战吧,git 爱好者。
-
我认为您需要更好地说明您的问题。为什么这不适用于所有情况:修复错误 A,提交补丁,修复错误 B,提交补丁?
-
对不起,我有点啰嗦,Spolsky-ishly。我提到了一个简单的案例:“如果 B 是一个小的和/或紧急的修复”。更现实的情况是 A 和 B 都是需要大量提交和迭代的长期项目。另外,如果您有像我公司那样的代码审查流程,您可能已经完成了 A 并将其发送给审查,您不能坐在那里摆弄拇指等待审查者,所以您必须同时去接 B .但是随后审阅者可能会破坏您的代码,您必须进行更改以取悦他/她。所以一路上可能会有无数的项目切换。
-
我刚刚看到一个答案 (stackoverflow.com/questions/970669/…) 涵盖了 1 和 4 以获得更详细的示例。
-
好吧,看来您只是在独自完成这个项目。如果你在一个团队中工作,你可能永远不会问这个问题,因为并行开发将是你简单地做的事情,并且从容应对它的相对成本。在进行并行开发时,最佳实践显然是为每个功能指定一个命名分支,然后在功能或错误完成后合并到主干,根据需要从主干到您的分支进行尽可能多的合并,以在期间保持其他更改的最新状态此功能的开发。在运行测试之前不合并。
标签: mercurial workflow dvcs mercurial-queue