小石头
Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.
posts - 91,comments - 22,trackbacks - 0

在上一篇文章《用Subversion构建版本控制环境》中,我们就Subversion的特性、安装以及如何通过各种客户端来操作资源库进行了详细的介绍。文章中Subversion是以独立的服务方式运行,我们必须借住一些特定的客户端,例如Subvresion本身提供的客户端命令行程序、Eclipse插件以及集成在Windows资源管理器的TortoiseSVN工具。这些工具对于开发者而言当然是必须的,但是当我们有需要将资源库发布在互联网上的时候,就会让我们的用户操作起来非常不方便,用户可能仅仅是需要浏览一下项目,却要他安装一堆程序,这难免让人觉得繁琐。

怎么让我们的用户可以通过一些常用的程序例如资源管理器或者是浏览器就可以方便的浏览Subversion的资源库呢?因此本文将充分的发掘Subversion在资源库共享方面的功能,同时对Subversion在权限控制方面的内容进行详细的介绍,同时也将详细介绍如何将已有的CVS资源库转到Subversion上来。

我们曾经提到过Subversion相比较而言在共享方面的功能是大大的超过了CVS系统,它可以通过Apache服务器提供基于WebDAV/DeltaV协议的支持。有了它你就可以通过资源管理器或者浏览器对资源库进行浏览以及操作。接下来我们将详细介绍如何安装并使用这个功能。(本文的所有软件的安装都是在Windows系统下进行)

1. 安装Apache HTTP服务器

http://httpd.apache.org下载最新的Apache服务器2.0.54版本的Windows安装程序apache_2.0.54-win32-x86-no_ssl.msi,下载完毕直接安装,使用默认设置进行安装即可,安装过程不再累赘。安装完毕后使用浏览器打开网址http://localhost 检查安装是否成功完成。

如果Apache无法启动请检查是否机器上已经装有IIS,把IIS停掉后再启动Apache服务进行测试。

2. 安装Subversion

Subversion的安装已经在上一篇文章中详细的介绍过了,如果你还不知道怎么安装Subversion请参照《用Subversion构建版本控制环境》。请确保将{subversion}\bin目录是否在系统的PATH变量中存在,如果不存在请加上。

有一点需要说明的是,使用跟Apache HTTP服务器结合的方式,你无需再启动SVNService服务。

3. 配置Apache HTTP服务器

首先在Subversion的安装目录下的bin子目录找到这样两个文件mod_dav_svn.so和mod_authz_svn.so,将这两个文件复制到Apache安装目录下的modules子目录,另外还有四个文件分别是intl3_svn.dll、libdb43.dll、libeay32.dll、ssleay32.dll,把这四个文件拷贝到subversion的bin目录或者是modules目录。

打开Apache的配置文件httpd.conf,我们需要在该配置文件中通过LoadModule指令来加载Subversion的DAV模块,例如下面一行信息。

LoadModule dav_svn_module modules/mod_dav_svn.so

需要注意的是,因为Apache本身带有mod_dav模块,如果你的Apache中这个模块是动态 加载的而不是直接编译进Apache的可执行文件中的话,你应该确保上面的指令在mod_dav模块后面进行加载,默认的情况下mod_dav模块是不启用的,你需要把它前面的注释去掉,如下:

LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so

同时另外一个模块mod_authz_svn模块也需要进行加载,可以把它放置在mod_dav_svn后,例如:

LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

接下来我们必须告诉Apache我们的资源库所在的路径,可以通过Location指令来完成这个设置。因为不希望为每个单独的项目都进行单独的设置,所以我们把所有项目都存放在统一的资源库目录,那么可以使用SVNParentPath指令来指定存放所有项目的路径。在httpd.conf文件最后添加下面配置:

BR>    DAV svn
    SVNParentPath d:/svn/repository

这样我们就可以通过http://myhost/svn/<项目名> 来访问存放于资源库d:/svn/repository中的指定项目。当然有可能你并不希望某个项目提供这样一种访问方式,这时候你可以使用SVNPath为每个项目进行单独的设置,SVNPath的使用方法如下:

