`

基于SVN进行代码开发流程

    博客分类:
  • svn
阅读更多

1 SVN标准目录

Subversion有一个很标准的目录结构,是这样的。比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是:

 
 

这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。

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

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

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

示例如图:

 
 

2 集中式:trunk进行主要开发

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

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

例如,刚刚发布1.0,正在开发2.0,此时要在1.0的基础上进行bug修正。按照时间的顺序:

 
 

这是一种很标准的开发模式,很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录

3 分散式:分支进行主要开发

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

 
 
 
 

这其实是一种分散式的开发,当各个部分相对独立一些(功能性的),可以开多个dev的分支进行开发,这样各人/组都不会相互影响。比如dev_2.0_search和dev_2.0_cache等。但是这样merge起来就是一个很痛苦的事情

所以,第六步进行 选择性的merge,是可以当2.0开发结束后一起把dev_1.0(bugfix用)和dev_2.0(新版本开发用)merge回trunk。或者先把dev_1.0 merge到dev_2.0,进行测试等之后再merge回trunk。

这两种方法各有利弊,第一种方法是可以得到一个比较纯的dev_2.0的开发分支,而第二种方法则更加的保险,因为要测试嘛

多人协作时,第六步是最经常出问题的地方,严重的甚至会导致代码被覆盖回滚情况,其原因在于分支管理者创建分支后不再或长时间从主干拉回数据,导致最终合并回主干时分支的文件甚至结构都与主干有较大差别,产生较多冲突。需要人手解决,浪费了很多时间。

针对这个问题,是否有一种方案可以在分支提交时即检测该分支最后一次合并的版本是否与主干版本相符,如果不符则不允许提交,强制要求大家养成从主干拉数据的习惯呢?如果可以实现,那么在分支合并回主干时将几乎可以消灭掉冲突。

当前解决思路主要有3种:

  1. 不间断强调使用SVN时要经常从主干同步代码到分支。该方案缺点很明显,完全依赖人工,不可信。

  2. 在trunk里单独维护一个带最新版本号的readme.md,每次更新trunk时更新该版本到更新的版本号。此后合并分支回主干时判断下分支时的readme.md是否和主干里的readme.md保持一致,若小于主干,则强制同步主干代码到分支。该方案缺点是需要每次更新主干代码时都要强制手工维护版本号,容易出现低级错误——更新trunk时忘记更新readme.md里的版本号等情况。

  3. SVN本身记录版本更新信息,可以通过在服务器端监控主干,判断提交前(pre-commit)检测是否有分支最后一次合并版本号小于主干版本号,如果小于则不允许提交,强制要求先从主干合并。此方案是一种相对完美的方案。

以上呢,就是SVN的两种开发模式了,具体哪种好,并没有定论。这里大致的说一下各自的优缺点:

第一种开发模式(trunk进行主要开发,集中式):

优点:管理简单。

缺点:当开发的模块比较多,开发人数/小团队比较多的时候,很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动。

第二种开发模式(分支进行主要开发,分散式):

优点:各自开发独立,不容易相互影响。

缺点:管理复杂,merge的时候很麻烦,容易死人。

4 最后,推荐第一种开发模式

 
 

责职说明:

Trunk:用于各版本开发提交代码

TAG:用于记录和保存每个release/milestone的代码

Branch:用于bug fixing

过程说明:

  1. 项目开始时,创建Trunk,开始1.0.0开发

  2. 所有小组成员都往Trunk中提交代码

  3. 当1.0.0开发完成后,创建一个标签:Tag1.0.0

  4. Tag1.0.0测试完成后,部署到服务器

  5. 开发小组开始新版本1.0.1开发,继续提交代码到Trunk中

  6. 1.0.1开发完成,创建Tag1.0.1,测试完后部署到服务器

  7. 开发小组开始新版本1.0.2开发,继续提交代码到Trunk中

  8. 1.0.1运行中发现bug,需要紧急修复 -> 从Tag1.0.1中创建1.0.1bug-fix Branch

  9. Bug修复代码提交到1.0.1bug-fix Branch,测试通过后,部署到服务器

  10. 提交到1.0.1bug-fix Branch的代码合并到Trunk中

  11. And so on……



作者:猿码道
链接:https://www.jianshu.com/p/a1c5a7ed4df6
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
分享到:
评论

相关推荐

    JEECG是一款基于代码生成器的J2EE快速开发平台.zip

    引领新的开发模式(Online Coding模式(自定义表单) - >...总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

    Zoo Admin - 在线 zookeeper管理工具,基于Jfinal+Beetl开发。.zip

    开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在...总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

    基于JavaEE的快速开发框架

    先说说核心思想,我一直向开发人员推荐面向接口的编程思想,因为我觉得这是一个很Nice的指导方向,可以让你的代码更加简洁,读之欣然。 混合Scala编程是一个大胆的尝试,可以弥补Java的一些弱点;当然,主要还是...

    基于 OAuth2.0 协议的跨域认证授权开发套件.zip

    ,包含授权服务和开放平台 Docker 镜像,基于 Spring Boot ...总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

    基于gulp的前端自动化开发环境.zip

    同时,也需要借助一些工具,如代码编辑工具(WebStorm、VS Code)、代码版本控制工具(Git、SVN)、代码包管理工具(npm、Yarn)、前端构建工具(Webpack、Vite)等,来提升开发效率和质量。 总的来说,前端开发是...

    svn-1.4.3-setup.exe.7z

    不过不要失望,社区重新拾起代码并进行了改进,它现在的新主页在SourceForge。 * 下载此匹配你的 Apache 版本的模块,将文件mod_auth_sspi.so复制到 Apache 的 modules 目录。 * 编辑 Apache 的配置文件: ...

    基于javaweb的小型超市信息管理(进销存)系统。开发工具为MyEclipse.zip

    开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在...总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

    MyDog是一个代码生成工具.zip

    目前实现了一键生成基于SpringBoot的web工程。...总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

    基于spring boot搭建的web基础框架.zip

    包含了web开发中常用的功能,如:缓存(redis)、日志、事务、JPA、shiro、安全、常用工具类、swagger2在线接口文档、跨域支持等,可以基于该项目快速进行公司内部的项目开发。 开发工具在软件开发生命周期中扮演...

    JavaEE求职简历-姓名-JAVA开发工程师.doc

    7.熟练使用SVN和Git进行代码的版本控制; 8.熟练使用Maven来进行多模块项目的构建以及管理项目中依赖包,以及使用Maven最终完成项目的热部署; 9.熟悉junit技术,通过SpringTest、Dbunit、EasyMock对项目进行单元测试...

    URULE是一款基于RETE算法的纯Java规则引擎.zip

    提供规则集、决策表、决策树、评分卡,规则流等各种规则表现工具及基于网页的可视化设计器,可快速开发出各种复杂业务规则。 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计到...

    使用Subversion进行版本控制(针对 Subversion 1.4)

    使用Subversion进行版本控制针对 Subversion 1.4(根据r2866编译) 参照网页版 http://svndoc.iusesvn.com/svnbook/1.4/制作而成。 目录 前言 序言 读者 怎样阅读本书 本书约定 排版习惯 图标 本书的结构 本书是...

    基于spring-boot实现自动化配置的支付对接.zip

    让你真正做到一行代码实现支付聚合,让你可以不用理解支付怎么...总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。

    大数据开发工程师的岗位职责.docx

    7、熟悉使用svn,禅道等项目管理工具,有良好的团队协作开发经验. 大数据开发工程师的岗位职责全文共4页,当前为第3页。 大数据开发工程师的岗位职责全文共4页,当前为第3页。 大数据开发工程师的岗位职责4 职责: 1...

    CodePax:基于Web的部署工具,用于源代码和数据库控制。 它是用PHP内置的,可与Git和Svn仓库一起使用,并且可在Linux和Windows上运行-windows source code

    CodePax是一个基于Web的免费开放源代码(新BSD)部署工具,旨在用于源代码以及数据库控制和版本控制。 它内置于PHP中,可与Git和SVN一起使用,并且可在Linux和Windows上运行。 数据库版本控制模块当前可用于MySQL...

    JAVA程序开发大全---上半部分

    本书系统全面地介绍了Java中的各项主流技术,以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、...

    Jenkins使用及插件开发介绍

    Jenkins使用及插件开发介绍介绍Jenkins是一个广泛用于[持续构建]()的可视化web工具,就是各种项目的的“自动化”编译、打包、分发部署,将以前编译、打包、上传、部署到Tomcat中的过程交由Jenkins,Jenkins通过给定...

    App开发工具 | APICloud studio3-mac-v3.0.12.zip

    APICloud studio3基于业界领先的代码编辑器-Vscode深度定制,帮助开发者快速构建...类AVM语法和扩展API支持、能实时预览和真机调试、支持Git进行代码管理,同时內置SVN简化复杂的Git操作,提供简洁明了的代码管理过程。

    基于Python的依托豆瓣平台制作的一个数据分析系统.zip

    本系统还有搜索功能,可以具体查询某一部电影、音乐或图书的数据分析,同时当搜索到一个数据库中不存在的数据时,后台将自动进行在线爬取存入数据库,即我们将数据搜集的过程也加入到了网站上,从而实现了数据收集...

    Java学习资料

    掌握Java编程基本语法,用Java编写程序来解决一些实际问题,赋予学 员面向对象思想,充分理解并运用Java面向对象思想来进行程序开发, 实现开发者从过程时编程到面向对象编程的...新特性,掌握基于SVN的源代码管理。

Global site tag (gtag.js) - Google Analytics