Linux下SVN+rsync服务器的搭建与配置
SVN作为单独服务器
一:安装与测试
1:安装
http://subversion.tigris.org/downloads/subversion-deps-1.6.6.tar.gz 
tar xzvf subversion-1.6.6.tar.gz
tar xzvf subversion-deps-1.6.6.tar.gz
cd subversion-1.6.6                    ##l两个包解压后会存放在同一个目录
 
./configure  --prefix=/usr/local/svn  –without-berkeley-db  --with-zlib=./zlib
make clean
make &&make install
(注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,不编译berkeley-db)
svn存储版本数据也有2种方式:BDB和FSFS
特性
Berkeley DB
 FSFS
对操作中断的敏感
很敏感
系统崩溃或权限问题会导致数据库“塞住”,不明感
只读加载
不能
可以
存储平台无关
不能
可以
网络文件系统访问
不能
可以
版本库大小
稍大
稍小
扩展性:修订版本树数量
无限制
某些本地文件系统在处理单一目录包含上千个条目时会出现问题。
扩展性:文件较多目录
较慢
较慢
检出最新代码速度
较快
可以
大量的提交的速度
较慢,但时间被分配在整个提交操作中
较快,但最后较长的延时可能会导致客户操作超时
2:测试是否安装成功
A:创建环境变量
vim /etc/profile,在/etc/profile最后加入:
PATH=$PATH:/usr/local/svn/bin
export PATH
或:
echo "PATH=$PATH:/usr/local/svn/bin" >>/etc/profile
source /etc/profile                               ##刷新
svnserve --version                           ##设置环境变量后直接执行svn命令
/usr/local/subversion/bin/svnserve  ---version     ##没设置环境变量使用svn命令,显示版本则安装成功
二:权限设置与管理
1:创建svn版本库的存放目录
mkdir -p /data/svndata
svnadmin create /data/svndata/ 120ask.com   ##120ask.com 为版本库名称 
svnadmin create /data/svndata/ test    ##test也为库名可以创建多个项目(库)
2:svnserve配置文件概述 
svnadmin create命令创建一个库(项目后),在库下会生产文件
cd /data/svndata/test/conf   ##进入新建库的配置文件目录下有三个文件
svnserve.conf        ##  svn服务配置文件,该文件版本库目录的conf目录下。 
passwd    ##用户名口令文件,该文件名在文件svnserve.conf中指定,缺省为同目录下
authz  ##权限配置文件,该文件名也在文件svnserve.conf中指定,缺省为同目录下的。
3:svnserve.conf 文件配置项分为以下5项 
anon-access =none 控制非鉴权用户访问版本库的权限。 
auth-access = write 控制鉴权用户访问版本库的权限。 
password-db = passwd指定用户名口令文件名。 
authz-db  = authz 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。 
realm    指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库
             认证域相同,建议使用相同的用户名口令数据文件 
5:Passwd 文件 
test = 123    ###前面是用户名,后面是用户密码
6:authz  文件 
[groups]       设置组
admin = test
[/]    
* =                ##根目录权限设置(就是“svndata”这个文件夹)
@admin = rw
三:启动和停止SVN服务
   svnserve -d -r /data/svndata/           ##root启动,svn默认端口为3690
D:检查:
 a:查看是否开启了想要的端口,
  netstat -nulpt|grep svn
 
 b:查看进程
ps -ef|grep svnserve
如果显示如下,即为启动成功:
E:停止SVN服务:
ps -aux |grep svn
 
kill -9 PID
四:实现自动更新web服务器
1:checkout文件
说明:客户端更新的文件会存在svn库对应的项目/data/svndata/ test/db中,我们是无法看到的,如果想在linux上看到库中的最新内容,必须将项目中的库/data/svndata/test/db文件检出checkout(co)到某个目录下,第一次用检出,以后如果库中有变化,直接用update更新即可
A: #将test项目中内容检出指定目录。/data/checkout目录下就会自动产出test
svn co svn://192.168.24.137/test  /data/checkout/120ask.com
B:第一次检出后,以后就可以直接更新了
svn update /data/checkout/test --username 'test' --password '123' 
C:删除库中的某个文件
svn delete svn://192.168.24.137/120ask.com/123.txt  -m“delete test file”

