代码之家  ›  专栏  ›  技术社区  ›  Geoffrey Zheng

如何管理mercurial的并行开发?

  •  17
  • Geoffrey Zheng  · 技术社区  · 14 年前

    这是一个最佳实践问题,我希望答案是“视情况而定”。我只是希望了解更多真实世界的场景和工作流程。

    首先,我说的是同一个项目的不同变化,所以请不要再回购。

    假设您的代码库位于hg存储库中。你开始处理一个复杂的新特性a,然后一个复杂的bug B被你信任的测试人员报告(你有测试人员,对吧?)。

    如果B的修复依赖于A,那就很简单了。你只需要cia,然后cib。

    我的问题是当他们独立的时候该怎么办(至少现在看来是这样)。

    1. 为B使用单独的克隆。
    2. 在同一存储库中使用匿名或命名分支或书签。
    3. 使用MQ(在A上有B个补丁)。
    4. 使用分支MQ(我稍后会解释)。

    1和2由 excellent blog slightly related question .

    3可能是最简单的(就设置和开销而言),如果B是一个小的和/或紧急的修复,您可以翻转A和B的顺序。但是,如果A和B接触到同一个文件,它可能会变得很棘手。如果A和B的更改在同一个文件中是正交的,那么很容易修复无法应用的修补程序,但从概念上讲,这仍然有点风险。

    4可以让你头晕目眩,但这是最强大,灵活和可扩展的方式。我违约了 hg qinit 具有 -c

    1. hg qnew bugA ;为A进行更改; hg qref
    2. mq branch branchA; hg qci
    3. hg qpop; mq up -rtip^
    4. hg qnew bugB 汞柱qref
    5. mq branch branchB; hg qci
    6. 要再次使用 hg qpop; mq up branchA; hg qpush

    采取这么多步骤似乎很疯狂,每当你需要转换工作时,你就必须这样做 hg qci; hg qpop; mq up <branch>; hg qpush . 但是考虑一下:您在同一个存储库中有多个命名的发布分支,并且您需要同时处理多个项目和所有这些项目的bug修复(您最好获得这种工作的保证奖金)。你很快就会迷路的。

    现在,我的hg爱好者们,还有其他更好的选择吗?


    (更新) qqueue here .

    3 回复  |  直到 7 年前
        1
  •  7
  •   Brandon Rhodes    14 年前

    我总是使用命名分支,因为这让Mercurial能够完成它的工作:保存项目历史记录,并记住为什么对源代码进行了哪些更改。考虑到我的工作风格,在磁盘上放置一个或两个克隆通常是一个简单的问题,至少:

    1. 你的项目是否缺少一个构建过程,这样你就可以从源代码开始测试和运行东西了?那我就只想克隆一个 hg up 当我需要在另一个分支上工作的时候来回。

    2. 但是如果您有一个buildout、virtualenv或其他构建的结构,并且可能在两个分支之间发生分歧,那么 hg向上

        2
  •  3
  •   Community PPrice    7 年前

    似乎没有比我在问题中列出的更多或更好的选择了。他们又来了。

    1. 每个项目使用一个克隆。
      • 缺点:切换前必须提交,切换后重新生成。
      • 优点:简单易行。
      • qrefresh 在切换之前和之后重建;如果项目不是正交的,那么就很棘手而且有风险。
    2. qqueue 每个项目1.6+。
      • 缺点:必须 qcommit 在转换之前和之后重建;感觉复杂。

    像往常一样,没有什么灵丹妙药,所以挑选一个适合这份工作的。


    hg qnew; {coding}; hg qrefresh; {repeat}
    hg qfinish -a
    hg update -r <branch/bookmark/rev>
    hg qimport -r <rev>; {repeat}
    

    最后一步, qimport -a Meister Geisler 注意:)

        3
  •  1
  •   Brian Maltzan    14 年前

    所以问题是,当你被告知停止开发特性A,开始独立的特性B时,还有什么其他选择:如何使用mercurial管理并发开发?

    让我们看一下删除并发的问题,就像编写线程代码一样——定义一个简单的工作流来解决给定的任何问题,并将其应用于每个问题。一旦完成,Mercurial将加入这项工作。所以,程序员A将在功能A上工作。程序员B将在功能B上工作。两者都恰好是你。(如果我们有多核大脑就好了:)

    我总是使用命名分支,因为这让Mercurial能够完成它的工作:保存项目历史记录,并记住为什么对源代码进行了哪些更改。

    我同意布兰登的观点,但我想知道他是否忽略了功能A没有经过测试?在最坏的情况下,代码编译并通过单元测试, 与上一个签入不同的是,我将使用这个工具来帮助我回到特性A的轨道上。

    特性A的代码是否在您通常签入它的时候? 我的理由是,如果程序员C需要开始特性C,那么重新签出这个分支不再是最好的开始。 保持分支头健康,意味着您可以快速响应,并修复更可靠的错误。

    目标是让您的(测试和验证的)代码运行,因此您希望所有代码最终合并到(开发和遗留分支的)头中。我的观点似乎是,我已经看到分支的使用效率低下:代码变得过时,然后就不再使用了,合并变得比原来的问题更困难。

    只有你的选择1对我有意义。一般来说:

    1. 你应该认为你的代码是有效的,在别人看到之前。
    2. 如果有其他人发现问题,请进行分支和签入。
    3. 分支,如果您的自动化系统或测试人员只需要您的代码。
    4. 如果你是一个团队的一员,正在解决一个问题,那么你就可以进行分支。把它当作头,见1-4。

    推荐文章