Svn 关于源代码管理的最佳实践是什么?

Svn 关于源代码管理的最佳实践是什么?,svn,version-control,Svn,Version Control,我们是一个地理位置不同的软件开发团队,致力于ERP系统。 我们使用SVN作为版本控制系统。 在代码转移到生产系统之前,我们有4个环境 我想知道在这种情况下使用SVN时,关于分支、合并的最佳实践是什么 目前我们面临一个问题,即一个文件有4个更改。客户只希望X(每年4个主要版本和4个次要版本)版本中有2个更改 我们面临的问题是: 分支太多了。 复杂的手动合并。 迷失方向或改变 覆盖其他人的代码 任何人都可以回答,如何使用SVN作为更好的工具来解决这个问题,它是 感谢和问候,凯达尔·赫克里。首先开始的

我们是一个地理位置不同的软件开发团队,致力于ERP系统。 我们使用SVN作为版本控制系统。 在代码转移到生产系统之前,我们有4个环境

我想知道在这种情况下使用SVN时,关于分支、合并的最佳实践是什么

目前我们面临一个问题,即一个文件有4个更改。客户只希望X(每年4个主要版本和4个次要版本)版本中有2个更改

我们面临的问题是: 分支太多了。 复杂的手动合并。 迷失方向或改变 覆盖其他人的代码

任何人都可以回答,如何使用SVN作为更好的工具来解决这个问题,它是


感谢和问候,凯达尔·赫克里。

首先开始的地方之一是您可能已经咨询过的地方:。还可以查看

引用的代码,也许一个如何将代码发送到主分支的过程比不同的工具(除了具有良好差异/合并功能的源代码管理系统)更有帮助

这取决于您的流程,但通常:

  • 大型团队的良好实践是 每一个新的分支机构都有一个单独的分支机构 功能/修复
  • 在将代码发布到 主线将从 他把主要精力放在他的分支上,管理所有的业务 测试以确保一切正常
  • 如果球队规模很大,你可能不得不这么做 考虑发布经理-一个人 要管理发布,只需 冻结主要分支机构并进行管理 功能进入的顺序
  • 更好的是,有发布分支 和一个被允许合并的人 开发人员,它的新特性 提交新功能准备就绪的备注 一个人合并这些变化 进入主要分支
  • 在发布和运行之前冻结发布分支 测试铁臭虫,不允许新的 只有当您 即将上映
  • 取决于提交的数量,但您 可以创建更小的版本 更多测试以建立里程碑 以及知道如何工作的功能 在每个点释放

最后,不管具体的过程是什么,主要的一点是开发人员理解过程,并且有人执行它。

首先,请阅读以下内容:

我和你一样痛苦,SVN也有同样的问题,只要你开始大量分支(为了处理项目生命周期中的所有不同情况,你必须这样做),当你开始合并时会有很大的痛苦,如果分支持续足够长的时间,合并本身就是一个完整的“项目”

当然,更好的实践是有用的,但如果该工具允许轻松地实施其中一些实践,那就太好了


我被推荐使用Mercurial,目前我正在研究它以取代SVN,它是按设计分发的,已经(听说)一个更好的合并工具和更好/更容易的分支/存储库管理,所以您可能也想研究一下。

您要求的是统一的更改管理,而Subversion并没有真正做好这一点(IMO)。管理更改需要一些手动工作。但是,假设您有适当的问题跟踪系统,以下是我工作过的许多地方所做的工作:

main branch (trunk)  - new feature development here 
  |- release-1.0  - locked release branch 
  |--- release-sp1
  |--- release-patches - patch release fix stream (new fixes merged here)
  |------ release-sp1-issue# - this is where you make your bug fixes 
                               before merging them. 
                               This issue# is the bug-id in your tracking system.
一旦一个bug被修复并提交到补丁发行版,你就可以删除旧的问题分支。这可以防止分支失控,但也可以使变更集变小

可以通过使发布中继仅可写入集成商来强制维护者。通过apache使用subversion:,您可以创建一个组、集成商,并在项目上设置以下权限

project 
  |- branches  (everyone: rw) 
      |- individual-fixes
  |- release-branches: (integrator: rw, everyone: ro) 
      |- release-1.0-fixes
      |- release-2.0-fixes
  |- trunk     (integrator: rw, everyone: ro) <- new dev goes here!!!!
  |- tags      (integrator: rw, everyone: ro) 
      |- release-1.0
      |- release-1.0-sp1 
      |- release-2.0 
项目
|-分行(所有人:rw)
|-个别修复
|-发布分支:(集成商:rw,所有人:ro)
|-1.0版修复程序
|-版本-2.0-修复程序

|-中继(集成商:rw,所有人:ro)如果您使用的是SVN,那么SVK是一个很棒的辅助工具,可以用来管理Subversion中的合并复杂性。作为一个工具,Subversion没有像ClearCase那样提供发布管理的很多安全性/灵活性。我不确定他们是否会试图弥补这一差距-他们声称的目标是一个比CVS更好的CVS,而且他们已经管理好了令人惊讶的好。更改源代码管理可能会很麻烦。你是否考虑过像darthcoder建议的那样寻找更好的Diff工具?我有一个第三方SVN客户端,但我喜欢第三方Diff工具,我非常喜欢使用它,而不是使用我的操作系统附带的工具(Apple FileMerge).Araxis FileMerge是一个很棒的工具,我最喜欢更改(不幸的是,仅限OS X)@darthcoder&Andrew:显然Mercurial可以轻松导入SVN存储库,还可以检索提交历史记录,所以可能不太复杂,但我会研究一下你们建议的工具,非常感谢这些指针!SVN合并跟踪可以大大简化事情。请确保您使用1.6并了解其后果这就是它的工作原理。事实上,Jeremy,我没有使用1.6版本,我也会研究一下,谢谢!您是否将发布分支保留在开发主干中?我很难理解这一点。我使用标准的Subversion结构,所以我将发布保存在tags文件夹中。听起来这会很快变得杂乱无章。标记是只读的。您不需要集成/合并到这些组件中。但是有一个单独的发布分支树,您可以控制对集成商的访问。理想情况下,一旦标记了某个组件,它的发布分支将被删除。SP1发布后,就不再进行更改。在本例中,假设有一个发布,您只有两个分支,一个是主干(新开发),该版本修复了流,最终将成为一个新的服务包。