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。