五. 使用rsync+shell同步数据至远程网站根目录
cd /data/svndata/120ask.com
vim exclude-file    #创建文件写入后面脚本同步需要排除的信息
- .svn
vim /data/svndata/120ask.com/hooks/post-commit
#!/bin/bash
export LANG=en_US.UTF-8
src=/data/checkout/120ask.com                   #服务器本地checkout目录
deswebroot=/var/www/html           #remote rsync directory #####
svnroot=/data/svndata/120ask.com      #svn库路径                      
remoteip=192.168.24.138
svn update $src --username test --password 123 | grep -v -i update|awk '{print $2}'| while read chfile
do
      if [ -e $chfile ];then
                if [ -f $chfile ];then
                         chown ftp:ftp $chfile
                        dfile=$(echo $chfile |sed  "s:$src\/::")              ###only  file name###
rsync -auz --update  -e ssh  --exclude-from=$svnroot/exclude-file  $src/$dfile  root@$remoteip:$deswebroot/$dfile     
                else
                        chown ftp:ftp$chfile
                        dfile=$(echo $chfile |sed  "s:$src\/::")
rsync -auvz --update  -e ssh  --exclude-from=$svnroot/exclude-file $src/$dfile/  root@$remoteip:$deswebroot/$dfile/
                fi
        fi
done
chmod +x post-commit
配置双机互信 (138信任137)
24.137:
mkdir -p /root/.ssh
ssh-keygen -t rsa
scp id_rsa.pub 192.168.24.138:/root
 24.138:
mkdir -p ~/.ssh
cat ~/id_rsa.pub >>  /root/.ssh/authorized_keys
补充:svn在linux上的常用命令
1、将文件checkout到本地目录
  svn checkout path(path是服务器上的目录,以pro目录下的domain为例)
  例如:svn checkout svn://192.168.1.1/pro/domain
  简写:svn co
2、cd进checkout目录后往版本库中添加新的文件
  svn add file
  例如:svn addtest.php
        svn add *.php     ##添加当前目录下所有的php文件
3、将改动的文件提交到版本库
   svn commit -m “提示信息“ [-N] [--no-unlock] PATH
    例如:svn commit -m “add test file for my test“ test.php
   简写:svn ci
 4、加锁/解锁
   svn lock -m “提示信息“ [--force]  PATH
   例如:svn lock -m “lock test file“ test.php
   svn unlock PATH
5、更新到某个版本
   svn update -r m path
  例如:
  svn update:默认将当前目录以及子目录下的所有文件都   更新到最新版本。
  svn update -r 200 test.php:将版本库中的文件test.php还原到版本200
  svn update test.php:更新,于版本库同步。如果在提交的时候提示过期的话, 是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交  commit)
   简写:svn up
 6、查看文件或者目录状态
   1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
  【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版  本库;K:被锁定】
   2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
   注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
 7、删除文件
   svn delete path -m “delete test fle“
   例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m "delete file",推荐使用这种
简写:svn (del, remove, rm)
8、查看日志
   svn log path
    例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息
    svn info path
    例如:svn info test.php
10、比较差异
    svn diff path(将修改的文件与基础版本比较)
    例如:svn diff test.php
    svn diff -r m:n path(对版本m和版本n比较差异)
    例如:svn diff -r 200:201 test.php
    简写:svn di
11、将两个版本之间的差异合并到当前文件
     svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到  当前文件,但是一般都会产生冲突,需要处理一下)
 12、版本回退
[root@localhost test]# svn commit -m "add" well
增加           well
传输文件数据.
提交后的版本为 11。
[root@localhost test]# svn merge -r 11:9 .   (注意这个点号不能少)
svn: 不能从路径的未来历史中反向合并范围;请先更新
[root@localhost test]# svn update
A    abc.abc
更新到版本 11。
[root@localhost test]# svn merge -r 11:9 .
--- 正在反向合并 r11,经由 r10,到 “.”:
D    well
D    abc.abc
[root@localhost test]# svn commit -m "revert to 9"
删除           abc.abc
删除           well
提交后的版本为 12。