svn管理模式

本文介绍了SVN的标准目录结构包括trunk、branches和tags,并详细解释了两种管理模式:集中式管理和分散式管理。集中式管理中trunk作为主线开发,而分散式管理中trunk主要用于合并分支。文章还讨论了两种模式的差异及如何结合Jenkins实现自动化构建。

一、目前svn的标准目录结构:

trunk:主干,如果说把一个软件项目从开始到消亡比作一个故事的话,主线情节都在这里被SVN记录着。

branches:分支,有很多种用法,比如:版本发布维护分支、新特性开发分支,甚至是缺陷修复分支等等。

tags:标签,或者叫快照,某个版本发布时候,都在这里留档。

 

二、管理模式

1、集中式:trunk进行主线开发 

     一般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。当下一个版本/阶段的开发任务开始,继续在trunk进行开发。

此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。

举例:刚刚发布版本1.1.0,现在正在开发1.2.0。此次上个版本出现bug需要紧急修复。要在1.1.0的基础上进行bug修正。顺序如下:

(1)1.1.0开发完成,代码冻结。

(2)基于已经冻结的trunk,为release1.1.0打tag。

         此时的目录结构为:

        svn://project/

                 +trunk/(freeze)

                 +branches/

                 +tags/

                     +tag_release_1.1.0(copy from trunk)

  (3)1.2.0进行开发,trunk此时为1.2.0的开发版本

   (4)发现1.1.0有bug需要紧急修复,基于1.1.0的tag做branch。

         此时的目录结构为:

        svn://project/

                 +trunk/(dev 1.2.0)

                 +branches/

                    +dev_1.1.0_bugfix(copy from tag/release_1.1.0)

                 +tags/

                     +tag_release_1.1.0(copy from trunk)

       (5)在dev_1.1.0_bugfix分支上进行bug修复,trunk仍然做1.2.0的开发。

    (6)在dev_1.1.0_bugfix完成后,基于dev_1.1.0_bugfix分支拉出一个tag分支:tag_release_1.1.1

     (7) 将dev_1.1.0_bugfix分支的内容merge到trunk上。

     此种模式trunk永远是开发的主要目录。也是目前现状的开发模式。

2、分散式:分支进行主要开发

这种开发模式当中,trunk是不承担具体开发任务的,主要承担版本发布,一个版本/阶段的开发任务在开始的时候,根据已经release的版本做新的开发分支,并且基于这个分支进行开发。

举例:

 (1)1.1.0开始开发,从trunk上拉取dev1.1.0的branch。

  此时的目录结构:

  svn://project/

                 +trunk/(不承当开发任务)

                 +branches/

                         +dev_1.1.0(copy from trunk)

                 +tags/

(2)1.1.0开发完成后,merge dev1.1.0到trunk上。

   此时的目录结构:

  svn://project/

                 +trunk/(merge from dev1.1.0)

                 +branches/

                         +dev_1.1.0(开发任务结束,冻结)

                 +tags/

  (3)根据trunk做1.1.0版本的tag

     此时的目录结构:

         svn://project/

                 +trunk/(merge from dev1.1.0)

                 +branches/

                         +dev_1.1.0(开发任务结束,冻结)

                 +tags/

                         +tag_release_1.1.0(copy from trunk)

四、两种模式的区别和思考

1、两种模式的共同点是:出现BUG的时候,都需要从tag上拉取分支进行开发。

2、两种模式的区别是:trunk上开发,还是在branch上开发。

由此总结:1、无论选择哪一种方式,一定需要打TAG分支,用于在出现bug回滚,新版本又在开发期间,可以从tag拉取代码进行修复。

                 2、结合jenkins流程化控制管理,项目必须适应的变化:

                                         (1)必须摈弃掉增量手工替换文件的发版方式,每次发版全量替包。

                                         (2)项目使用maven或者ant管理,用于jenkins的自动化构建使用。更推荐使用maven。其有清晰的文件目录以及maven私服来管理第三方依赖包。

                                         (3)如果使用集中式开发,trunk主线,那么测试环境发布trunk主支。在最后一次成功的版本基础上打tag,并且生产环境发布tag分支。

                                         (4)如果使用分散式开发,trunk主线只承当合并。每次新版本都拉取一条或多条branch。版本经理合并branch代码到trunk进行测试。测试环境发布trunk分支。

                                                 最后一个成功版本打完tag后,可以直接将镜像推送到habor生产进行发布。

五、后续优化事项

1、引入jira,设想在jira上新建版本管理。版本统筹任务,svn提交的pre-commit对任务的状态进行判断,如果任务已经终结,测试需要将相关bug重新录入任务。

      严格的svn代码提交控制。

2、使用jenkins自动生成tag版本。

ps:所谓严格代码控制,都是为了让开发对发版存有敬畏之心!

[本地工作区] :work copy ,本地工作副本; [主项目]:引用共用模块的新项目(工程) 最新版本(HEAD revision):版本库里文件或目录的最新版本 SA :SVN服务器的管理员 PRA :单个项目库的管理员,或者是项目负责人 User :普通工作人员 WC :work copy ,本地工作副本 1. 版本控制原则 SVN(或者其他版本控制软件)只是一个版本控制的辅助工具,不可能把所有的问题都自动解决掉。尤其,对于冲突这个麻烦事儿,项目成员在项目进程中要尽量通过优化流程来解决,而不是将希望寄托于软件工具来自动解决一切问题。 建议的开发过程组织: 1. 随行就市 项目刚开始阶段,单独开发;项目稳定阶段,完整开发。项目开发初期,各个项目成员负责自己的文件夹(或者模块),与SVN服务器间的更新、提交等操作只需要针对自己负责的文件夹(或者模块)就行了,他人的文件夹(或者模块)可以不必关心;项目稳定阶段,也就是每天的变更量很小了,所有项目成员与SVN服务器的更新、提交等操作需要针对项目的所有文件夹(或者模块),各个项目成员在其本地编译时本地工作区的全部项目程序(或者资料)均为最新的版本,保证项目作为整体能够顺利运行。 2. 能躲就躲 尽量保证一份文件只有一个项目成员在编辑。举例说明:程序员A负责底层中文件 DBAccess.cs的编写,如果程序员B的工作要求他为DBAccess.cs增加两个方法,程序员B应该通知程序员A来增加而不是自己增加;如果此时A非常繁忙需要B自己增加,就需要B先更新本地的DBAccess.cs,然后开始修改,修改完成后立即提交并通知A更新本地的文件,通过缩短提交间隔来减少冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值