BR>    DAV svn
    SVNPath d:/svn/repository/project1

同样把这段配置放在httpd.conf最后,重启Apache HTTP服务即可通过http://myhost/svn/project1 来访问project1项目的资源库。

应该提醒的是,所有的这些访问都是匿名的,任何用户只要能访问这台机器都可以访问你所设定的资源库,他可以对项目进行浏览、检出或者是提交,我相信你肯定不希望发生这样的事情,接下来我们将介绍如何做好访问的权限控制。

现在我们先试着用Subversion自带的客户端提交一个项目以便于接下来的测试,随便弄一个项目,执行下列命令将项目加到资源库中。

输入:svn import . http://localhost/svn -m "test"
输出:svn: PROPFIND request failed on '/svn'svn: PROPFIND of '/svn': 403
Forbidden ( http://localhost )

怎么回事?403 Forbidden?原因是我们必须先给项目创建资源库,D:\svn\repository只是我们存放所有项目的目录,我们必须在这个目录下创建要提交项目的资源库。使用下面命令先给项目创建好资源库

svnadmin create d:\svn\repository\project1

再次执行import命令后,就可以成功的导入项目。打开浏览器输入网址:http://localhost/svn/project1 看看你刚提交了什么:)

现在我们回顾一下新建一个项目的过程:首先必须使用svnadmin工具创建项目的资源库,然后再导入项目文件。

4. 访问用户的身份验证

在确定对访问用户的权限控制之前,你必须规划好是对整个资源库中的所有项目还是单独的某一个项目进行统一的身份验证, 也就是我们前面讲到的是使用SVNParentPath还是SVNPath的问题。

最简单的身份验证方式是使用Basic HTTP Authentication机制,该方式通过用户名和口令对访问用户进行身份验证。我们可以直接通过Apache提供的支持进行设置。Apache提供一个htpasswd工具来管理用户名和口令。接下来我们利用这个工具来添加两个用户。

在命令行窗口中转到Apache所在的目录,假设是 D:\Apache\bin,执行下列命令

说明:创建用户liudong1
输入:htpasswd –cm D:\svn\svn_auth_passwd liudong1
说明:使用-c参数来创建一个passwd文件
输出:
New password: *****
Re-type new password: *****
Adding password for user liudong1
说明:创建用户liudong2
输入:htpasswd –m D:\svn\svn_auth_passwd liudong2
说明:passwd文件已经创建,无需再使用-c参数
输出:
New password: *****
Re-type new password: *****
Adding password for user liudong2

打开D:\svn\svn_auth_passwd文件,密码使用MD5加密过了,而且同样的密码加密出来的内容却不相同,估计跟用户名也是有一点关系,内容如下:

liudong1:$apr1$5G3.....$x5jgK.sGp/Y3EFSXGMtoE.
liudong2:$apr1$cG3.....$IM5m73cqw8N8ZsMcJnKeX.

接下来我们必须告诉Apache服务器如何使用这个passwd文件,打开httpd.conf找到刚才我们添加的Location配置的位置,修改如下:

BR>DAV svn
SVNParentPath d:/svn/repository
AuthType Basic
AuthName "Subversion repository"
AuthUserFile d:/svn/svn_auth_passwd
Require valid-user

重新启动Apache HTTP服务器,使用浏览器打开 http://localhost/svn/project1 你将会看到要求登录的对话框如下图所示(我所使用的是Opera 8浏览器),输入你刚设置的用户名和口令即可。

这就是利用Basic HTTP Authentication机制对用户进行访问控制的方法。你还可以使用SSL证书管理来加强Subversion的安全性(HTTPS的配置属于Apache HTTP服务器的范畴,请参照Apache的文档),甚至你可以对设置对某些操作才需要验证用户的身份以及赋予不同用户对不同目录的操作权限,以及如何使用Windows的域帐号进行身份的验证。这些内容可以参考Subversion提供的文档svn-book.pdf的第六章——服务器配置。

以上介绍的是Subversion跟Apache结合提供基于HTTP方式的共享功能以及如何对用户进行身份的验证。接下来我们介绍大部分CVS用户非常关系的——如何将现有的CVS资源库移植到Subversion下。

我们可以通过一个cvs2svn的工具来将CVS资源库转到Subversion服务器上。Cvs2svn是一个用Python写的转换脚本,它的作用是用来一次性的从CVS转到Subversion,你不要指望它帮你同步CVS和Subversion资源库。如果你并不需要项目的一些历史修改信息,那么你最好先从CVS获取最新版本,然后提交到Subversion资源库中,这是最简单直接而有效的方法。如果你需要保留CVS意见的所有修改记录,那么接下来我们就是介绍如何通过cvs2svn来转换你的资源库。

首先我们需要安装Python,因为cvs2svn是用Python写的一些脚本。到 http://www.python.org/download/ 下载最新版本的Python for Windows的安装程序python-2.4.1.msi,按照默认的方式安装Python,假设安装目录是C:\Python。接下来下载cvs2svn,下载地址是:http://cvs2svn.tigris.org/servlets/ProjectDocumentList?folderID=2976,用WinRAR解压到任一个目录下。打开命令行窗口转到cvs2svn所在的目录先测试一下python,执行C:\python\python cvs2svn,这时候会输出cvs2svn的帮助信息。

由于cvs2svn用到了GUN sort工具,因此我们还必须到http://unxutils.sourceforge.net/ 下载UnxUtils.zip,把该压缩包下的usr/local/wbin/sort.exe文件解压到cvs2svn目录中;同时我们还需要下载RCS的一个工具co.exe,到http://www.cs.purdue.edu/homes/trinkle/RCS/ 下载rcs57pc1.zip,把该压缩包中的bin/win32下的rcslib.dll以及co.exe这两个文件同样解压到cvs2svn目录中。

接下来我们开始转换资源库,输入以下命令
C:\Python\python cvs2svn –s d:\svn\repository\project1 project1

其中我们假设project1是原有CVS资源库中的一个项目。
下面是在我的机器上转换完毕后cvs2svn显示详细的统计信息:

cvs2svn Statistics:
------------------
Total CVS Files:                 7
Total CVS Revisions:             7
Total Unique Tags:               0
Total Unique Branches:           0
CVS Repos Size in KB:         2261
Total SVN Commits:               2
First Revision Date:    Sat Sep 03 15:05:26 2005
Last Revision Date:     Sat Sep 03 15:05:27 2005
------------------
Timings:
------------------
pass 1:     0 seconds
pass 2:     0 seconds
pass 3:     0 seconds
pass 4:     0 seconds
pass 5:     0 seconds
pass 6:     0 seconds
pass 7:     0 seconds
pass 8:     1 second
total:      3 seconds

转换完毕后我们用浏览器打开 http://localhost/svn/project1 即可看到

点击trunk链接就可以看到项目的所有文件,接下来可以把你需要转换的项目重复执行上面的步骤即可。

以上是本文要介绍的内容,涉及实际应用中经常要面临的问题。以独立服务方式运行的Subversion其守护端口是3690,我们通过其跟Apache HTTP服务器结合使之可以方便的在互联网上进行资源库的发布;同时对于现在正在使用CVS的用户来讲可以通过cvs2svn来转换已有的资源库到Subversion上,这可打消CVS用户在考虑移植时候的顾虑。


参考资料

《用Subversion构建版本控制环境》
http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/
Subversion的官方网站  http://subversion.tigris.org/
CVS2SVN    http://cvs2svn.tigris.org/
Apache网站    http://httpd.apache.org/
Python官方网站   http://www.python.org/
Windows域用户验证模块 http://tortoisesvn.tigris.org/mod_auth_sspi.zip

posted on 2007-03-06 23:03 小石头 阅读(375) 评论(0)  编辑  收藏 所属分类: Subversion

只有注册用户登录后才能发表评论。


网站导航: