一、What‘s is a subversion
Subversion(SVN)是一个开源的,跨平台的版本控制系统,由CollabNet公司成立于2000年;Subversion作为新一代的版本管理系统,以其目录版本化、原子提交、版本化的元数据、更加有效的分支和标签等特性,至今已被众多的互联网企业使用来管理网站、论坛的代码文件;Subversion最独特的地方,便是可以通过Apache的扩展模块与Apache的HTTP服务相结合,实现更安全的特性与管理,其次用户还可以通过HTTP协议去访问版本库,还可以通过SSL协议传输加密,保证数据的安全性;Subversion是Apache软件基金会的发展的一个项目,并且也是一个丰富的开发人员和用户社区的一部分。
Subversion存储版本数据方式2种:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点;那么在创建Subversion版本控制仓库的时候,可以指定存储版本数据为FSFS方式;
二、Svbsersion系统逻辑架构图
三、安装与配置
3、1 服务器资源列表
服务器名称 |
系统 |
CPU架构 |
内核 |
IP地址 |
角色 |
storage |
CentOS 6.3 |
x86_64 |
2.6.32-279.el6.x86_64 |
10.16.10.31 |
SVN服务器 |
3、2 安装
3、2、1 CentOS系统下安装
[root@storage ~]#rpm -qa | grep subversion
[root@storage ~]#yum install subversion
3、2、2 Ubuntu系统下安装
[root@ubuntu ~]#dpkg -l subversion
root@host-93:~#apt-get install subversion
3、2、3 关于Subversion 组件
1)svn
命令行客户端程序;
2)svnversion
显示工作拷贝的状态,即当前项目修订的版本;
3)svnlook
服务器端直接查看Svbversion版本库的工具;
4)svnadmin
服务器端建立、调整和修复Subversion版本库的工具;
5)svndumpfilter
过滤Subversion版本库转存数据流的工具;
6)mod_dav_svn
Apache HTTP服务器的一个模块,使版本库可以通过网络访问;
7)svnserve
服务器端程序,用来启动SVN服务的守护进程;
8)svnsync
可以通过网络增量镜像版本库的程序;
3、2、4 验证安装结果
[root@storage ~]# svn --version svn, version 1.6.11 (r934486) compiled Jun 23 2012, 00:44:03 Copyright (C) 2000-2009 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ This product includes software developed by CollabNet (http://www.Collab.Net/). The following repository access (RA) modules are available: * ra_neon : Module for accessing a repository via WebDAV protocol using Neon. - handles 'http' scheme - handles 'https' scheme * ra_svn : Module for accessing a repository using the svn network protocol. - with Cyrus SASL authentication - handles 'svn' scheme * ra_local : Module for accessing a repository on local disk. - handles 'file' scheme
##备注
当前Subversion版本为1、6,默认版本数据存储方式为FSFS;从显示的结果上,我们还可以知道Subversion支持基于http,https协议访问版本库,支持本地、远程导入项目与SASL的验证方式;
3、3 创建版本库
[root@storage ~]#mkdir /data/svn –p
[root@storage ~]#svnadmin create --fs-type fsfs /data/svn/repos
##提示:
自Subversion1、1引入了基于文件系统的“fsfs”,而且在Subversion1、2之后变成默认选项,如果你使用的Subversion是1、2以后的版本,创建版本库时则可省略参数“- -fs-type fsfs”;如果你想使用BDB后端来代替fsfs,那么在创建你的版本库时就需要指定“—fs-type bdb”;
关于两种版本库数据储存的优缺点可以参考
3、3、1 版本库数据储存对照表
#值得恭喜你的是,一个新的版本库已经被创建,现在你可以执行ll命令查看一下版本库的结构;
[root@storage ~]#ll /data/svn/repos/
##提示
conf目录下存放了版本库的配置文件,以及用户验证文件和访问权限控制文件,文件本身的注释说明十分详细,读者可以根据注释自行配置;db 目录下存放着 Subversion 所要管理的所有受版本控制的数据,不同的存储方式(Berkeley DB 或者FSFS)下有着不同的目录结构,不过我们一般不用直接修改和查看这个目录下的内容,Subversion 的命令可以安全的操作这个目录;另外,hooks 目录存放着钩子脚本及其模版(一种版本库事件触发程序),locks 目录存放着Subversion 版本库锁定数据,format 文件记录了版本库的布局版本号。
3、4 创建项目
#项目是需要自己去创建的,以后用来存储用户提交(commit)的数据,以下是目录树结构,请自行创建;
3、4、1 导入项目
[root@storageconf]# svn import /storage/bbs/ file:///data/svn/repos/ -m 'forum storage '
Adding/storage/bbs/trunk
Adding/storage/bbs/branches
Adding/storage/bbs/tags
Committed revision1.
##备注
import关键字告诉subversion,我们想做的是把一些文件导入到项目仓库之中,参数‘-m‘使得你可以给这次的导入操作关联一条信息;你可能注意到file:///选项,它告诉Subversion到本地文件系统中寻找项目仓库,然后导入到项目/storage/bbs。
3、4、2 查询导入结果
[root@storage ~]# svnlist --verbose file:///data/svn/repos/
1 rootMay 14 02:52 ./
1 rootMay 14 02:52 branches/
1 rootMay 14 02:52 tags/
1 rootMay 14 02:52 trunk/
##备注
此时,项目已经成功导入到版本库中,也许你会有疑问,trunk,tags,branches目录的作用是什么,分别用来存储什么数据,我想说的是大部分的项目都会有一条主线开发(branches),而且大部分的工作都是在那里完成的,其次项目还可能有发布分支(trunk),存放的是已经完成的代码,是发布上线使用后存放在那里的,不会经常被改动,除了需要修正bug,添加新功能的时候。最后,项目生命周期中的重大事件经常需要使用标签(tags)来记录,通常一个标签会包含代码发布的版本号(revision)。
3、4、3 查询版本库详细信息
[root@storage ~]# svn info file:///data/svn/repos/ Path: repos URL: file:///data/svn/repos Repository Root: file:///data/svn/repos Repository UUID: 80e85530-0b77-4a69-94af-6c50810b2a5e Revision: 1 Node Kind: directory Last Changed Author: root Last Changed Rev: 1 Last Changed Date: 2014-05-14 02:52:45 -0700 (Wed, 14 May 2014)
##备注
根据显示的信息,我们可以知道版本库的路径是repos,URL的本地路径为file:///data/svn/repos,版本的所有者,UUID,版本号,以及上次变更的用户,具体时间等;
3、5 配置
3、5、1svnserve.conf文件,如下所示:
[root@storage ~]# cd /data/svn/repos/conf/ [root@storage conf]# vim svnserve.conf anon-access = none #指定匿名用户是否有权限访问版本库,无(none); auth-access = write #指定验证用户是否有权限访问版本库,写(write); password-db = passwd #指定用户的验证文件 authz-db = authz #指定用户访问权限控制文件
3、5、2authz文件,如下所示:
[aliases] # joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average [groups] admin = zhangsan,hechunyang test = liutong,zhangbo [repos:/] @admin = rw @test = r
##备注
1)Groups 定义用户组,一个用户组可以包含一个或多个用户,用户之间用逗号分隔,如下所示:
用户组= 用户,用户
admin = zhangsan,hechunyang
2)[repos:/] 定义版本库的格式与访问权限,“repos”表示版本库,“:/”表示版本库下的所有项目,关于权限的分配:w(写),r(读),“”(空)则表示不分配权限给用户或用户组,如下所示:
[repos:/]
@admin = rw
liutong = r
##提示
@admin= rw表示定义用户组的权限,用户组以“@”开头,授予其组中成员可读可写的权限;
Liutong= r表示定义用户的权限,授予可读权限;
* = 表示全部的用户,权限为空,即没有任何权限;
3、5、3 passwd文件,如下所示
[users] zhangsan = 123456 liutong = 123456 hechunyang = 123qwe zhangbo = 123456
##提示
passwd文件本身注释说明十分的详细,它告诉你如何去定义访问版本库的用户名以及密码,也给了示例,格式为:用户名 = 密码;我们可以看到密码是以明文的方式出现,显然十分的不安全,通过HTTP,HTTPS,SSL可以实现对用户密码md5加密,网据传输数据加密,还可以通过web浏览器访问SVN服务器内置的版本库。
3、5、4 启动SVN服务进程
[root@storage ~]# svnserve -d -r /data/svn/ [root@storage ~]# netstat -lntp | grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 47494/svnserve [root@storage ~]# ps -ef | grep svnserve root 47494 1 0 May14 ? 00:00:00 svnserve -d -r /data/svn/
四、客户端安装与测试
4、1 下载TortoiseSVN
http://jaist.dl.sourceforge.net/project/tortoisesvn/1.8.4/Application/TortoiseSVN-1.8.4.24972-x64-svn-1.8.5.msi
4、2 安装TortoiseSVN
4、3 签出SVN项目
##提示
a)svn://10.16.10.31/repos,10.16.10.31表示SVN服务器的IP地址,repos为SVN的版本库;
b)F:\storage,表示把版本库repos中的项目签入本地磁盘F下storage目录;
##提示
服务器端配置没有错误的话,输入passwd文件中指定的用户名与密码,便可把项目签出至本地;
##提示
可以看到bbs项目被签出到本地的F盘的storage目录下,后期开发组的成员会在相应的目录下完成所有的开发工作;
4、4 测试
##提示
研发人员在branches(主线)目录创建hello.txt文件,右键选择add添加文件,然后右键commit提交数据;
4、5 SVN更新
[root@webserver2~]# mkdir /storage
[root@webserver2~]# yum install subversion
[root@webserver2~]# svn co svn://10.16.10.31/repos /storage/ --username=zhangsan
##提示
我们已经把开发组成员提交的数据,成功更新至测试服务器的/storage目录下,其中参数co(checkout)签出数据,--username=zhangsan表示以张三用户的身份验证;
在写这篇文档之前,我浏览许多朋友的博客,看过Subversion相关的书籍,并结合实际工作中的经验写下这篇文档,希望能够帮助到需要的朋友。