SVN是Subversion的简称,是一个开放源代码的版本控制系统,采用C/S模式。SVN有2中数据存储模式, 一是Berkeley DB 数据库中存放数据;二是使用普通文件,采用自定义的格式来储存,称为 FSFS
两种存储格式各有优缺点,如果需要使用FSFS,在创建版本库的时候加参数“--fs-type fsfs”即可。即:“svnadmin create --fs-type fsfs /data/svn/project”

特性 Berkeley DB FSFS
对操作中断的敏感 很敏感;系统崩溃或者权限问题会导致数据库“塞住”,需要定期进行恢复 不敏感
可只读加载 不能 可以
存储平台无关 不能 可以
可从网络文件系统访问 不能 可以
版本库大小 稍大 稍小
扩展性:修订版本树数量 无限制 某些本地文件系统在处理单一目录包含上千个条目时会出现问题。
扩展性:文件较多的目录 较慢 较慢
检出最新代码的速度 较快 可以
大量提交的速度 较慢,但时间被分配在整个提交操作中 较快,但最后较长的延时可能会导致客户端操作超时
组访问权处理 对于用户的 umask 设置十分敏感,最好只由一个用户访问 对 umask 设置不敏感
功能成熟时间 2001 年 2004 年

安装SVN

环境:
   Centos 7.2
   Subversion 1.7.14
   Apache 2.4.6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@localhost ~]# yum -y install svn
[root@localhost ~]# svnserve --version
svnserve, version 1.7.14 (r1542130)
···
[root@localhost ~]# mkdir -p /data/svn
[root@localhost ~]# svnadmin create /data/svn/project
[root@localhost ~]# ll /data/svn/project/
total 16
drwxr-xr-x 2 root root 51 May 31 00:17 conf #conf 目录下存放了版本库的配置文件,包括用户访问控制和权限控制等内容
drwxr-sr-x 6 root root 4096 May 31 00:17 db #db 目录下存放着 Subversion 所要管理的所有受版本控制的数据
-r--r--r-- 1 root root 2 May 31 00:17 format #format 文件记录了版本库的布局版本号
drwxr-xr-x 2 root root 4096 May 31 00:17 hooks #hooks 目录存放着钩子脚本及其模版(一种版本库事件触发程序)
drwxr-xr-x 2 root root 39 May 31 00:17 locks #locks 目录存放着 Subversion 版本库锁定数据
-rw-r--r-- 1 root root 229 May 31 00:17 README.txt
[root@localhost ~]# cd /data/svn/project/conf/
[root@localhost conf]# grep -v ^# passwd | grep -v ^$
[users]
jack = jackpass
bob = bobpass
[root@localhost conf]# grep -v ^# authz | grep -v ^$
[aliases]
[groups]
admin = jack
[/]
@admin = rw
[/svn_test]
bob = r
[root@localhost conf]# grep -v ^# svnserve.conf | grep -v ^$
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
[sasl]
[root@localhost conf]#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#导入项目
[root@localhost ~]# svn import /tmp/svncode/ file:///data/svn/project/ --message "init"
···
Adding /tmp/svncode/svn_test/test9.txt
Adding /tmp/svncode/svn_test/test1.txt
Adding /tmp/svncode/svn_test/test10.txt
Committed revision 1.
[root@localhost ~]#
#查看项目是否导入成功
[root@localhost ~]# svn list --verbose file:///data/svn/project/
1 root May 31 00:25 ./
1 root May 31 00:25 svn_test/
1 root May 31 00:25 svn_uu/
[root@localhost ~]#
#查看最新修订版本的信息
[root@localhost ~]# svnlook info /data/svn/project/
root
2017-05-31 00:25:41 +0800 (Wed, 31 May 2017)
4
init
[root@localhost ~]#
#显示版本库的具体树形结构,“--show-ids”指定显示每一个显示元素的修改版本 ID
[root@localhost ~]# svnlook tree /data/svn/project/ --show-ids
/ <0.0.r1/4948>
svn_test/ <n-1.0.r1/2515>
test2.txt <o-1.0.r1/697>
test3.txt <r-1.0.r1/873>
test4.txt <t-1.0.r1/1049>
test5.txt <v-1.0.r1/1226>
test6.txt <x-1.0.r1/1403>
test7.txt <z-1.0.r1/1580>
test8.txt <11-1.0.r1/1758>
test9.txt <13-1.0.r1/1937>
test1.txt <15-1.0.r1/340>
test10.txt <17-1.0.r1/518>
svn_uu/ <0-1.0.r1/4740>
uu8.txt <j-1.0.r1/4016>
uu9.txt <l-1.0.r1/4189>
uu1.txt <2-1.0.r1/2638>
uu10.txt <5-1.0.r1/2809>
uu2.txt <7-1.0.r1/2982>
uu3.txt <9-1.0.r1/3154>
uu4.txt <b-1.0.r1/3326>
uu5.txt <d-1.0.r1/3498>
uu6.txt <f-1.0.r1/3670>
uu7.txt <h-1.0.r1/3843>
[root@localhost ~]#
#启动svn
[root@localhost ~]# svnserve -d -r /data/svn/project/
[root@localhost ~]# netstat -tunlp | grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2054/svnserve
[root@localhost ~]# ps -ef | grep svn
root 2078 1 0 00:34 ? 00:00:00 svnserve -d -r /data/svn/project/
root 2094 1126 0 00:37 pts/0 00:00:00 grep --color=auto svn
[root@localhost ~]# tail -1 /etc/rc.local
svnserve -d -r /data/svn/project/
[root@localhost ~]# systemctl enable svnserve

svn_Verification
svn_Verification
SVN安装成功

安装Apache

通过 Http 协议可更方便的访问 Subversion 版本库,只需要打开浏览器,输入 URL 即可轻松的浏览整个版本库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# yum -y install httpd mod_dav_svn
[root@localhost ~]# httpd -version
Server version: Apache/2.4.6 (CentOS)
Server built: Apr 12 2017 21:03:28
[root@localhost ~]#
[root@localhost ~]# chown apache:apache /data/svn/project/ -R
[root@localhost ~]# cd /data/svn/project/
[root@localhost project]# htpasswd -cm htpassword jack
New password:
Re-type new password:
Adding password for user jack
[root@localhost project]# cat htpassword
jack:$apr1$wqsFKPQo$XwD1nh1Y7OPX.62dQIMt..
[root@localhost project]#
[root@localhost project]# chmod 644 htpassword

Apache与Subversion结合

由于 Subversion 需要版本化的控制,因此标准的 Http 协议不能满足需求。要让 Apache 与 Subversion 协同工作,需要使用 WebDAV(Web 分布式创作和版本控制)。WebDAV 是 HTTP 1.1 的扩展,关于 WebDAV 的规范和工作原理,参考:http://www.ietf.org/rfc/rfc2518.txt
为了使 Subversion 与 dav 模块通信,需要安装 mod_dav_svn 插件。默认情况下没有安装,至少我这里是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost ~]# cd /etc/httpd/modules/
[root@localhost modules]# ll | grep -i mod_dav_svn.so
-rwxr-xr-x 1 root root 181336 Nov 21 2015 mod_dav_svn.so
[root@localhost modules]# ll | grep -i mod_dav.so
-rwxr-xr-x 1 root root 102400 Apr 13 05:04 mod_dav.so
[root@localhost modules]#
[root@localhost ~]# cd /etc/httpd/
[root@localhost httpd]# tail -1 conf/httpd.conf
IncludeOptional conf.d/*.conf
[root@localhost httpd]#
[root@localhost httpd]# cat conf.d/subversion.conf
#使用mod_authz_svn进行目录访问控制
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn>
DAV svn
SVNPath "/data/svn/project/"
AuthType Basic
AuthName "svn repos"
AuthUserFile "/data/svn/project/htpassword" #前面用htpasswd生成的认证文件
AuthzSVNAccessFile "/data/svn/project/conf/authz" #SVN的 authz 的策略文件
Satisfy Any #用户验证机制,值为all|any。用于一个目录同时被这两个规则作用,All要同时满足两个条件,Any只要满足一个即可
Require valid-user
</Location>
[root@localhost httpd]#
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd

初始版本库
Apache+subversion
这样做的好处是,用户访问管理员给的URL时,首先需要通过Apache的登录验证,再验证SVN的 authz ,两者都满足时,才能正常访问,且用户无法点上面的两个冒号切到上级目录(这时会切到初始版本库),如下图
Apache+subversion
如果用户满足了Apache的登录验证,但不满足SVN的验证,则会出现下图所示的情况
Apache+subversion

如果启动报下面这个错误,是因为没有安装mod_dav_svn,而在apache和subversion通讯需要加载“mod_dav_svn.so”和“mod_authz_svn.so”模块

1
May 31 01:42:22 localhost httpd[11633]: Unknown DAV provider: svn

如果通过浏览器访问,出现下面信息,说明我们部署是没有问题的,只是访问URL搞错了
在subversion.conf中如果配置“”,则浏览器访问时的URL为:http://ip/svn

1
( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops atomic-revprops partial-replay ) ) )

关于其他配置可以参考:https://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/


本文出自”Jack Wang Blog”:http://www.yfshare.vip/2017/05/30/部署Apache-Subversion版本控制系统/