一. SVN标准目录

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

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

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

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

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

示例如图:

二.集中式:trunk进行主要开发

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

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

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

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

三.分散式:分支进行主要开发

这种开发模式当中,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的时候很麻烦,容易死人。

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

责职说明:

  • Trunk:用于各版本开发提交代码
  • TAG:用于记录和保存每个release/milestone的代码
  • Branch:用于bug fixing

五.具体操作

1.在Window中使用TortoiseSVN打tag

(1)首先进入项目中的trunk目录

(2)右击目录空白处弹出菜单,选择TortoiseSVN中的"Branch/tag..."

(3)选择目录,填写新的版本号

tags稳定版本库

branches临时分支版本库

后面加上版本号号码,可自行定义,一般以v开头加数字,小版本中间加下划线

(4)点击OK,生成版本分支

2.在Mac系统中使用CornerStone打tag

3.在服务器中切换分支

在SVN文件夹中使用SW命令

例如:

svn sw svn://ip地址/项目名/trunk

切换到主线版本

svn sw svn://ip地址/项目名/tags/v1

切换到稳定版本v1

 

参考:

http://blog.jobbole.com/100262/

http://blog.csdn.net/ClementAD/article/details/45199703

http://edu.csdn.net/course/detail/1544/23921?auto_start=1

SVN版本管理 目录结构的更多相关文章

  1. SVN仓库目录结构

    SVN仓库目录结构Repository: trunktagsbranches trunk(主干|主线) branchs(分支) tags(标记) truck(主干|主线|主分支):是用来做主方向开发的 ...

  2. [trick] 玩弄svn的目录结构

    今天在使用svn进行版本管理时出现了一个小问题: 原本在s目录下有一个c目录,不知为何被删除了,而svn st命令并没有认为它消失,svn up命令也无法下载回来: 从另一个地方拷贝过来一个c,svn ...

  3. SVN是什么,svn的目录结构

    Svn是一个离线的代码管理,可以多个人一起修改,然后再将修改的内容提交到Svn中.每一个svn服务器中的数据存储单位叫做存储,但是你不仅仅可以把整个存储当作你维护的内容,也可以将其中的某个分支目录像根 ...

  4. svn本地目录结构for window

    演示内容: 使用svn目录结构来进行备份正式版和修复版本,最终合并修复版本.主干上的版本. 使用工具: visualSVN server 服务器软件工具 TortoiseSVN客户端工具 1.服务器的 ...

  5. SVN标准目录结构

    Trunk 这是SVN目录的主分支,表示日常开发中的项目,任何时候Trunk里包含的都是最新的开发代码. 这里的代码将会工作到你的下一个主要发布版本. Trunk应该只被用来开发将会成为你的下一个重要 ...

  6. 关于SVN 目录结构

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

  7. 关于SVN 目录结构,使用教程

    SVN使用教程:http://www.cnblogs.com/armyfai/p/3985660.html Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn ...

  8. SVN 目录结构

    Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-ta ...

  9. SVN的标准目录结构

    SVN目录规范 在visualSVN中创建仓库时,可以选择svn目录结构 Trunk主干目录,此目录下的文件为基准文件. Brancher 用于开发的分支目录 Tags用于发布的版本目录 假设有一个项 ...

随机推荐

  1. 【抓包工具之Fiddler】导出jmeter脚本

    一.下载完成后,解压压缩包,将插件中的2个文件放入到Fiddler安装目录中   插件目录     二.打开fiddler,设置测试时过滤的条件(抓包可以指定域名的请求)   设置过滤条件 三.这里我 ...

  2. Mongodb Capped Collection集合

    MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素! ...

  3. tab切换中的滚动条下拉分页带来的问题

    相信做过tab切换中滚动条下拉分页的童鞋都知道,我们在用scroll方法来做滚动条下拉分页的时候,都是有bug,切换中间的内容会互相影响,为了解决这个问题,我总结了2种方法: 1.方法一: <! ...

  4. HDU 6638 - Snowy Smile 线段树区间合并+暴力枚举

    HDU 6638 - Snowy Smile 题意 给你\(n\)个点的坐标\((x,\ y)\)和对应的权值\(w\),让你找到一个矩形,使这个矩阵里面点的权值总和最大. 思路 先离散化纵坐标\(y ...

  5. BUUCTF | 摩丝

    将得到的交上去居然不对: 然而大写却过了: flag{ILOVEYOU} 因为摩斯电码在设计的时候就没有区分大小写,而且从码表中可以看到,都是大写,所以在网站上解密出来的自己转成大写

  6. R中unlist函数的使用

    买的书里面实例讲的不清不楚,所以看帮助文档了 用法:unlist(x, recursive = TRUE, use.names = TRUE) 帮助文档讲x可以是向量或者列表,如果是向量,则原样返回, ...

  7. 转载:eclipse中web项目小地球没了

    转载自:{FROM:http://www.cnblogs.com/zhouyalei/archive/2013/01/30/2882651.html} MyEclipse下创建的项目 导入eclips ...

  8. asp label居中

    https://stackoverflow.com/questions/25245839/align-a-label-to-the-right-using-asp-net Try something ...

  9. 启动线程,start和run的区别

    每个线程都有要执行的任务.线程的任务处理逻辑可以在Tread类的run实例方法中直接实现或通过该方法进行调用,因此 run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接 ...

  10. tfsenflow队列|tf.train.slice_input_producer|tf.train.Coordinator|tf.train.start_queue_runners

      #### ''' tf.train.slice_input_producer :定义样本放入文件名队列的方式[迭代次数,是否乱序],但此时文件名队列还没有真正写入数据 slice_input_pr ...