Subversion
简介
Subversion(简称SVN)是一款自由开放的版本控制软件,SVN可以管理文件、文件夹以及记录它们的修改状况。SVN常用来
帮助我们管理软件开发的源代码或是公司手册文档。SVN通过将文档导入值版本库中进行管理,版本库类似于文件服务器,但
比文件服务器更强大的是,它可以记录用户每一次对文件或目录的修改状况,并提供还原数据至老版本的功能
版本控制对于软件开发而言是至关重要的,现在的软件开发一般作为项目进行,一个项目中会有很多人参与,那么每个人手中
都有自己的一份修改备份,最后谁的版本是最新的?有时一款软件开发出来后会有很多个版本,比如1.0版本、2.0版本,而且
每个大版本下面还有小版本号,如1.1.1、2.1.1等,如此多的代码如何管理?SVN可以很好地帮助我们管理这些代码。
这里我们设定一个模拟环境,如下图,版本库是我们存放资料的地方,本文中我们以172.16.0.118作为版本库服务器的IP地址
图中有两个用户需要经常对版本库中的资料进行读写操作。从图中的I开始,两个用户都从版本库中将数据复制到了本地,此时
用户本地电脑上的数据是版本库的副本(也叫工作副本)。图II中,两个用户在各自电脑上对副本文件分别修改为A1与A2,并且
图III中的一个用户先与版本库进行了数据同步,将本地的最新版本数据更新到服务器上,服务器版本被更新至A1版本,随后图IV
中的另一个用户也想将自己修改的A2版本与服务器数据版本同步,则服务器会提示该用户A2版本已经过期,如果两个人的修改
并不冲突(修改的是版本库中不同的文件或统一文件不同地方),可以选择将两个版本合并后再上传至服务器,如果两个人的修改
有冲突,则需要人工判断谁的修改有效,最后再上传至版本库。

下图是SVN的架构图,从图中可以看出,服务器端保存着SVN的版本库,客户端通过命令或图形工具连接到服务器,并建立本地
"工作副本",也就是从服务器端将版本库中的资料复制至客户端本地。当然,客户端主机可以将自己本地的版本更新至服务器版
本库。

SVN服务器对比
客户端访问服务器时可以通过三种方式访问:svnserve访问、svnserve+SSH访问、Apache间接访问。
- svnserve是一个小巧、轻便的服务器程序,客户端通过使用SVN专用的协议进行访问,其特点是简单
- 由于svnserve本身不提供数据加密通信的功能,所以,如果你需要更加安全地连接,可以使用svnserve+ssh的方式
与服务器建立SSH隧道连接,再通过SSH调用svnserve程序,实现数据的安全加密传输 - Apache通过mod_dav_svn模块可以访问版本库,这样客户端可以通过访问Apache取得版本库的资料,从而完成对
数据的版本控制

安装
Subversion版本控制软件在CentOS6.3系统光盘中有RPM格式的版本,但RPM格式的软件无法进行自定义设置。所以,如果需要更高的灵活性或
高度的可定制性,可以到Subversion官网下载源码软件,源码包可以到网址http://apache.etoak.com/subversion/subversion-1.7.8.tar.gz
处下载。我们用的是系统光盘中自带的RPM软件包,下面通过YUM方式安装该软件包
yum -y install subversion
svnserve服务器搭建
版本库软件安装完成后,我们首先要做的是创建一个版本库,svnadmin工具还是Subversion软件所提供的版本库管理工具,该工具可以用来创建
库、备份库、修订版本等操作。其次,我们还需要为版本库建立一套有效的认证机制以增强版本数据库的安全性。最后,当服务器端的设置均完成后,
启动服务端相应的服务进程即可
1、创建服务器版本库
利用svnadmin命令可以创建服务器版本库。该命令的描述和用法如下
描述:subversion版本库管理工具,通过svnadmin help可以查看命令帮助
用法:svnadmin 命令 /版本库路径 [选项]
命令:create 创建一个新的版本库
hotcopy 版本库热备
lslocks 打印所有的锁描述
svnadmin示例:
svnadmin create /var/svn/project1
svnadmin hotcopy /var/svn/project1 /var/svn/project1_copy
svnadmin lslocks /var/svn/project1
ABC公司近期刚刚接到一个网站项目,由于项目开发时多人进行的,所以公司希望使用版本控制系统高效的管理项目代码,项目代码保存在/var/web_code
目录下,下面我们将为该项目创建名为web_project的版本库
mkdir /var/svn
svnadmin create /var/svn/web_project
通过svnadmin命令已经创建了一个名为web_project的空版本库,下面我们将使用svn命令将项目代码导入到版本库中。import代表执行导入操作,将本地
web_code目录下的资料导入
svn import /var/web_code file:///var/svn/web_project/ -m "Initial Data"
svn list file:///var/svn/web_project/ #列出版本库中的资料列表
2、认证与授权
使用SVN内置的认证机制可以有效地增强客户端访问版本库的安全性,当客户端访问版本库服务器时,服务器会根据版本库目录下的conf/svnserve.conf文件中
定义的认证与授权策略实现权限的控制。下面是此文件的核心配置说明:
cat /var/svn/web_project/conf/svnserve.conf

