svn服务器有两种运行方式:独立服务器svnserve和借助apache作为apache的一个模块,以webdav/deltav协议通讯。
svn存储版本数据有两种方式:BDB和FSFS。BDB方式在服务器中断时,可能锁住数据。FSFS方式更安全些,兼容性好。
在编译SVN时,发现Nginx尚不支持Subversion,查了相关资料,发现只有Apache可以支持SVN,无可奈何,看来只能做一个Apache与Nginx共存的服务器,用Nginx proxy把发向Nginx的SVN请求转到Apache上去。
一、使用YUM安装:
$ sudo yum install httpd subversion mod_dav_svn
建立版本库(Repository):
$ sudo mkdir -p /opt/svndata/game
$ sudo chown -R apache:apache /opt/svndata
通过以下脚本创建库:
- #!/bin/sh
-
if [ $# -ne 1 ]; then
-
echo “Usage: $0 repository_name”
-
exit 1
-
fi
-
sudo svnadmin create --fs-type fsfs /opt/svndata/${1}
-
sudo chown -R apache:apache /opt/svndata/${1}
-
sudo chmod -R g+w /opt/svndata/${1}
-
sudo chmod g+s /opt/svndata/${1}/db
//这条语句将把路径/home/user/import下找到的文件导入到你创建的Subversion 仓库中去,
//提交后的修订版为1。
#svn import /usr/local/svntest file:///opt/svndata/game -m "注释"
#svn import /usr/local/svntest file:///opt/svndata/game -m "svntest1"
二、Apache 配置:
$sudo /etc/httpd/conf/httpd.conf
修改监听端口:
Listen 802
增加以下内容:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
DAV svn
SVNListParentPath on
SVNParentPath "/opt/svndata" //svn父目录
AuthzSVNAccessFile /opt/svndata/game/conf/authz //权限配置文件
AuthType Basic //连接类型设置
AuthName "Subversion Repository" //连接框提示
AuthUserFile /opt/svndata/authfile //用户配置文件
Require valid-user //采用何种认证
//其中authfile是通过"htpasswd [–c] /home/svnroot/repository/authfile username password"来创建//的"Require valid-user"告诉apache在authfile中所有的用户都可以访问。如果没有它,
//则只能第一个用户可以访问新建库
$sudo service httpd start
$sudo chkconfig httpd on
三、Nginx 配置:
$sudo vi /usr/local/nginx/conf/nginx.conf
增加以下内容:
server {
listen 80;
server_name 192.168.7.68;
root /opt/svndata/;
index index.html index.htm index.php;
access_log logs/svn.log main;
location /svn {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass
}
}
测试:
页面显示:
game - Revision 0: /
表示配置成功。
四、权限管理
1)增加用户
# htpasswd [-c][-m] /opt/svndata/authfile admin
//第一次设置用户时使用-c表示新建一个用户文件。回车后输入用户密码,完成对用户的增加
# htpasswd authfile 用户名(加入新的用户)
-c 表示创建文件,-m表示对密码用md5加密
然后,会提示输入两次密码,以后再加用户就不需要用-c了,直接用-m即可。
更改用户密码:
htpasswd -m /opt/svndata/authfile admin
删除用户(要用大写的 D ):
htpasswd –D /opt/svndata/authfile admin
2)权限分配
# vi /opt/svndata/game/conf/authz
[game:/] //这表示,仓库game的根目录下的访问权限
admin = rw //game仓库admin用户具有读和写权限
bao = r //game仓库bao用户具有读权限
[game2:/] //game2仓库根目录下的访问权限
admin = r //admin用户在game2仓库根目录下只有读权限
bao = //bao用户在 game2仓库根目录下无任何权限
[/] //这个表示在所有仓库的根目录下
* = r //这个表示对所有的用户都具有读权限
#[groups] //这个表示群组设置
#svn1-developers = admin, bao //这个表示某群组里的成员
#svn2-developers = admin
#[svn1:/]
#@svn1-developers = rw //如果在前面加上@符号,则表示这是个群组权限设置
将这个设置完成后。重启Apache,就可以通过
这个URL来访问仓库了,当然,受权限的限制,必须是合法用户才能访问且具有相应的权限
r 表示读权限
w 表示写权限
AuthzSVNAccessFile 指向的是 authz 的策略文件,详细的权限控制可以在这个策略文件中指定。访问文件 accesspolicy.conf 的语法与svnserve.conf和Apache 的配置文件非常相似,以(#)开头的行会被忽略;在它的简单形式里,每一小节命名一个版本库和一个里面的路径;认证用户名是在每个小节中的选项名;每个选项的值描述了用户访问版本库的级别:r(只读)或者rw(读写),如果用户没有提到或者值留空,访问是不允许的; * 表示所有用户,用它控制匿名用户的访问权限;@符号区分组和用户。
配置完成,重新启动Apache server
在浏览器地址栏中再次输入: 这次要输入密码才能进入.
五、基本操作流程
1、取出(check out)
取出版本库到一个工作拷贝:到任意空目录下,比如在f分区建立一个空文件夹 f:\work 。“右键 -> SVN Checkout”。
在“URL of repository”中输入“”,这样我们就得到了一份 guestbook 中内容的工作拷贝。
2、存入(check in)/提交(commit)
在工作拷贝中作出修改并提交:
在 guestbook 工作拷贝中随便打开一个文件,作出修改,然后“右键 -> SVN Commit... ”。这样我们就把修改提交到了版本库,版本库根据情况存储我们提交的数据。
在修改过的文件上“右键 -> TortoiseSVN -> Show Log” ,可以看到对这个文件所有的提交。在不同的 revision 条目上“右键 -> Compare with working copy”,可以比较工作拷贝的文件和所选 revision 版本的区别。
六、启动和停止subversion
1.启动svn
# ./svnserve -d --listen-port 3690 -r /opt/svndata --log-file /opt/svndata/svn.log --pid-file /opt/svndata/svn.pid
-d以daemon方式运行
--listen-port监听端口号
-r指定目录
--log-file指定日志文件
--pid-file指定pid文件
这里需要注意一点的是,使用http协议访问,即 等同于使用svn协议 svn://ip/的地址。
也就是说如果使用svn://ip/来访问,那么可以不必加上repos的这层路径。
如果使用http协议来访问,也不必执行上面这条命令
2.停止svn
# kill -9 `cat /opt/svndata/svn.pid`
七、客户端访问
1.Windows 下安装TortoiseSVN
2.Linux下#svn checkout svn://192.168.0.68:3690/game
八、备份svn存储库
#压缩备份
$sudo svnadmin dump /opt/svndata/game | gzip > /usr/local/src/svnback/game-backup.gz
#不压缩备份
$sudo svnadmin dump /opt/svndata/game > /usr/local/src/svnback/game-backup.svn
#做全备,并记录项目最新本版号:
DATE=`date +%Y%m%d-%T`
YOUNGEST=`svnlook youngest /opt/svndata/game`
echo "$YOUNGEST" > /usr/local/src/svnback/game.youngest
svnadmin dump $project > $BACKUPDIR/$project.dump
PREVYOUNGEST=`cat $BACKUPDIR/$project.youngest`
#获取项目最新的版本号,做增量备份:
NEWYOUNGEST=`svnlook youngest $project`
svnadmin dump /opt/svndata/game --revision $LASTYOUNGEST:$NEWYOUNGEST --incremental \
>/usr/local/src/svnback/game-$LASTYOUNGET-$NEWYOUNGEST.$DATE
echo "$NEWYOUNGEST" > $BACKUPDIR/$project.youngest
九、恢复svn存储库
#恢复的时候,先恢复全部备份,然后依次按照日期恢复增量备份即可。
#恢复时,svnadmin dump不能恢复原项目中conf目录下三个文件{authz passwd svnserve.conf},需要手动进行恢复;
#建立新的svn存储库
$sudo svnadmin create /opt/svndata/game
#确认成功与否
$sudo ls -l /opt/svndata/game
#导入存储库数据
#恢复全备
$sudo svnadmin load /opt/svndata/game
#按日期顺序恢复增量备份
$sudo svnadmin load /opt/svndata/game
阅读(1177) | 评论(0) | 转发(0) |