我们在一些著名开源项目的版本库中,通常可以看到trunk, branches, tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式
Trunk主干和Branches分支和Tags标签
- Trunk主干
trunk主干,是主要的开发目录,还可以用于处理一些容易且能迅速解决的BUG,或者添加一些无关逻辑的文件(比如媒体文件:图像,视频,CSS等等)。
- Branches分支
在版本控制的系统中,Branches分支是用来做添加新的功能以及产品发布后的bug修复等,这样可以不影响主要的产品开发线以及避免编译错误等。当我们添加的新功能完成后可以将其合并到主干中。
注意:
-
当一个branch完成了,并且认为它足够稳定的时候,它必须合并回它原来的拷贝的地方,也就是说:如果原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父级branch。
-
除非是因为必须从一个branch中创建一个新的子branch,否则新的branch必须从trunk创建
-
建立的分支目的就是修改那些在主干中不会被修改的文件,以便修改完成后合并到主干中。
- Tags标签
Tags目录一般是只读的,可以使用SVN中的authz文件控制该目录的访问权限为只读,Tags的创建主要用于在项目开发中的里程碑时或当trunk稳定后可以向外发布时,比如开发到一定阶段可以单独一个版本作为发布等,通常用于发布给客户使用。
还有一点值得注意的是,SVN不推荐在创建的Tag基础上Revision,这种情况应用Branches,因为Tag一般保持不变不作任何修改。
trunk、branches、tags的用法详解
当一个版本(trunk_release_2_0)开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag,如:tag_release_2_0,这个版本是可以交付给用户的。当下一个版本/阶段的开发任务(trunk_release_2_1)开始,继续在trunk进行开发。此时,如果发现了上一个已发行版本(trunk_release_2_0)有一些bug,或者一些很急迫的功能要求,而正在开发的版本无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch_bugfix_2_0)进行开发,等到bugfix结束,做一个tag,tag_release_2_0_1,然后,如果是修复bug的分支则需要把branch_bugfix_2_0并入trunk,如果是个性化功能则根据需要决定是否并入trunk。
为了便于创建分支和标签,我们习惯于将Repository版本库的结构布置为:/branches,/tags,/trunk。分别代表分支,标签以及主干。
project
|
+– trunk
|
+—– main.cpp (2.0版本的最新文件)
+—– common.h
+– branches
+ |
+ +– r1.0
+ + |
+ + +—- main.cpp (1.x版本的最新文件)
+ + +—- common.h
+ +
+ +– r2.0
+ |
+ +—- main.cpp (2.x版本的最新文件)
+ +—- common.h
+
+– tags (此目录只读)
|
+– r1.0
+ |
+ +—- main.cpp (1.0版本的发布文件)
+ +—- common.h
+
+– r1.1
+ |
+ +—- main.cpp (1.1版本的发布文件)
+ +—- common.h
+
+– r1.2
+ |
+ +—- main.cpp (1.2版本的发布文件)
+ +—- common.h
+– r2.0
+ |
+ +—- main.cpp (2.0版本的发布文件)
+ +—- common.h
+
+– r2.0.1
|
+—- main.cpp (2.0.1版本的发布文件)
+—- common.h
工作流样例
假设你必须添加了一个特性至一个项目,且这个项目是受版本控制的,你差不多需要完成如下几个步骤:
-
使用SVNcheckout或者SVNswitch从这个项目的trunk主干获得一个branch分支
-
使用SVN切换本地代码为创建好的branch分支状态并完成新特性的开发(当然,要做足够的测试,包括在开始编码前)
-
一旦这个特性完成并且稳定(已提交),并经过你的同事们确认,切换本地代码为trunk状态
-
本地通过svn合并开发好的branch分支代码,重新检查合并后的代码并且解决一系列的冲突
-
commit本地代码至项目的trunk上
-
如果某些部署需要特殊的环境(生成环境等等),请更新相关的tag至你刚刚提交到trunk的修订版本,使用SVNupdate部署至相关环境