1》Subversion版本控制简介:
Subversion(SVN)是一款自由开放的版本控制软件,可以管理文件,文件夹以及记录他们的修改状况,常用来帮助我们管理软件开发的源代码或是公司手册文档。SVN通过将文档导入至版本库中进行管理,版本库类似于文件服务器,但比文件服务器更强大的是,它可以记录用户每一次对文件或目录的修改状况,并提供还原数据至老版本的功能;版本控制对于软件开发而言是至关重要的,现在的软件开发一般作为项目进行,一个项目中会有很多人参加,那么每个人手中都有自己的一份修改备份,最后谁的版本是最新的?有时一款软件开发出来之后会有很多个版本,比如1.0版本,2.0版本,而且每个大版本下还有小版本号,1.1.1,2.1.1,等版本,SVN可以帮助我们很好地管理这些代码;
2》SVN架构图:
从下图可以看出,服务器端保存着Subversion的版本库,客户端通过命令或图形工具连接到服务器,并建立本地“工作副本”,也就是从服务器端将版本库中的资料复制到客户端本地,当然,客户端主机可以将自己本地的版本更新至服务器版本库,而客户端可以通过三种方式连接到服务器取得版本库中的数据:
版本库(Svn Repository)---------------------->服务器端
========================================================
Apache
mod_dav SVN
mod_dav_suv
Internet
--------------------------------------------------------------------------------------------------
DAV SVN Local
版本库访问
===========================================================
命令行或图形工具------------------------------》客户端
3》Subversion服务器:
客户端访问服务器时可以通过三种方式访问:svnserve访问,svnserve+ssh访问,Apache间接访问;
svnserve是一个小巧,轻便的服务器程序,客户端通过使用SVN专用的协议进行访问,其特点是简单;由于svnserve本身并不提供数据加密通信的功能,所以,如果需要更加安全的连接,可以使用svnserve+ssh的方式与服务器建立SSH隧道连接,再通过SSH调用svnserve程序,实现数据的安全加密传输;Apache通过mod_dav_svn模块可以访问版本库,这样客户端可以通过访问Apache取得版本库资料,从而完成对数据的版本控制;
*************
Apache+DAV svnserve svnserve+SSH
认证 HTTP基本认证,LDAP,证书 支持MD5认证 SSH认证
权限 可对版本库整体设置权限,也可对 可对版本库整体设置权限,也可对 仅对版本库 整体设置权限
指定目录设置权限 指定目录设置权限
加密 支持SSL加密 无 支持SSH隧道加密
日志 完善的Apache日志 无 无
速度 慢 快 快
设置 相对复杂 简单 相对简单
4》SVN服务器搭建:
1>安装SVN软件:
yum -y install subversion
2>搭建服务器:
版本库软件安装完成以后,我们首先要做的是创建一个版本库,svnadmin工具是SVN软件所提供的版本库管理工具,该工具可以用来创建库,备 份库,修订版本等操作;其次我们还需要为版本库建立一套有效的认证机制以增强版本数据库的安全性,最后当服务器端的所有设置均完成后,启动 服务器端相应的服务进程即可;
1)创建服务器版本库:
利用svnadmin命令可以创建服务器版本库;
描述:subversion版本库管理工具,通过svnadmin help可以查看命令帮助;
用法:svnadmin 命令 /版本库路径【选项】
命令:
create 创建一个新的版本库
hotcopy 版本库热备
lslocks 打印所有的锁描述
svnadmin实例:
svnadmin create /var/svn/project1
svnadmin hotcopy /var/svn/project1 /var/svn/projet1_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目录下的资料导入到刚刚创建的空版本库web_project中,-m后面跟的是说明性的字符串,可以为任意字符:
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文件中定义的认证与授权策略实现权限的控制,下面是该文件的核心配置说明:
在svnserve.conf中已经配置好了账户密码文件,下面分别看看passwd与authz文件的内容,默认该文件存放在版本库的conf目录下,在 passwd文件中需要设置账户信息,在authz文件中需要设置访问控制权限;
3)启动svnserve服务:
svnserve命令的描述和用法如下:
描述:SVN服务器程序
用法:svnserve [选项]
选项:
-d 以守护进程方式运行svnserve
--listen-port=port 指定监听的端口,默认监听端口号为3690
-r 为版本库指定一个虚拟路径,默认客户端要指定绝对路径访问库
直接运行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/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的使用格式及含义示下:
file:/// 直接访问本地磁盘上的版本库(客户端与服务器端在一台机器上)
http:// 配置Apache的WebDAV协议,通过网页访问版本库
https:// 与http://相似,但使用了SSL进行数据加密
svn:// 通过svnserve定义的协议访问版本库
svn+ssh:// 与svn://相似,但使用了SSH封装加密数据
在客户端访问服务器版本库的众多方法中,命令行的方式是高效,功能完善,无须安装第三方软件的一种简单方式,SVN软件为我们提供 了一个名为svn的命令行程序;
(1)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实例:
svn checkout file:///var/svn/project1 mine
svn co svn://192.168.0.254/project1 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命令可以帮助用户完成这些查询工作;
(2)svnlook命令
描述:subversion检查工具,通过svnlook help可以查看命令帮助;
用法:svnlook 命令 /版本库路径 【选项】
选项:--revision(-r) 指定要检查的特定版本
命令:
author 显示作者
cat 显示版本库中的文件内容
date 显示时间标记
log 显示日志消息
tree 显示版本库资料树
svnlook实例:
svnlook author /var/svn/web_project
svnlook author -r 2 /var/svn/web_project 查看版本2的作者信息
svnlook cat /var/svn/web_project a.text 查看版本库中a.text文件的内容
我们可以使用svn命令或图形工具连接版本库服务器,下载版本数据到本地,通过图形方式在本地计算机生成本地副本版本,图形工具 选的是windows平台的TortoiseSVN软件,安装完成该软件后,在桌面点击鼠标右键即可找到该工具,它是免费的基于GPL开发的开源自由软 件,它是subversion版本控制系统的一个非常优秀的客户端程序,可以帮助我们高效地管理文件与目录,我们可以在http://tortoisesvn.net/网站 上找到下载链接,该软件还提供了多语言软件包(包括中文);
5》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/cofe2 file:///var/svn/web_project2 -m "Web code"
3>客户端访问:
svn co svn+ssh://172.16.0.118/var/svn/web_project2 /web_code2
6》Apache+SVN服务器搭建:
虽然前面两种服务器类型已经可以满足大多数人的使用需求,但当客户端没有任何工具可以使用时,我们还可以创建基于Apache的SVN服务器,这样 客户端只要有浏览器,就可以访问版本库服务器,Apache是目前非常流行的Web服务器软件,它允许在几乎所有的计算机平台上运行,目前绝大多数系统 平台都可以部署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/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_dav_svn两个模块会被加载,还要确保/etc/httpd/conf/httpd.conf文件中dav_module模块也会被加载;另外为了满足用户对数据安全的 需求,我们还可以利用httpd的认证模块实现基于账户和密码的访问机制;
chown -R apache.apache /var/svn 修改权限
chown -R -t httpd_sys_content_t /var/svn 仅当SELinux开启时使用
htpasswd -c /var/svn/.pass jerry 创建账户文件,添加jerry用户
service httpd start
chkconfig httpd on
4>客户端访问
我们可以使用任何一款浏览器通过URL访问版本库数据,通过地址加端口和版本库根目录访问;
7》常见问题:
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平台下搭建subversion服务器,可以尝试通过安装SPI补丁包解决该问题;
5>Apache拒绝访问:
通过浏览器访问版本库时提示:You don't have permission to access /svn on this server;出现这种提示说明没有权限读取相应的目录,如 用户在这里输入:http://172.16.0.118/svn,就会得到这样的提示,正确的输入应为http://172.16.0.118/svn/web_project;