Chinaunix首页 | 论坛 | 博客
  • 博客访问: 788014
  • 博文数量: 434
  • 博客积分: 11187
  • 博客等级: 上将
  • 技术积分: 5221
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 01:00
文章分类

全部博文(434)

文章存档

2016年(2)

2013年(1)

2012年(115)

2011年(195)

2010年(32)

2009年(89)

分类: LINUX

2011-06-28 09:13:31

    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
通过以下脚本创建库:
  1. #!/bin/sh
  2. if [ $# -ne 1 ]; then
  3. echo “Usage: $0 repository_name”
  4. exit 1
  5. fi
  6. sudo svnadmin create --fs-type fsfs /opt/svndata/${1}
  7. sudo chown -R apache:apache /opt/svndata/${1}
  8. sudo chmod -R g+w /opt/svndata/${1}
  9. 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
阅读(2537) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~