首页 > 代码库 > 构建企业代码管理系统之SVN服务(基础篇)

构建企业代码管理系统之SVN服务(基础篇)

一、What‘s is a subversion

SubversionSVN)是一个开源的,跨平台的版本控制系统,由CollabNet公司成立于2000年;Subversion作为新一代的版本管理系统,以其目录版本化、原子提交、版本化的元数据、更加有效的分支和标签等特性,至今已被众多的互联网企业使用来管理网站、论坛的代码文件;Subversion最独特的地方,便是可以通过Apache的扩展模块与ApacheHTTP服务相结合,实现更安全的特性与管理,其次用户还可以通过HTTP协议去访问版本库,还可以通过SSL协议传输加密,保证数据的安全性;SubversionApache软件基金会的发展的一个项目,并且也是一个丰富的开发人员和用户社区的一部分。


Subversion存储版本数据方式2种:BDB(一种事务安全型表类型)FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点;那么在创建Subversion版本控制仓库的时候,可以指定存储版本数据为FSFS方式;

二、Svbsersion系统逻辑架构图

wKioL1N0nPqSMG5hAAHpADesTQo983.jpg

三、安装与配置

31 服务器资源列表

服务器名称

系统

CPU架构

内核

IP地址

角色

storage

CentOS 6.3

x86_64

2.6.32-279.el6.x86_64

10.16.10.31

SVN服务器


32 安装

321 CentOS系统下安装

[root@storage ~]#rpm -qa | grep subversion

[root@storage ~]#yum install subversion


wKiom1N0nXOzrb2JAAHWFM8Gopw668.jpg

322 Ubuntu系统下安装

[root@ubuntu ~]#dpkg -l subversion

root@host-93:~#apt-get install subversion

wKioL1N0nVmjCcvpAAJOa5YsctI270.jpg

323 关于Subversion 组件

1svn

命令行客户端程序;


2svnversion

显示工作拷贝的状态,即当前项目修订的版本;


3svnlook

服务器端直接查看Svbversion版本库的工具;


4svnadmin

服务器端建立、调整和修复Subversion版本库的工具;


5svndumpfilter

过滤Subversion版本库转存数据流的工具;


6mod_dav_svn

Apache HTTP服务器的一个模块,使版本库可以通过网络访问;


7svnserve

服务器端程序,用来启动SVN服务的守护进程;


8svnsync

可以通过网络增量镜像版本库的程序;

324 验证安装结果

