Svn工作原理和服务搭建
 
简介
subversion(以下简称svn)版本管理工具,是cvs的接班人。
svn服务器有2种运行方式:独立服务器和借助apache,2种方式各有利弊。
svn存储版本数据也有2种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
一下安装为借助apache的运行方式
 
一、安装所需软件包
1、安装httpd
[root@localhost ~]# tar xvf httpd-2.2.15.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/httpd-2.2.15/
[root@localhost httpd-2.2.15]# 
[root@localhost httpd-2.2.15]# ./configure --prefix=/usr/local/apache-2.2.15 --enable-dav --enable-so --enable-rewrite --enable-modules=most
[root@localhost httpd-2.2.15]# make
[root@localhost httpd-2.2.15]# make install
 
2、安装apr、apr-util
[root@localhost ~]# tar xvf apr-1.3.8.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/apr-1.3.8/
[root@localhost apr-1.3.8]# ./configure --prefix=/usr/local/apr-1.3.8
[root@localhost apr-1.3.8]# make
[root@localhost apr-1.3.8]# make install
[root@localhost ~]# tar xvf apr-util-1.3.9.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/apr-util-1.3.9/
[root@localhost apr-util-1.3.9]# ./configure --prefix=/usr/local/apr-util-1.3.9 --with-apr=/usr/local/apr-1.3.8/
[root@localhost apr-util-1.3.9]# make
[root@localhost apr-util-1.3.9]# make install
 
3、安装sqlite
[root@localhost ~]# tar xvf sqlite-amalgamation-3.6.13.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/sqlite-3.6.13/
[root@localhost sqlite-3.6.13]# ./configure --prefix=/usr/local/sqlite-3.6.13
[root@localhost sqlite-3.6.13]# make
[root@localhost sqlite-3.6.13]# make install
 
4、安装 none
[root@localhost ~]# tar xvf neon-0.29.6.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/neon-0.29.6/
[root@localhost neon-0.29.6]# ./configure --prefix=/usr/local/neon-0.29.6 --enable-shared
[root@localhost neon-0.29.6]# make
[root@localhost neon-0.29.6]# make install
 
5、安装libtool、expat  (expat  expat-devel)
yum -y install expt*
yum -y install libtool*
 
二、安装svn
确认所有所需的软件包全部安装
[root@localhost local]# ls
apache-2.2.15  apr-1.3.8  apr-util-1.3.9  bin  etc  games  include  lib  lib64  libexec  neon-0.29.6  sbin  share  sqlite-3.6.13  src
[root@localhost local]# 
 
1、编译安装svn
[root@localhost ~]# tar xvf subversion-1.6.6.tar.bz2 -C /usr/local/src/
[root@localhost ~]# tar xvf subversion-deps-1.6.6.tar.bz2 -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/subversion-1.6.6/zlib/
[root@localhost zlib]# ./configure --shared
[root@localhost zlib]# make
[root@localhost zlib]# make install
[root@localhost zlib]# cd ..
[root@localhost subversion-1.6.6]# ./configure --prefix=/usr/local/svn-1.6.6  --with-apxs=/usr/local/apache-2.2.15/bin/apxs --with-apr=/usr/local/apr-1.3.8/ --with-apr-util=/usr/local/apr-util-1.3.9/ --with-sqlite=/usr/local/sqlite-3.6.13/ --with-neon=/usr/local/neon-0.29.6/ --with-ssl --with-zlib=/usr/local/src/subversion-1.6.6/zlib/
注:如果最后出现下面WARNING,我们直接忽略即可。因为不使用BDB存储。
[root@localhost subversion-1.6.6]# make
[root@localhost subversion-1.6.6]# make install
确认是否安装成功
[root@localhost ~]# cd /usr/local/apache-2.2.15/conf/
[root@localhost conf]# vim httpd.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
 
