2012-02-27 79 views
4

我们的团队被要求从CVS升级到SVN,虽然它不是我期望的Mercurial或Git,但它至少在正确方向迈出了一步。SVN中以开发人员为中心的分支

我知道一个big对于开发团队来说至少与SVN(或任何其他以分支为中心的SCM)挂钩是分支和合并的主题。

我读过文章,宣传“特色分支”(包含特定新功能的开发的分支)是纯粹的邪恶。而且,在阅读之后,我倾向于同意。但那么请问什么时候分支,什么时候合并

我一直在忙着开发人员检查干线/但每个人都有自己的(个人)开发人员分支机构并向这些分支提交新代码。然后,只要开发人员完成了他们的工作,我们就将与该工作有关的代码(位于他们自己的“私人”分支内)与主干合并。这样他们就不会抓住其他任何人,如果他们落后,他们不会拖延释放。

只是想知道SO的想法是以开发人员为中心的分支。如果它是一个可怕的想法,为什么? 最好的方法是什么?提前致谢!

+0

你所描述的是一个功能分支,我不明白为什么它会是纯粹的邪恶。 – 2012-02-27 17:35:46

+0

我的理解是,一个功能分支应该像'project/branches/new_feature /',而我正在谈论像'project/branches/johnsmith /'这样的开发者分支。当约翰史密斯编写了一些东西时,他的分支与'trunk /'合并。而不是整个团队承诺'/ new_feature /',如果约翰落后,推迟合并和后续发布。无论John在哪里,乐队都会这样继续前进。 – IAmYourFaja 2012-02-27 17:39:19

+0

和http://martinfowler.com/bliki/FeatureBranch。html – IAmYourFaja 2012-02-27 17:39:51

回答

2

我是那些认为功能分支是邪恶的类型之一。检查出一些讨论此相关的问题在这个题目(包括我自己的答案):Is using “feature branches” compatible with refactoring?

我不喜欢的功能分支,因为它的持续集成(该做法的主要目的都不相符,而不是工具),这是为了让开发人员在开发过程中尽早且经常地将他们的工作集成在一起,并且通过自动构建过程验证了这些集成工作。通过采用每个开发者分支的工作流程,您的设计使得实践变得不可能,而您又回到了开发者的独立,未经验证的变更,然后需要将它们整合到开发结束时的“大合并”中处理。

DVCS助手们会说这完全是一个工具集的问题。现在,我同意有版本控制系统处理分支和合并比Subversion好得多。这样的系统当然适用于他们设计的分散式开源项目。然而,即使合并非常简单(即使使用理想工具也无法实现),您仍然有延迟整合的问题,直到过程的后期。在一个开源项目中,这可能是可取的,在这个项目中,主干只有几个可信的看门人,而且还有很多(不太可信的)协作者。然而,在一个商业团队中,你真的应该能够相信每个人都会投入干线,因此应该不需要看门人。

总之,这里是我的回答您的问题以粗体显示:

当分支?何时合并?我赞成分发版本,建立快照并使错误修复变得简单(在这种情况下合并很简单,因为您正在讨论在trunk和release分支之间挑选一两个版本)。我通常会避免使用功能分支,除非确实需要在代码库中进行广泛的更改。任何时候你都有分支机构,你在稍后支付“大合并”的罚款。

什么是更好的方法?在我的组织中,所有开发人员都直接检查中继线。对于每个应用程序,我们都有连续构建(非主干),并且我们定期(每周或每两周)削减一个新版本分支(并为每个发布分支创建一个专用版本)。我们不是创建功能分支,而是尝试创建新的接口实现,以实现新的或重大修改的功能。这些新的实现可以保留在生产中未使用,直到他们准备就绪,届时我们可以切换我们的应用程序来使用它们。使用IoC容器使得这个过程非常简单。

2

Subversion的原始赞助商CollabNet,Inc.将Subversion Best Practices的列表放在一起。

列表的最后一节是“知道何时创建分支机构”。

