SVN 服务与版本库构建

 
step 1 建立版本库
主目录 E:\rick\SDE\repository
在repository下建立项目的版本库目录yogurt,采用: svnadmin create E:\rick\SDE\repository\yogurt  or 在建好的yogurt 目录右键TortiseSVN->Create repository here
完成版本库的建立

step 2 配置
修改E:\rick\SDE\repository\yogurt\conf
1)将svnserve.conf文件中的# password-db = passwd及# authz-db = authz两行前的#号及空格去掉,并保存文件;
 
2)在passwd文件中添加用户名及密码,如下例所示:
[users]
rick = rick
 
3)修改authz文件,添加用户组对资源库目录的访问权限及用户级的成员。示例如下:
 
[groups]
group = rick
[/]
@group01 = rw

step 3 创建 svn 服务
sc create svnservice binpath= "\"E:\rick\SDE\subversion\bin\svnserve.exe\" --service -r E:\rick\SDE\repository" displayname= "SVNService" depend= Tcpip start= auto
启动服务: net start svnservice

说明与注意事项:
a.c:\Subversion为SVN服务端安装目录;
b.D:\repository为各项目资源版本库的根目录;(即在此目录下可以建立多个项目的版本库,如testproject01等。)
c.start= auto表示这个服务随系统自动启动;
d.”=”前不能有空格,面后面必须有空格;
e.运行”net start svnservice”启动这个服务,”net stop svnservice”停止这个服务。
f.删除服务使用sc delete svnservice命令
 
自动更新的配置

开发中经常要在更新SVN的同时要更新WEB服务器。可以用过Subversion的钩子(Hook)来实现。
以下是Windows操作系统下的配置:
在SVN库的hooks目录下面新建post-commit.bat文件,用记事本打开,然后写入如下的代码:

@echo off
SET REPOS=%1
SET REV=%2

SET DIR=%REPOS%/hooks
SET PATH=%PATH%;

SET WORKING_COPY=D:\Websites\Latisse
svn update %WORKING_COPY% –username user –password pwd

此处的D:\Websites\Latisse即是WEB网站的目录(当然得先建好这个目录,并且从svn服务器上签出相应的项目)。
这样在用户提交完后,便会自动更新到WEB服务器上。

需要注意到问题是:
1.不要在WEB网站文件夹下作修改或其它操作,防止出现文件夹被锁。无法更新。

2.在这里我明确写明了用户名(user),密码(pwd)。在我设置时发现,如果没有设置的话会出现错误,在直接运行这个bat文件时是能正常执行的,但是,在Subversion提交后却不能正常运行。并且可以看到服务器进程中会出现cmd,svn两个进程,并且不会自己结束,而用户在提交内容到服务器后,会出现客户端无法正常返回的问题。

3.如果运行不能正常,可以通过下面的方法看到出错信息:
将刚才的post-commit.bat改名为post-commit-run.bat,然后再建一个post-commit.bat的文件,里面写入如下的代码:

call %~dp0post-commit-run.bat %* > %1/hooks/post-commit.log 2>&1
这样运行结果就会被写入到post-commit.log文件中,如果出错,也可以找到出错的原因。

step 4 checkout
SVN Checkout -> svn://localhost/yogurt


SVN
安装方式:yum install (源码安装容易产生版本兼容的问题)
本地IP: B
1 安装
采用 yum install subversion mod_dav_svn

检查已安装版本
#检查是否安装了低版本的SVN
rpm -qa subversion

#卸载旧版本SVN
yum remove subversion

确认已安装了svn模块
 cd /etc/httpd/modules
 # ls | grep svn
mod_authz_svn.so
mod_dav_svn.so

验证安装 svn --version
 
下列版本库后端(FS) 模块可用:

* fs_base : 模块只能操作BDB版本库。
* fs_fs : 模块与文本文件(FSFS)版本库一起工作。
Cyrus SASL 认证可用。
注:./configure --prefix=/usr/local/svn 
make && make install

2 配置
创建代码库
mkdir -p /opt/svn/repository  # p 代码若没有父目录则创建
svnadmin create /opt/svn/repository/mygame
执行上面的命令后,自动建立repository库,查看/opt/svn/repository/mygame 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。

配置代码库
进入上面生成的文件夹conf下,进行配置
cd /opt/svn/repository/mygame/conf

用户密码passwd配置
cd /opt/svn/repository/mygame/conf
vi passwd
修改passwd为以下内容:
[users]
# harry = harryssecret
# sally = sallyssecret
rickzheng=123456#
权限控制authz配置
# vi authz
目的是设置哪些用户可以访问哪些目录,向authz文件追加以下内容:
#设置[/]代表根目录下所有的资源
[/]
rickzheng=rw
服务svnserve.conf配置 : vi svnserve.conf

追加以下内容:
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db=passwd
#访问控制文件
authz-db=authz
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=/opt/svn/repository
配置防火墙端口
vi /etc/sysconfig/iptables
添加以下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
保存后重启防火墙
service iptables restart

启动SVN
svnserve -d -r /opt/svn/repository

查看SVN进程
ps -ef|grep svn|grep -v grep
root     12538     1  0 14:40 ?        00:00:00 svnserve -d -r /opt/svn/repository

检测SVN 端口
netstat -ln |grep 3690
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN

停止重启SVN
 killall svnserve    #停止
 svnserve -d -r /opt/svn/repository   #启动

测试
SVN服务已经启动,使用客户端测试连接。
客户端连接地址:svn://B
用户名/密码: rickzheng/123456
测试创建文件夹等操作。

3 设置 hooks
3.1 checkout 副本
mkdir /www/mygame 
cd /www/app 执行 svn checkout svn://B/mygame or svn://B/mygame new_app{代表重命名}  #这里会提示是否保存密码,若保存则post-commit可不加用户名密码
3.2 在 /opt/svn/repository/hooks 新建 post-commit(cp post-commit.tmpl post-commit) 文件 【钩子脚本】
内容如下:
#!/bin/sh
export LANG=zh_CN.GBK # 注意这里的语言编码
web=/www/app
svn update $web –username rickzheng –password 123456 #
增加可执行权限 chmod 777 post-commit

谢谢楼主详细的配置教程。
我这里的环境是CentOS6.4,按楼主的方法配置后,本机启动svn正常,客户端无法访问。
检查后发现客户端使用:
telnet [ip] 3690
无法连接,应该是防火墙问题。
删掉之前在防火墙中的加的配置:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
重新按以下方法设置防火墙:
/sbin/iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
/etc/rc.d/init.d/iptables save
配置后查看:
/etc/init.d/iptables status
客服端telnet成功,svn也可以访问了。
find . -type d -name ".svn"|xargs rm -rf

猜你喜欢

转载自yogurt.iteye.com/blog/2310180