2、创建版本库
1、创建版本库
[root@localhost ~]# /usr/local/svn-1.6.6/bin/svnadmin create /svn/www/
[root@localhost ~]# ls /svn/www/
conf  db  format  hooks  locks  README.txt
 
2、修改库配置文件
[root@localhost ~]# cd /svn/www/conf/
[root@localhost conf]# vim svnserve.conf
anon-access = none    #使非授权用户无法访问
auth-access = write    ##使授权用户有写权限
password-db = /svn/www/conf/passwd # 指明密码文件路径
authz-db = /svn/www/conf/authz # 访问控制文件
realm = www Repository # 认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字。
 
3、添加apache认证用户
[root@localhost conf]# /usr/local/apache-2.2.15/bin/htpasswd -c /svn/www/conf/passwd test
New password: 
Re-type new password: 
Adding password for user test
 
4、修改svn认证文件
[root@localhost ~]# cd /svn/www/conf/
[root@localhost conf]# vim authz 
[groups]
groupA=www
[www:/]
@groupA = rw  或者   www = rw(可以对单个用户定义权限)
 
5、配置apache中svn认证
最后面添加
[root@localhost ~]# cd /usr/local/apache-2.2.15/conf/
[root@localhost conf]# vim httpd.conf
<Location /www>
DAV svn
SVNPath /svn/www                              #库文件路径
AuthType Basic                                #基本认证
AuthName "Welcome To www Repository"
AuthUserFile /svn/www/conf/passwd             #apache认证文件
AuthzSVNAccessFile /svn/www/conf/authz        #svn认证文件
Require valid-user                            #告诉apache在authfile中所有的用户都可以访问。如果没有它,则只能第一个用户可以访问新建库。
 
</Location>
 
6、修改权限
root@localhost ~]# chown -R daemon:daemon /svn/www/
可以修改环境变量方便执行命令
[root@localhost ~]# vim .bash_profile
PATH=$PATH:/usr/local/svn-1.6.6/bin/
[root@localhost ~]# source .bash_profile   #使之立刻生效
 
7、启动apache 和svn
[root@localhost conf]# /usr/local/apache-2.2.15/bin/apachectl start
[root@localhost conf]# /usr/local/svn-1.6.6/bin/svnserve -d -r /svn/
   此指令用于启动svn服务,-d指明以守护模式运行,svn自动在3690端口监听,-r选项用来指定svn服务的根目录,这样用户就可以使用相对路径访问,而不用提供完整路径。
 
8、测试
1、在浏览器中输入
http://svn服务器IP/www
输入用户名密码访问
2、用客户端
 
3、svn日常管理命令
1、创建版本库
[root@localhost ~]# svnadmin create /svn/www/
www 为创建的版本库
 
2、导入数据到版本库
[root@localhost ~]# ll test/
总用量 0
-rw-r--r--. 1 root root 0  3月 27 01:23 a
-rw-r--r--. 1 root root 0  3月 27 01:23 b
-rw-r--r--. 1 root root 0  3月 27 01:23 c
[root@localhost ~]# svn import /root/test/ file:///svn/www/ -m "import"
增加           /root/test/a
增加           /root/test/b
增加           /root/test/c
提交后的版本为 1。
 
3、查看版本库内容
查看版本库最新版本
[root@localhost ~]# svnlook youngest /svn/www
5
查看版本库中的内容
[root@localhost ~]# svn list file:///svn/www/
a
b
c
[root@localhost ~]# 
显示一个版本仓库中文件和目录的树形结构图
[root@localhost ~]# svnlook tree /svn/www/ --show-ids
/ <0.0.r1/626>
 a <0-1.0.r1/51>
 b <3-1.0.r1/207>
 c <5-1.0.r1/365>
[root@localhost ~]# 
显示被修改的文件
[root@localhost ~]# svnlook diff /svn/www/
已修改: a
===================================================================
--- a 2012-03-26 17:24:56 UTC (rev 1)
+++ a 2012-03-26 17:32:21 UTC (rev 2)
@@ -0,0 +1 @@
+test
\ No newline at end of file
[root@localhost ~]#
 