在svnserve.conf中已经配置好了账户密码文件,下面分别看看passwd与authz文件的内容,默认改文件存放在版本库的conf目录下。在passwd文件中需要设置账户信息,
在authz文件中需要设置访问控制权限。
cat /var/svn/web_project/conf/passwd

cat /var/svn/wen_project/conf/authz

3、启动svnserve服务
svnserve命令的描述和用法如下
描述:SVN服务器程序
用法:svnserve [选项]
选项:-d 以守护进程方式运行svnserve
--listen-port=port 指定监听端口,默认监听端口号为3690
-r root 为版本库指定一个虚拟路径,默认客户端要指定绝对路径访问库
svnserve -d
直接运行svnserve命令即可启动SVN服务进程,但如果需要该服务作为后台程序持续监听客户端访问,可以使用-d选项使该程序以
守护进程的方式启动svnserve服务,SVN服务默认监听端口3690,如果防火墙处于开启状态,需要注意对防火墙的正确设置。svnserve
运行后,会将所有的版本库发布至网络(假设有多个版本库)。此时,客户端需要指定绝对路径访问版本库,如:
svn://centos.example.com/var/svn/web_project。同时,服务器端如果需要在authz文件中为目录设置权限,路径应该为
[web_project:/]或[project2:/test],这里的[web_project:/]表示web_project版本库的根,[project2:/test]表示project2下
的test目录
默认SVN会将服务器计算机中所有的版本库共享给网络用户,但有时我们仅希望发布其中一个版本时,就需要限制仅发布web_project
一个版本至网络,这样客户端也可以使用相对路径访问版本库,如:svn://centos.example.com/var/svn/web_project(客户端会
访问服务器/var/svn/目录下的web_project目录)。同时,服务器端如果需要在authz文件中为目录设置权限,路径应该为[/]或[/test]
即这里的根(/)仅表示web_project版本库,/test表示web_project下的test目录。如果需要仅发布个别版本给网络用户,可以使用
svnserve命令的-r选项,该选项后面接版本库的路径
svnserve -d -r /var/svn/
4、客户端访问
版本库服务器创建完成后,我们可以通过多种方式访问SVN服务器的版本库,可以使用命令行或图形工具,也可以通过本地磁盘或网络
协议访问。但不管使用哪种方式,都需要提供一个URL地址来定位版本库位置,下表具体说明了每种URL的使用格式及定义

在客户端访问服务器版本库的众多方法中,命令行的方式是高效、功能完善、无需安装第三方软件的一种简单方式,SVN软件为我们提供了
一个名为svn的命令行程序。
a、svn命令
描述:subversion客户端命令行工具
用法:svn 命令 [选项]
选项:--password 密码
--username 用户名
--revision(-r) 指定要检查的特定版本
命令:add 添加文件、目录或符号链接
cat 输出特定文件的内容
checkout URL[@REV][PATH]
从服务器版本库中复制一份副本至本地,URL定位版本库,通过REV可以下载特定版本的数据,PATH为本地工作副本路径
commit 将本地工作副本修改后的内容发布到版本中,简写为ci
copy SRC DST 将工作副本中的一个文件或目录复制至版本库
delete PATH 从本地工作副本中删除一个项目
delete URL 从版本库中删除一个项目
diff 对比两个版本之间的差异
import 提交一个路径的副本至版本库
info 显示本地或远程版本信息
示例:
svn checkout file:///var/svn/project1 mine
svn co svn://192.168.0.254/project1 mine
svn co svn://172.16.0.118/web_project /mine
svn commit -m "modified foo.html"
svn commit -m "modified foo.html" /mine
svn delete testfile
svn diff
svn import -m "New project" /etc file:///var/svn/project
svn info
svn info svn://172.16.0.118/var/svn/web_project
除了核心的svn命令,SVN软件包还提供了一个用于对版本库数据信息进行简单查询的工具,svnlook命令可以帮助用户完成这些查询工作
b、svnlook命令
描述:subversion检查工具,通过svnlook help可以查看命令帮助
用法:svnlook 命令 /版本库路径 [选项]
选项:--revision(-r) 指定要检查的特定版本
命令:author 显示作词
cat 显示版本库中的文件内容
date 显示时间标记
log 显示日志消息
tree 显示版本库资料树
示例:
svnlook author /var/svn/project1
svnlook author -r 2 /var/svn/project1 #查看版本2的作者信息
svnlook author -r 2 /var/svn/project1 test #查看版本库中test文件的内容
我们可以使用svn命令或图形工具连接版本库服务器,下载版本数据至本地。上面我们介绍了以命令行的方式访问服务器版本数据库,下面
来看客户端端主机如何通过SVN图形程序访问服务器版本库。通过图形方式在本地计算机生成本地副本版本。图形工具选择的Windows平台
的TortoiseSVN软件,在Windows中安装完成该软件后,在桌面单击鼠标右键即可以找到该工具。TortoiseSVN是免费的基于GPL开发的
开源自由软件,它是subversion版本控制系统的一个非常优秀的客户端程序,可以帮助我们高效地管理文件与目录。
svnserve+SSH服务器搭建
由于svnserve并不支持加密,所以对公司的数据安全危害比较大,基于SSH的svnserve使得客户端可以通过SSH服务
调用SVN服务程序。客户端需要使用ssh程序连接远程服务器的sshd服务,通过SSH认证机制验证账户身份后,再自动
启动svnserve服务。所以服务器端不需要提前启动SVN服务。在这种模式下,svnserve.conf配置文件依然可以进行权限
控制,服务部署流程是启动SSH服务,在服务器上创建版本库,向版本库导入数据,最后客户端使用命令或图形方式访问
服务器。
1、服务器端启动sshd服务
service sshd start
chkconfig sshd on
2、服务器端创建版本库
svnadmin create /var/svn/web_project2
svn import /var/code2 file:///var/svn/web_project2 -m "web code"
3、客户端访问
svn co svn+ssh://172.16.0.118/var/svn/web_project2 /web_code2
下面是通过图形工具访问下载版本库的过程


