trunk: 开发主干线目录 主要存放源代码目录
tags: 基线目录
test release: 版本测试目录
product release: 产品发布目录(基线)
branches: 分支目录,主要存放一些新开发的功能。
基线就是稳定的程序,里程碑就一个点,比如:我现在是1.0版本的,然后下一次就是1.5版本的
我们在一些著名开源项目的版本库中,通常可以看到trunk, branches, tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。
trunk是主分支,是日常开发进行的地方。
branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客制化的版本,也可以放在分支中进行开发。
tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。
比如一个项目有main.cpp, common.h两个文件,假设目前在开发的是最新的3.0版本,而且1.0/2.0版本也在进行维护,那么项目树将类似如下样子:
project
|
+--trunk
+ |
+ +----- main.cpp (3.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
+
+-- r1.3
+ |
+ +---- main.cpp (1.3版本的发布文件)
+ +---- common.h
+
+-- r2.0
+ |
+ +---- main.cpp (2.0版本的发布文件)
+ +---- common.h
+
+-- r2.1
|
+---- main.cpp (2.1版本的发布文件)
+---- common.h
要使用这样的文件夹结构,在建立项目版本库时,可首先建好项目文件夹,并在其中建立trunk, branches, tags三个空的子目录,再将项目文件夹连同这三个子目录一起导入版本库。
这样在trunk中开始进行开发,当需要建立branch或tag时,使用SVN的copy操作进行。
其中tags目录需要只读,可以使用SVN中的authz文件控制该目录的访问权限为只读。
svn版本库目录结构
该文是svn源代码分析系列文章服务端架构中的一篇,主要描述svn服务端版本库数据存储目录结构,并且对这些文件以及目录的作用进行简单分析。使用“svnmadin create”命令创建初始化版本库后,使用“tree”命令打印出没有经过任何修改的原始版本库目录。
$ svnadmin /svnrepos/morepos $ tree /svnrepos/morepos -p morepos |-- [-rw-r--r--] README.txt |-- [drwxr-xr-x] conf | |-- [-rw-r--r--] authz | |-- [-rw-r--r--] passwd | `-- [-rw-r--r--] svnserve.conf |-- [drwxr-sr-x] db | |-- [-rw-r--r--] current | |-- [-r--r--r--] format | |-- [-rw-r--r--] fs-type | |-- [-rw-r--r--] fsfs.conf | |-- [-rw-r--r--] min-unpacked-rev | |-- [drwxr-sr-x] revprops | | `-- [drwxr-sr-x] 0 | | `-- [-r--r--r--] 0 | |-- [drwxr-sr-x] revs | | `-- [drwxr-sr-x] 0 | | `-- [-r--r--r--] 0 | |-- [drwxr-sr-x] transactions | |-- [-rw-r--r--] txn-current | |-- [-rw-r--r--] txn-current-lock | |-- [drwxr-sr-x] txn-protorevs | |-- [-rw-r--r--] uuid | `-- [-rw-r--r--] write-lock |-- [-r--r--r--] format |-- [drwxr-xr-x] hooks | |-- [-rw-r--r--] post-commit.tmpl | |-- [-rw-r--r--] post-lock.tmpl | |-- [-rw-r--r--] post-revprop-change.tmpl | |-- [-rw-r--r--] post-unlock.tmpl | |-- [-rw-r--r--] pre-commit.tmpl | |-- [-rw-r--r--] pre-lock.tmpl | |-- [-rw-r--r--] pre-revprop-change.tmpl | |-- [-rw-r--r--] pre-unlock.tmpl | `-- [-rw-r--r--] start-commit.tmpl `-- [drwxr-xr-x] locks |-- [-rw-r--r--] db-logs.lock `-- [-rw-r--r--] db.lock 10 directories, 27 files
路径 | 类型 | 作用 |
conf | 目录 | 存放版本库所用配置文件的目录 |
dav | 目录 | 供mod_dav_svn使用 |
db | 目录 | 版本数据存储目录 |
db/fs-type | 文件 | 版本库数据真实存储格式,SVN有fsfs和bdb两种存储格式 |
db/revprops | 目录 | 记录版本属性 |
db/revs | 目录 | 版本库数据存储真实目录 |
db/uuid | 文件 | 存储版本库唯一标识号,参考《svn版本库标识uuid简述》 |
db/txn-current | 文件 | 记录当前事务 |
format | 文件 | 存储一个整数的文件,此整数代表库层次结构版本 |
hooks | 目录 | 存放版本库勾子目录 |
locks | 目录 | 存储库锁目录,用来跟踪库的访问者 |
其中revs下面是以目录组织的版本结构,每1000个版本组成一个目录,每个版本自成一个文件,文件名即为commit后生成的版本号;即使删除掉部分版本也不会影响版本库的读取和显示;但是基础版本丢失会使版本库无法访问
本节和大家讨论一下SVN库的目录结构问题,这里我发表一下个人理解,和大家讨论讨论,欢迎大家一起来学习SVN库的目录结构方面的知识。
1、所有项目都在一个SVN库中么?
对于这个问题,个人认为,应该每个项目建一个SVN库,为什么这样说呢,因为SVN是全局版本,假如SVN库是如下结构:
SVN库<全局版本1.1>
┠项目A<1.1>
┖项目B<1.1>
这就会导致任何一个项目修改,影响全局版本修改,不能真实反映单个项目的版本情况。
2、SVN库的目录结构该怎样规划?
参考了国外一些主要的开发网站,如SourceForge,大同小异,类似这样的目录结构:
SVN库
┠tags(发布)
┃├1.1rc1
┃├1.2
┃├1.5
┃└1.9
┠trunk(主版本)
┃└project
┃├src
┃├classes
┃└WEB-INF
┖branches(分支)
└分支
主要的开发工作放在trunk,分支放在branches,发布版本放在tags。
存储库
┠项目名
┃├trunk:主版本
┃├branches:分支版本(独立版本)
┃└tags:标记版本,比如发行版v1.0/v2.0等等
3、SVN库的管理原则:
1、项目负责人和版本管理员负责架构项目目录结构,包括配置文件、第三方JAR文档
2、项目负责人分配开发人员目录权限,由版本管理员负责实施,权限分配粒度要细
3、trunk,tags,branches,项目负责人、协同版本管理员构建tags和branches
4、版本管理员负责解决开发人员在开发过程中的有关版本问题
5、开发人员每次修改,或者新增、删除、拷贝工作区对象后,应该立刻提交到版本库,有效保持工作区与资源库的高度一致,每天下班之前提交、(更新)
6、开发人员在每次修改工作区中代码或者文档时,首先更新该对象,可以尽量减少冲突、合并
7、保证提交到的版本库的代码没有BUG以免影响开发组,可以适当利用加锁机制,减少冲突
8、项目负责人和版本管理员负责软件的测试版,构建测试环境,branches由版本管理员进行(checkout)
9、项目负责人和版本管理员负责发布软件的发布版,与系统部协调构建发布环境(export)
10、版本管理员负责清理有关不需要的branches,tags。本节关于SVN库的目录结构讲解完毕。