4、svn备份
备份
svnadmin -h 显示svnadmin命令的子命令
svnadmin dump -h 显示dump命令的子参数命令
1、完全备份版本库,并保存为www_full_bak
[root@localhost ~]# svnadmin dump /svn/www > /root/www_full_bak
2、以增量把版本库版本5的信心并转存到www_bak_1
[root@localhost ~]# svnadmin dump /svn/www/ -r 5 --incremental > /root/www_bak_5
对于一些较大的版本库可以分解备份
[root@localhost ~]# svnadmin dump /svn/www/ -r 10:20 --incremental > /root/www_bak_10-20
参数介绍:
  -r [--revision] ARG      : 指定版本 ARG (或 X:Y 范围)
  --incremental            : 以增量方式进行转存
  --deltas                 : 在转存输出中使用差异
  -q [--quiet]             : 在标准错误输出不显示进度 (仅错误)
3、热拷贝www这个版本库,可以直接拿来用,但要确保权限
[root@localhost ~]# svnadmin hotcopy /svn/www/ /root/www_hotcopy
 
5、SVN还原
[root@localhost ~]# svnadmin load /svn/www/ < /root/www_full_bak 
还原完全备份
[root@localhost ~]# svnadmin dump /svn/www/ -r 5 --incremental > /root/www_bak_1
再还原增量备份
[root@localhost ~]# svnadmin dump /svn/www/ -r 10:20 --incremental > /root/www_bak_1
[root@localhost ~]# svnadmin dump /svn/www/ -r 21:40 --incremental > /root/www_bak_1
 
6、SVN合并
1、创建版本库crazy
svnadmin create /svn/crazy
2、备份/svn/www 和 /svn/redhat 版本库
[root@localhost ~]# svnadmin dump /svn/www > /root/www_full_bak
[root@localhost ~]# svnadmin dump /svn/redhat/ > /root/redhat_full_bak
3、合并版本库
[root@localhost ~]# svnadmin load /svn/crazy/ --parent-dir test  < /root/www_full_bak 
[root@localhost ~]# svnadmin load /svn/crazy/ --parent-dir test1 < /root/redhat_full_bak 
 
7、备注
[root@localhost ~]# svn -h
[root@localhost ~]# svnlook -h
[root@localhost ~]# svnadmin -h
[root@localhost ~]# svnadmin dump -h
查看帮助信息
 

三、Svn结合Apache

1、添加同步脚本

需要同步的版本库(www)

[root@localhost svn]# ls /svn/

www

添加同步脚本

[root@localhost hooks]# pwd

/svn/www/hooks
[root@localhost hooks]# cat post-commit
#!/bin/bash
export LANG=en_US.UTF-8                           字符集
SVN=/usr/local/svn-1.6.6/bin/svn                  SVN命令
WEB=/usr/local/apache-2.2.15/htdocs/              WEB目录
$SVN update $WEB --username test --password test  同步更新

改权限

[root@localhost hooks]# pwd

/svn/www/hooks

[root@localhost hooks]# chown daemon:daemon post-commit

[root@localhost hooks]# chomd 700 post-commit

[root@localhost htdocs]# pwd

/usr/local/apache-2.2.15/htdocs

[root@localhost htdocs]# chown -R daemon.daemon htdocs/

2、报错解决

post-commit hook failed (exit code 255) with no output.

[root@localhost hooks]# chomd 700 post-commit

[root@localhost hooks]# chown daemon:daemon post-commit

svn: Can't open file '/usr/local/apache-2.2.15docs/.svn/lock': Permission denied

[root@localhost htdocs]# pwd

/usr/local/apache-2.2.15/htdocs
[root@localhost htdocs]# chown -R daemon.daemon htdocs/