分支机构依赖于您的软件项目的文化。 CollabNet介绍了三种常用的分支系统。

  • 永不分行系统
  • 常通科系统
  • 分支时所需的系统

永不科系统所使用的新项目没有可运行代码。它也可以被独奏开发者使用。

始终分支系统通常用于受重型管理和监督的项目。

每个开发人员都为每个编码任务在专用分支上创建/工作。编码完成后,某人或某事审查所有私人分支更改并将其合并到/ trunk。

当一个或多个开发人员对模块进行多个并行更改时,此系统确实需要更多合并。

Branch-When-Needed系统是Subversion项目本身使用的系统。当开发组通过版本发布产品时,这是一个有意义的系统。

用户在/ trunk上提交他们的日常工作。用户在单元测试之后才会提交。/trunk定期进行回归测试。

每隔一段时间,中继线都会被标记为产品的特定版本或版本。如果发现产品的先前版本有错误,则使用版本标签创建分支以解决问题。此修复然后合并到/ trunk中。

+0

+1取决于文化。完全同意。还取决于发布周期,持续集成的使用,开发人员和其他许多因素 – 2012-02-27 22:57:01

1

要了解何时应该进行分支,请问自己为什么首先分支。

有,为什么你需要分支主要有三个原因:

  1. 你有你的产品的多个版本在那里,和旧版本有缺陷。在这种情况下,您使用旧版本创建一个分支,并将其修复到分支上。否则,您必须包含自发布以来添加的所有新代码。

  2. 在Release 1.0中,有几十名程序员正在从事项目工作。当项目靠近发布点时,您想停止添加功能并修复错误。然而,这会让大部分程序员无事可做,只能搓揉他们的拇指,而负责发布的两三位程序员则在完成发布时进行工作。每个人都没有足够的工作。在这种情况下,您将分支版本1.0分发出去。与此同时,其他开发人员可以继续使用2.0版本。\

  3. 通常情况下,所有开发人员都致力于发布并做出微小更改。但是,有一个重大项目会重构产品的框架。如果您的开发人员正在检查他们的代码与其他开发人员一起工作,那么您将无法编译构建并测试更改。相反,您将此特殊项目分支到自己的代码行中。因此,后端重组是在一个分支上完成的,而其余的开发团队可以继续在主干上工作。

在最后一种情况下,关闭主干线的团队需要确保他们的代码不会落后于干线发生的事情。他们必须不断将树干中的变化合并到其侧枝。否则,分支和主干之间的代码差异变得太大而无法轻松合并。


问题是为什么案例#3比其他两种案例要困难得多。答案是这些分支是分开还是相互汇合。在案例#1和案例#2中,分支分歧。在案例#2中,版本1.0代码将与版本2.0代码不同,版本1.0代码与版本3.0代码将更加不同。事实上,在将来的某个时候,Release 1.0分支上的代码将无关紧要。

同时,在案例#3中,分支很多地相互聚合。这意味着你必须保持同步。这需要努力和监督。要确保最终必须合并批发的分支机构必须保持同步,需要耗费大量精力。

这就是为什么大多数网站现在都会在必要时进行分支并且不使用较旧系统的功能或开发分支。这样做会增加很多复杂性。必须对每个分支进行管理,并且必须仔细审查每个合并。


顺便说一句,它是分布式版本控制系统并不总是比集中的要好的原因之一。我看过太多使用过Git的地方,然后让开发人员都在自己的小存储库上工作,从不彼此交谈。在发布前一周,我们会用十几个补丁破解,然后有一场竞赛将所有代码合并到可交付版本中。

集中式存储库强制每个人都在同一组文件上工作。添加一个连续的构建过程,你可以确保这个发布没有任何意外。如果每个人都必须建立一个集中的存储库,那么分布式版本控制系统并没有真正增加这些组合,并且如果允许开发人员生活在他们自己的小洞穴中,可能会导致问题。

相关问题