限制SVN中功能分支的合并成本的好方法

时间:2010-08-02 15:01:08

标签: svn branch

在使用Agile和SVN时,是否有人可以推荐降低合并成本/复杂性的工作流程/使用模式?

我知道use-git是一个答案,但是我试图弄清楚如何在将一个新工具投入混合之前解决我的问题,因为我没有周期来处理目前中断。

我们最近从一个不稳定的行李箱模型切换到具有功能分支的维护和稳定分支从干线到稳定的干线。我们拥有较旧的维护分支,用于支持和更新的团队分支,其中包含功能分支。

团队开发功能并将其推送到团队分支,然后推送到主干。有时,功能也会在功能分支之间合并。我们遇到了树冲突的一些问题(特别是当变量集被推送到主干和另一个功能分支时)。

当我们需要将更改移到维持分支或将更改从它们转移到主干时,这非常困难。行李箱和维护工作已经漂移了很多。

合并正在阻碍我的方向,我正在试图确定是否存在一些过程问题,我们正在削减SVN的粒度并导致问题。我正在寻找一种更好的分支管理策略来减少工作量。

任何人都可以推荐好的文章,策略或工具吗?

4 个答案:

答案 0 :(得分:3)

我建议:

  • 让您的功能分支与主干保持同步。使这成为一项常规任务,如果你每隔几天做一次,它就会花费很多时间。当您准备将工作放入行李箱时,请确保给予健康的QA剂量并使用重新整合合并。重新整合询问文件和文件夹上的svn:mergeinfo属性,以确保从主干到特征分支同步的更改不会同步回来('循环'合并)。

  • 确保您只分支主干,不要在其他分支上“级联”分支。我们遇到过这样的情况:当文件被合并回来时,没有跟踪重命名文件上的COPY-TO属性。这可能导致SVN无法正确删除内容,如果您有级联分支,则此问题更加复杂。

  • 过去我们遇到了svn:mergeinfo的主要问题:系统首次引入时出现了错误,最终将mergeinfo放在几乎每个文件和文件夹上。这在合并时给我们带来的弊大于利,它只是让自己感到困惑,所以我们决定在每个文件和文件夹上清除mergeinfo,将我们的存储库的根文件夹分开。然后,这是分支活动的一个很好的总结。如果你这样做你没有获得SVN跟踪文件夹/文件移动的所有功能,但我们遇到了很多问题,最终只是在必要时更快地手动解决树冲突。 注意:此政策是有争议的。除非你真的需要,否则我不建议这样做,但它对我们来说效果很好。

  • 谈论文件夹/文件移动,不要疯狂重组您的代码库。只有在确实有必要时才移动文件和文件夹,并且确保您确实将更改传达给团队。

  • 重命名也是如此,不要在没有正当理由的情况下重命名。存储库中的文件名区分大小写,但Windows文件不区分大小写。因此,如果您将文件从'foo.txt'更改为'Foo.txt'然后再返回'foo.txt',则在合并期间SVN将尝试删除,添加,然后重新添加该文件。它认为它是不同的,但文件系统会抱怨,它将退出合并。这些都是非常令人沮丧的案例。

  • 继Sander Rijken的评论之后:确保您没有进行本地修改,确保您定期删除任何未经审查的文件也是一种好习惯。如果你有一个文件浮动,合并试图通过SVN写入可能会混淆。对于这样的情况,我们有一些Ruby管理脚本。

  • 注意树木冲突。如果小剂量合并,它们很容易解决。您只需在要合并的代码行上查看文件更改的历史记录,然后手动将它们重新应用到目标。这是最糟糕的情况,但如果你有正确的人负责合并,例如该项目的领导者了解工作,然后可以相对快速地解决这些问题。

  • 最后,确保您的SVN客户端保持最新状态。

  • 哦,是的,拥有一个好的合并工具可以使整个过程减少痛苦。我使用Araxis,但我听说SmartSVN中的合并工具也很好。

答案 1 :(得分:0)

我能想到的一些有助于减少可能冲突的事情:

  • 通过在工作副本的根目录上运行svn up,确保您的工作副本位于单个修订版中。
  • 确保您没有本地修改
  • 确保没有切换子项(当您在wc中切换目录而不是wc本身时会发生这种情况)
  • 确保使用depth = infinity检出工作副本,即没有稀疏工作副本

答案 2 :(得分:0)

根据某些功能的独立性,您可以考虑制作功能模块,并将其包含在svn:externals中(可能包含某个修订版)。这取决于代码库/项目是否适合这种模块化。

答案 3 :(得分:0)

SVN并非真正设计用于功能分支工作流程,您现在可以说。如果你要接近这个,试试Git或其他DVCS,事情会好得多。切换投资是值得的。