Version control 如何管理具有多个重叠更改和每日重建的源代码管理更改集?

Version control 如何管理具有多个重叠更改和每日重建的源代码管理更改集?,version-control,Version Control,我在一家使用cvs进行版本控制的公司工作 我们开发和维护一个在线系统,涉及大约100个可执行文件——它们共享大量代码和大量支持文件 我们有一个总分支,活分支取自总分支。live分支代表大约每三个月发布一次的主要版本 此外,每天都有大量的bug修复,必须应用于两个live分支,这样它们就可以立即被带到live环境中,并合并回head分支,因此它们将出现在下一个主要版本中 我们最明显的困难是日常修复。因为我们每天都有很多修改,所以测试环境总是会有多个变化。通常,当为一个任务重建可执行文件时,对共享代

我在一家使用cvs进行版本控制的公司工作

我们开发和维护一个在线系统,涉及大约100个可执行文件——它们共享大量代码和大量支持文件

我们有一个总分支,活分支取自总分支。live分支代表大约每三个月发布一次的主要版本

此外,每天都有大量的bug修复,必须应用于两个live分支,这样它们就可以立即被带到live环境中,并合并回head分支,因此它们将出现在下一个主要版本中

我们最明显的困难是日常修复。因为我们每天都有很多修改,所以测试环境总是会有多个变化。通常,当为一个任务重建可执行文件时,对共享代码的未经测试的更改会包含在构建中,并被带到实时环境中

在我看来,我们需要一些工具来更好地管理变更集


我不是负责构建的人,因此我希望找到一个直接的过程来管理它,因为这将使我更容易让构建经理对采用它感兴趣。

我认为您需要的是更改存储库布局。如果我理解正确,您的存储库如下所示:

Mainline
|
 -- Live branch January (v 1.0)
|
 -- Live branch April  (v 2.0)
|
 -- Live branch July  (v 3.0)
因此,每个分支都包含所有站点(数百个)以及共享代码的文件夹

没有科学的方法可以准确判断发布后出现错误的可能性,但让我们看看两个最重要的因素:

  • 每时间单位提交的代码行数。您不能/不会希望全局更改此项,因为它是开发人员的生产力输出
  • 测试覆盖率,即在上线前执行代码的频率,以及涉及的代码库数量。通过在发布前给人们更多的时间进行测试,或者通过实现自动化测试,这一点很容易改变。这是资源问题
如果您的公司既不想花钱进行额外的测试,也不想降低发布频率(不一定是生产效率!),那么您确实需要找到一种方法来发布更少的更改,有效地减少每次发布的更改代码行数。 基于这种见解,让所有开发人员都投入到同一个分支中,并在那里每天运行多次听起来不是一个好主意,不是吗

你想要更多的孤立

大多数版本控制系统中的隔离由

  • 增加每个原子提交的修订号
  • 分支
  • 您可以尝试实现一个解决方案,将来自多个修订版的更改打包到发布包中,有点像版本控制系统“perforce”所做的那样。但我不会这么做,因为分支通常都比较容易。记住接吻的原则

    那么分支有什么帮助呢? 您可以尝试将今天必须上线的更改与明天或下周可能必须上线的更改隔离开来

    迭代分支

    Mainline
    |
     -- Live branch July  (v 3.0)
        |
         -- Monday (may result in releases 3.0.1 - 3.0.5)
        |
         -- Thuesday (may result in releases 3.0.6 - 3.0.8)
        |
         -- Wednesday (may result in releases 3.0.9 - 3.0.14)
    
    Mainline
        |
         -- Live branch July  (v 3.0)
            |
             -- Mysite-A (released when something in A changed and only released to the destination of A)
            |
             -- Mysite-B
            |
             -- Mysite-C
    
    Mainline
        |
         -- Live branch July  (v 3.0)
            |
             -- Mysite-A 
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
            |
             -- Mysite-B
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
            |
             -- Mysite-C
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
    
    人们需要花更多的时间考虑将他们的更改“定向”到正确的版本,但这可能会导致不太紧急的更改(尤其是共享/库代码),在版本之外和活动分支中停留更长的时间,在活动分支中,在活动之前,可能会偶然或系统测试发现这些更改(请参阅factor test coverage)。 当然,还需要进行额外的合并,有时还需要将实时分支中的更改提取到每日分支中

    现在请不要把我和日报的关系看得太文学化。在我的公司里,我们有两周的迭代,每个迭代都有一个发布分支,这就足够维持这个分支了

    您可以尝试按产品/站点进行隔离,而不是按天进行隔离

    项目分支机构

    Mainline
    |
     -- Live branch July  (v 3.0)
        |
         -- Monday (may result in releases 3.0.1 - 3.0.5)
        |
         -- Thuesday (may result in releases 3.0.6 - 3.0.8)
        |
         -- Wednesday (may result in releases 3.0.9 - 3.0.14)
    
    Mainline
        |
         -- Live branch July  (v 3.0)
            |
             -- Mysite-A (released when something in A changed and only released to the destination of A)
            |
             -- Mysite-B
            |
             -- Mysite-C
    
    Mainline
        |
         -- Live branch July  (v 3.0)
            |
             -- Mysite-A 
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
            |
             -- Mysite-B
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
            |
             -- Mysite-C
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
    
    在这种情况下,单个站点的代码以及所有需要的共享代码和库将驻留在这样一个站点分支中。 如果为了在站点A中工作而必须修改共享代码,您只需在站点A中更改共享代码。您还可以合并更改,以便任何人都可以跟上您的更改。追赶周期可能比发布周期长得多,因此代码有时间“成熟”。 在部署/构建过程中,您必须确保site-A的共享代码不会覆盖site-B使用的共享代码。您正在有效地“分叉”您的共享代码,包括所有含义(不兼容、集成团队更改的开销)

    偶尔应该强制合并到活动分支(您可能也希望重命名该分支),以集成对共享代码所做的所有更改。我想,3个月的迭代将迫使您这样做,但您可能会发现3个月对于无麻烦的集成来说太长了

    第三种方法是最极端的

    项目和迭代分支

    Mainline
    |
     -- Live branch July  (v 3.0)
        |
         -- Monday (may result in releases 3.0.1 - 3.0.5)
        |
         -- Thuesday (may result in releases 3.0.6 - 3.0.8)
        |
         -- Wednesday (may result in releases 3.0.9 - 3.0.14)
    
    Mainline
        |
         -- Live branch July  (v 3.0)
            |
             -- Mysite-A (released when something in A changed and only released to the destination of A)
            |
             -- Mysite-B
            |
             -- Mysite-C
    
    Mainline
        |
         -- Live branch July  (v 3.0)
            |
             -- Mysite-A 
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
            |
             -- Mysite-B
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
            |
             -- Mysite-C
                |
                -- Week 1
                |
                -- Week 2
                |
                -- Week 3
    
    如果你不注意的话,这肯定会带来巨大的开销和潜在的头痛。好的方面是,您可以非常准确地只部署此项目/站点现在需要的更改

    我希望这些都能给你一些想法

    应用货源控制主要是为了提高产品质量而进行的风险控制

    虽然您可能无法决定您的公司希望提供什么级别的质量,但了解这一点将有助于您决定建议进行哪些更改。结果可能是你的客户对你的质量相当满意,而进一步提高质量的努力并不会摊销

    祝你好运。
    克里斯托夫

    谢谢你克里斯托夫,你花了很多时间和精力在你的答案上,我很感激。没问题嘿:)。写作帮助我思考。结果怎么样?