[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版本为16,默认版本数据存储方式为FSFS;从显示的结果上,我们还可以知道Subversion支持基于httphttps协议访问版本库,支持本地、远程导入项目与SASL的验证方式;

33 创建版本库

[root@storage ~]#mkdir /data/svn –p

[root@storage ~]#svnadmin create --fs-type fsfs /data/svn/repos

##提示:

Subversion11引入了基于文件系统的“fsfs”,而且在Subversion12之后变成默认选项,如果你使用的Subversion12以后的版本,创建版本库时则可省略参数“- -fs-type fsfs”;如果你想使用BDB后端来代替fsfs,那么在创建你的版本库时就需要指定“—fs-type bdb”

关于两种版本库数据储存的优缺点可以参考

331 版本库数据储存对照表

wKiom1N0vEmRx3TaAANfW7h7SjY998.jpg


#值得恭喜你的是,一个新的版本库已经被创建,现在你可以执行ll命令查看一下版本库的结构;

[root@storage ~]#ll /data/svn/repos/


wKiom1N0nfCzjAjwAAEjc3mbDIk074.jpg

##提示

conf目录下存放了版本库的配置文件,以及用户验证文件和访问权限控制文件,文件本身的注释说明十分详细,读者可以根据注释自行配置;db 目录下存放着 Subversion 所要管理的所有受版本控制的数据,不同的存储方式(Berkeley DB 或者FSFS)下有着不同的目录结构,不过我们一般不用直接修改和查看这个目录下的内容,Subversion 的命令可以安全的操作这个目录;另外,hooks 目录存放着钩子脚本及其模版(一种版本库事件触发程序),locks 目录存放着Subversion 版本库锁定数据,format 文件记录了版本库的布局版本号。

34 创建项目

#项目是需要自己去创建的,以后用来存储用户提交(commit)的数据,以下是目录树结构,请自行创建;

wKiom1N0nh_SU9wnAACHBtPSbmw257.jpg

341 导入项目

[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

342 查询导入结果

[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/

##备注

此时,项目已经成功导入到版本库中,也许你会有疑问,trunktagsbranches目录的作用是什么,分别用来存储什么数据,我想说的是大部分的项目都会有一条主线开发(branches),而且大部分的工作都是在那里完成的,其次项目还可能有发布分支(trunk),存放的是已经完成的代码,是发布上线使用后存放在那里的,不会经常被改动,除了需要修正bug,添加新功能的时候。最后,项目生命周期中的重大事件经常需要使用标签(tags)来记录,通常一个标签会包含代码发布的版本号(revision)。


343 查询版本库详细信息

[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)

##备注

根据显示的信息,我们可以知道版本库的路径是reposURL的本地路径为file:///data/svn/repos,版本的所有者,UUID,版本号,以及上次变更的用户,具体时间等;

35 配置

351svnserve.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                                    #指定用户访问权限控制文件

352authz文件,如下所示:

[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 = zhangsanhechunyang


2[repos:/] 定义版本库的格式与访问权限,“repos”表示版本库,“:/”表示版本库下的所有项目,关于权限的分配:w(写),r(读),“”(空)则表示不分配权限给用户或用户组,如下所示:

[repos:/]

@admin = rw

liutong = r


##提示

@admin= rw表示定义用户组的权限,用户组以“@”开头,授予其组中成员可读可写的权限;

Liutong= r表示定义用户的权限,授予可读权限;

* = 表示全部的用户,权限为空,即没有任何权限;

353 passwd文件,如下所示

[users]
zhangsan = 123456
liutong = 123456
hechunyang = 123qwe
zhangbo = 123456

##提示

passwd文件本身注释说明十分的详细,它告诉你如何去定义访问版本库的用户名以及密码,也给了示例,格式为:用户名 = 密码;我们可以看到密码是以明文的方式出现,显然十分的不安全,通过HTTPHTTPSSSL可以实现对用户密码md5加密,网据传输数据加密,还可以通过web浏览器访问SVN服务器内置的版本库。

354 启动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/


四、客户端安装与测试

41 下载TortoiseSVN

http://jaist.dl.sourceforge.net/project/tortoisesvn/1.8.4/Application/TortoiseSVN-1.8.4.24972-x64-svn-1.8.5.msi

42 安装TortoiseSVN

wKioL1N0nwmg4KZsAAG_9Y10aH0334.jpgwKioL1N0nxqi_TdwAAEyDsIusvU826.jpg

43 签出SVN项目

wKioL1N0n03DlUj1AAFcfT_NLYw554.jpg

##提示

asvn://10.16.10.31/repos10.16.10.31表示SVN服务器的IP地址,reposSVN的版本库;

bF:\storage,表示把版本库repos中的项目签入本地磁盘Fstorage目录;

wKiom1N0n52DToxBAADU3u7cINI318.jpg

##提示

服务器端配置没有错误的话,输入passwd文件中指定的用户名与密码,便可把项目签出至本地;

wKioL1N0n4aj_OyLAAGVp42DZ0I870.jpg

##提示

可以看到bbs项目被签出到本地的F盘的storage目录下,后期开发组的成员会在相应的目录下完成所有的开发工作;

44 测试

wKioL1N0n6bjzx6eAAJDkurFSMc317.jpg

wKiom1N0n9HgJQSfAAFU2tQsyJ4983.jpg

##提示

研发人员在branches(主线)目录创建hello.txt文件,右键选择add添加文件,然后右键commit提交数据;

45 SVN更新

[root@webserver2~]# mkdir /storage

[root@webserver2~]# yum install subversion

[root@webserver2~]# svn co svn://10.16.10.31/repos /storage/ --username=zhangsan

wKioL1N0n8-hA6XYAALjWdt3mpA370.jpg

##提示

我们已经把开发组成员提交的数据,成功更新至测试服务器的/storage目录下,其中参数cocheckout)签出数据,--username=zhangsan表示以张三用户的身份验证;


在写这篇文档之前,我浏览许多朋友的博客,看过Subversion相关的书籍,并结合实际工作中的经验写下这篇文档,希望能够帮助到需要的朋友。


本文出自 “人生有梦而精彩” 博客,请务必保留此出处http://cfwlxf.blog.51cto.com/3966339/1412024