`
daniel_tu
  • 浏览: 185312 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用svn——项目的目录布局

    博客分类:
  • Java
阅读更多

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

svn://proj/
|
+-trunk
+-branches
+-tags

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

对于这几个开发目录,一般的使用方法有两种。我更多的是从软件产品的角度出发(比如freebsd),因为互联网的开发模式是完全不一样的。
第一种方法,使用trunk作为主要的开发目录。
一 般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码处 于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。当下一个版本/阶段的开发任务开始,继续在trunk进 行开发。
此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。
例如,刚刚发布1.0,正在开发2.0,此时要在1.0的基础上进行bug修正。
按照时间的顺序

  1. 1.0开发完毕,代码冻结
  2. 基于已经冻结的trunk,为release1.0打tag
    此时的目录结构为
    svn://proj/
                 +trunk/  (freeze)
                 +branches/
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  3. 2.0开始开发,trunk此时为2.0的开发版
  4. 发现1.0有bug,需要修改,基于1.0的tag做branch
    此时的目录结构为
    svn://proj/
                 +trunk/  ( dev 2.0 )
                 +branches/
                               +dev_1.0_bugfix (copy from tag/release_1.0)
                 +tags/
                         +release_1.0 (copy from trunk)
  5. 在1.0 bugfix branch进行1.0 bugfix开发,在trunk进行2.0开发
  6. 在1.0 bugfix 完成之后,基于dev_1.0_bugfix的branch做release等
  7. 根据需要选择性的把dev_1.0_bugfix这个分支merge回trunk(什么时候进行这步操作,要根据具体情况)

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

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

  1. 1.0开发,做dev1.0的branch
    此时的目录结构
    svn://proj/
                 +trunk/  (不担负开发任务 )
                 +branches/
                               +dev_1.0 (copy from trunk)
                 +tags/
  2. 1.0开发完成,merge dev1.0到trunk
    此时的目录结构
    svn://proj/
                 +trunk/  (merge from branch dev_1.0)
                 +branches/
                               +dev_1.0 (开发任务结束,freeze)
                 +tags/
  3. 根据trunk做1.0的tag
    此时的目录结构
    svn://proj/
                 +trunk/  (merge from branch dev_1.0)
                 +branches/
                               +dev_1.0 (开发任务结束,freeze)
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  4. 1.0开发,做dev2.0分支
    此时的目录结构
    svn://proj/
                 +trunk/ 
                 +branches/
                               +dev_1.0 (开发任务结束,freeze)
                               +dev_2.0 (进行2.0开发)
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  5. 1.0有bug,直接在dev1.0的分支上修复
    此时的目录结构
    svn://proj/
                 +trunk/ 
                 +branches/
                               +dev_1.0 (1.0bugfix)
                               +dev_2.0 (进行2.0开发)
                 +tags/
                         +tag_release_1.0 (copy from trunk)
  6. 选择性的进行代码merge

这其实是一种分散式的开发,当各个部分相对独立一些(功能性的),可以开多个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的开发分支,而第二种方法则更加的保险,因为要测试嘛。

以上呢,就是我说的两种开发模式了,具体哪种好,并没有定论。这里大致的说一下各自的优缺点
第一种开发模式(trunk进行主要开发,集中式):
优点:管理简单
缺点:当开发的模块比较多,开发人数/小团队比较多的时候,很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动
第二重开发模式(分支进行主要开发,分散式):
优点:各自开发独立,不容易相互影响。
缺点:管理复杂,merge的时候很麻烦,容易死人。

其实,这里并没有一定之规,更多的时候是两种模式结合使用。我个人来说是采用第一种方式为主,在某些情况下使用第二种方法。
如果你还有其他的好的方法,那么请赐教。:)

分享到:
评论

相关推荐

    用SVN实现并行开发——分支合并基本操作

    通过在SVN中导入这些目录结构,可以构建出一个基本的版本库布局。 ### 增加主干文件 在本地工作目录中,创建一个新的工作空间,例如命名为WorkDir01。然后,从SVN仓库中导出trunk目录结构到该工作空间。接下来,...

    TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi

    《TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi:版本控制利器——TortoiseSVN详解》 TortoiseSVN,作为一款广受开发者欢迎的Subversion(简称SVN)客户端,是软件版本控制的重要工具。在标题中提及的"TortoiseSVN-...

    svn入门教程(subversion与版本控制)

    本文将深入讲解svn的基础知识和使用方法。 **一、为什么进行版本控制** 1. **代码历史记录**:在开发过程中,代码会不断迭代,有时需要回溯到早期版本以解决问题。 2. **协作开发**:多个人共同开发项目时,需要...

    Source_Insight教程及技巧(大全)——最终整合版_insight_Sourceinsight_sourceinsig

    在提供的"Source_Insight教程及技巧(大全)——最终整合版.pdf"中,包含了详细的使用指南、常见问题解答和实用技巧,帮助你更高效地使用Source Insight。 ### 结论 Source Insight是一款强大的源代码编辑器,其丰富...

    安卓Android源码——DocumentViewer(PDF阅读器).zip

    8. **res**:资源目录,包含应用的XML布局文件、图片、字符串、颜色、样式等资源。 9. **.settings**:Eclipse的项目特定设置,可能包含编译器选项、代码格式化规则等。 10. **assets**:此目录可以存放原始文件,如...

    IOS应用源码——TongXunLu.rar

    7. **版本控制**:源码中可能包含.git或.svn文件,这表明项目使用了Git或Subversion进行版本控制。通过它们,开发者可以追踪代码的历史修改。 8. **自动化测试**:为了保证代码质量,TongXunLu可能包含了单元测试和...

    安卓Android源码——oschina-android-app(开源中国).zip

    android"明确了这个项目是关于Android平台的,这意味着源代码将使用Java(或Kotlin)编程语言编写,并遵循Android应用开发的架构和最佳实践,如Activity、Service、BroadcastReceiver和ContentProvider等组件,以及...

    安卓Android源码——DocumentViewer(PDF阅读器).7z

    6. **.svn**:这是一个版本控制系统Subversion的文件,表明这个项目可能是使用Subversion进行版本控制的。 7. **src**:这个目录包含了所有的源代码,包括Activity、服务、广播接收者等组件的Java或Kotlin文件。 8...

    JBuilder 9_0程序设计——Java程序员成功之路_0

    总之,《JBuilder 9_0程序设计——Java程序员成功之路》是一本全面介绍JBuilder使用方法的教程,通过学习,你将能够熟练地运用JBuilder进行高效的Java开发,无论你是新手还是经验丰富的开发者,都能从中受益。

    基于Android ——MyDate 好看的日历,效果明显。.rar

    9. **版本控制文件**:如.gitignore或SVN配置文件,如果项目是在版本控制系统下管理的。 综上所述,这个压缩包对Android开发者,尤其是对日历应用感兴趣的开发者来说,是一份非常有价值的学习材料。它不仅展示了...

    ASP.NET源码——SilverLight趣味钢琴源码.zip

    9. **版本管理**:如果源码中包含了版本控制文件(如.git文件或SVN文件),则表明项目可能使用了Git或Subversion等工具进行版本控制,这对于团队协作开发和代码管理非常重要。 10. **性能优化**:为了确保在线钢琴...

    Source Insight教程及技巧(大全)——最终整合版

    - 集成源代码版本控制系统,例如Git、SVN等 - Source Insight的版本控制工具栏和界面操作 - 差异比较和代码合并的技巧 5. **调试辅助** - Source Insight的内置调试工具概述 - 设置断点和执行跟踪 - 调试窗口...

    iOS游戏应用源代码——bontoJR-InfoBar-0b62f42.zip

    【iOS游戏应用源代码——bontoJR-InfoBar-0b62f42.zip】是一个包含iOS游戏应用源代码的压缩文件,其中的核心项目可能是"BontoJR",结合了"InfoBar"这一功能模块。从这个文件名我们可以推测,这是一款名为"BontoJR"的...

    梁志天施工效果图——蘇州水巷鄰裏C2型单位样板房(施工图).zip

    例如,使用Git或SVN等版本控制系统可以记录每个版本的变更,避免因版本混乱导致的工程问题。 最后,当施工开始时,BIM(建筑信息模型)技术可能会被引入,将二维图纸转换为三维模型,便于施工队伍理解和实施。BIM...

    我的个人简历——Java程序员

    1. CRM(客户关系管理系统)开发:该项目使用了Tomcat6.0,她负责营销管理和基础数据代码的编码。系统实现了权限管理、营销管理、客户管理、服务管理、统计报表和基础数据等功能。通过该项目,她深化了对SSH框架的...

    NetBeans——Java桌面、Web与企业级程序开发详解

    内置的GUI设计器允许开发者通过拖放组件来构建UI,无需编写大量布局管理代码。 - **事件处理**:NetBeans的代码提示和自动生成功能使得添加事件监听器变得简单快捷,有助于提高开发效率。 - **调试工具**:集成的...

    《精通NetBeans——Java桌面、Web与企业级程序开发详解》光盘(第1-14章)源代码

    1. **Chapter 01**:通常会介绍NetBeans IDE的基础知识,包括安装、界面布局、基本操作和项目创建。读者可以通过这部分代码学习如何在NetBeans中搭建开发环境,创建新项目,并理解项目结构。 2. **Chapter 04**:...

    C#实例编程——简单的窗体vs2003

    尽管教程可能未涵盖,但了解如何使用版本控制工具(如SVN或Git)来管理代码变更对任何开发者来说都是必要的。 通过这个简单的实例,你不仅能学习到C#的基础知识,还能掌握如何在Visual Studio中构建和调试应用程序...

Global site tag (gtag.js) - Google Analytics