Apache+SVN服务器搭建
虽然前面两种服务器类型已经满足多数人的使用需求,但当客户端没有任何工具可以使用时,我们还可以创建基于Apache的SVN服务器,
这样客户端只要有浏览器,就可以访问版本库服务器。Apache是目前非常流行的web服务器软件,它允许在几乎所有的计算机平台上运行,
目前绝大多数系统平台都可以部署Apache Web Server,使用Apache Web Server访问版本库需要加载mod_dav与mod_dav_svn模块,
Apache需要通过这两个模块才可以管理subversion版本库。
为什么要使用Apache发布subversion版本库:
- subversion可以使用Apache的多种认证方式
- 不需要创建系统账户
- Apache提供了完整的日志功能
- 可以通过TLS进行数据加密
- HTTP及HTTPS可以穿越企业防火前
- 客户端简单的通过浏览器访问版本库
1、创建服务器版本库
svnadmin create /var/svn/web_project3
svn import /var/svn/web_code3 file:///var/svn/web_project3 -m "Term 3"
2、安装Apache及相关模块
yum -y install httpd
yum -y install mod_dav_svn
3、修改Apache配置
为了让Apache Web Server可以读取SVN版本库中的数据,我们需要修改httpd针对SVN的配置文件subversion.conf,在该文件中至少确保
mod_dav和mod_authz_svn两个模块会被加载。另外,为了满足用户对数据安全的需求,我们还可以利用httpd的认证模块实现基于账户密码
的访问机制
vim /etc/httpd/conf.d/subversion.conf


chown -R apache.apache /var/svn #修改权限
chcon -R -t httpd_sys_content_t /var/svn #仅当SELinux开启时使用
htpasswd -c /var/svn/.pass jerry #创建账户文件,添加jerry用户
service httpd start
chkconfig httpd on
4、客户端访问

常见问题
1、访问版本库路径错误
如果通过svnserve命令启动服务时指定了发布的具体版本库,则客户端访问时就可以直接使用相对路径访问,如果服务器端使用
svnserve -d -r /var/svn/启动服务后,客户端依然使用svn co svn://172.16.0.118/var/svn/web_project /mine,系统将
提示:svn:No repository found,说明没有找到该版本库,正确的写法是svn co svn://172.16.0.118/web_project /mine
2、每次访问版本库时,进程就会挂起
首先确保版本库没有被损坏,数据也没有丢失。当进程直接访问版本库时,进程将通过Berkeley DB来实现。Berkeley DB包含
日志系统,也就是说,所有的操作在执行前都被记录在日志中。当进程崩溃时,遗留下文件锁,并记录了所有未完成操作的消息,
从而导致所有视图访问数据库的进程将因为要访问文件锁而被挂起。若想删除文件锁,可以回滚到前一个正常状态
3、subversion提示工作副本已过时
这可能是提交失败导致了你的工作副本被破坏,可以使用svn revert回滚、svn update更新来解决
4、Windows XP下,subversion服务器有时会发布一些错误数据
Windows XP系统目前基本退役,如果是在Windows平台下搭建subversion服务器,可以尝试通过安装补丁包来解决
5、Apache拒绝访问
通过浏览器访问版本库时提示:You don't have permission to access /svn on this server。出现这种提示说明没有权限读取
相应的目录

浙公网安备 33010602011771号