VS 2003 源码配置管理(subversion+apache)
 
2008-11-28 作者:wanddy 来源:cnblogs
 

其实这文章是两三个月前写的,一直没有放上来,这段时间正好又换了配置服务器,所以才拿出来.

这几天一直在找一个能与vs.net2003相结合的源代码管理工具,几乎试用过所有的大部分工具,难者难,易则简,今天准备安装subversion试试

1.  转到http://httpd.apache.org/download.cgi

2.  下载 apache_2.0.53-win32-x86-no_ssl.msi

3.  转到http://subversion.tigris.org  下载svn-1.1.3-setup.exe

4.  转到http://tortoisesvn.tigris.org/下载TortoiseSVN-1.1.3-UNICODE_svn-1.1.3.msi

二 安装

1.先安装Apache,如果你的IIS已经占用80端口,则在安装的时间请使用8080口,不过这个版本好像是自动选择,为安全起见,还是自己手动选择一下,避免冲突。假如我们选择8080端口,安装完后请打开http://127.0.0.1:8080如果安装成功的话,您将看到欢迎页。否则请检查安装是否正确.

2.接着安装svn-1.1.3-setup.exe,这个版本可以选择是否要在apache的模块中自动配置,请选择自动配置。这样的话就不用手动修改配置文件了。

不然的话要进行以下手动配置 

1.把 <Subversion_root>/httpd/目录下的 mod_dav_svn.so 和 mod_authz_svn.so Copy到 <Apache_root>/modules/ 目录下。

2.把 <Subversion_root>/bin/ 目录下的 libdb42.dll、libeay32.dll、以及 ssleay32.dll Copy到 <Apache_root> 底下的 bin 或 modules文件夹。

3. 接着用记事本打开Apache HTTP Server 的 httpd.conf(在 <Apache_root>/conf/ 目录下),找到 LoadModule 指令,先找到以下兩行:
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so

把前面的 '#' 字元刪除,然后把下面几行文字加到这群 LoadModule 指令的后面:LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

4.  重新启动 Apache HTTP Server。

注意:按理说,在配置apache的时候,如果80已经被IIS占了,我们选定8080口,但是这样反而不行,怎么办? 没关系按apache选80口,它会自动避开的80而选择8080的,这点很奇怪J

3.设置subversion的仓库路径 

  • 设置URL路径 SVNPath

其语法是:
<Location /svn/repos_name>
    DAV svn
    SVNPath /absolute/path/to/repository
</Location>

其中 "/svn/repos_name" 就是客户端存取特定档案库的 URI(Uniform Resource Indentifier),SVNPath 后面指定的路径则是档案库的绝对路径,假设我们的档案库实际存放的路径是 d:/svn/MyProject,并且希望客户端使用 "http://myserver/svn/myprj" 的 URL 来存取档案库,那么要加入 httpd.conf 的内容就是:
<Location /svn/myprj>
    DAV svn
    SVNPath d:/svn/MyProject
</Location>

注意 Location 标签后面的 /svn/myprj 的第一个斜线不可少!

现在要设定 URL 路径与档案库实体路径的对应关系。对应的方式有两种,分别是与

  • 设置仓库物理路径 SVNParentPath。 

如果你的档案库都集中放在某个目录之下,例如:d:/svn,那你就可以使用 SVNParentPath 的方式指定档案库的根路径,例如:
<Location /svn>
    DAV svn
    SVNParentPath d:/svn
</Location>

这表示可以让任何人都可以透过 http://myserver/svn/<档案库名称> 的方式,存取位于 d:/svn 这个目录以下的所有档案库。也就是说,这个设定动作只需要一次,如果使用 SVNPath,你必须为各个档案库分别指定对应的路径。

以上两种设定方式都可以,方便起见,这里我用 SVNParentPath 来统一指定所有档案库的父层 URL 路径。

将 <Location> 的设定加到 Apache HTTP Server 的 httpd.conf 檔尾就行了。

接着便可以开始建立档案库。

三 建立档案库

假设我们要把所有的档案库都放在 d:/svn 目录下,现在要建立一个测试用的档案库,名称叫做 在 repository,指令为:
md d:/svn
svnadmin create d:/svn/repository

命令执行完后,检查看看 d:/svn/repository 目录底下产生了哪些目录和档案。

一般有如下目录

这时候你已经建立了一个档案库,你可以先在本机用浏览器测试一下,网址输入 http://localhost:8080/svn/repository/,看看能不能看到档案库的内容.

四 存入仓库

我们先测试一下这仓库是否成功,先建立以下目录结构
c:
cd temp
md ProjectA
md ProjectA/trunk
md ProjectA/branches
md ProjectA/tags
svn import . http://localhost/svn/repository -m "Initial repository layout"

提示

本文在执行 svn 命令时,都是使用 http 协议的方式,这样我们可以确知 Subversion 与 Apache HTTP Server 的设定无误,其它人就可以透过 Internet 存取档案库。当然你也可以用其它的协议,例如:file:///,如果使用 file 协议,最后一行指令就变成:
svn import . file:///d:/svn/repository -m "Initial repository layout"

五 项目的目录结构

这里补充说明一下 ProjectA 的目录结构。在 ProjectA 项目的根目录下建立的 trunk、branches、和 tags 这三个目录是有特别意义的,它们的作用分别是:
trunk 目录用来存份目前项目正在进行开发的程序档案和文件(又称为主线,即 mainline);
branches 用来存放主线的各个仍在发展中的分支;
tags 则用来存放已经不再变动的分支,也就是其中的档案不会再修改了。

这是 Subverion 官方手册建议的目录结构安排方式,你可以自己决定要不要用这种配置方式,详细说明请参考官方手册的第五章,子标题为 "Choosing a Repository Layout"。

补充

Subversion具有两种服务模式,一个是作为Apache的模块,另一个是自定义协议的Subserve服务。

作为Apache的模块,客户端可以通过WebDAV/DeltaV协议访问Repository,而使用Subserve则使用 Subversion的自定义协议。

下表是两种服务模式的比较:
功能 Apache + mod_dav_sub Svnserve
验证方式 基于HTTPS的X.509、LDAP、NTLM或其他Apache支持的验证 CRAM-MD5或者SSH
用户帐户管理 私有的用户文件 私有的用户文件或已有的系统帐户
授权管理 blanket read/write access或单一目录的访问控制 blanket read/write access
加密 可选的SSL 可选的SSH隧道
交互性 可通过支持WebDAV的客户端访问 无交互性
Web访问 有限的内置支持,或通过第三方的工具,例如ViewCVS 通过第三方的支持,如ViewCVS
速度 稍慢 稍快
初始安装 稍复杂 相当简单

六 使用 Windows 网域账户验证

照着前面的步骤做,你会发现存取档案库时都不用输入账号密码,这是因为我们之前的设定没有启用身分验证的功能。但是我们通常不希望所有人都能任意存取你的档案库,免得重要资产外泄,或者数据被破坏,因此了解如何加入身分验证也是必要的。

Serversion 提供了多种验证使用者身份的方式,这里只介绍 Windows 身分验证的方式,这种方式很适合用在开发团队成员都在局域网络内的情况。请依下列步骤进行:

取得 SSPI 模块,下载网址为 http://tortoisesvn.tigris.org/mod_auth_sspi.zip
把 zip 里面的 mod_auth_sspi.so 解压缩到 <Apache_root>\modules 目录下。

把下面这行加入到 Apache 的 httpd.conf 里面:
LoadModule sspi_auth_module modules/mod_auth_sspi.so

注意上面加入的这行一定要放在下面这行的前面:
LoadModule auth_module modules/mod_auth.so

修改 httpd.conf 的 <Location> 设定如下:
<Location /svn>
    DAV svn
    SVNParentPath d:/svn
    AuthType SSPI
    AuthName "Subversion 档案库"
    Require valid-user
    SSPIAuth On
    SSPIAuthoritative On
    SSPIDomain <domaincontroller>
    SSPIOfferBasic On
</Location>

其中 <domaincontroller> 就是你的 Windows 域控制器的计算机名称(例如:WIN2KDC),注意两边的括号 <> 不用保留。如果你的环境没有域控制器,就维持原来的 <domaincontroller> 就行了。在我的环境下,我发现即使有域控制器,但是这里不去设定它,还是能够正常的验证使用者身分。

重新启动 Apache。

七 采用文件方式进行身份验证

此处也可以用mysql,passwd文件,LDAP等其他任何Apache支持的验证方式。

此处我采用文件方式,首先建立一个保存密码的文件,如果不需要对密码加密,可增加-p参数生成plain text。

%APACHE_HOME%\bin\htpasswd –c -p d:\passwd\passwords user1 12345执行后会提示您输入密码,这样就在文件passwords里生成一个用户名为user1的用户,生成的文件内容如下:
#格式username:password
user1:123456

 例子:

Repository存放在D:\repository下,有两个repository: test and xtest
每个repostory 的结构相同:
    根:01.txt
              02.txt
        folder1-: 11.txt
       12.txt
folder 2-: 21.txt
   22.txt

对目录1和2作不同的读写权限控制
Basic Authentication
修改文件:
Httpd.conf:
#Basic authentication
<Location /repository>
              DAV svn
              SVNParentPath d:/repository
              AuthzSVNAccessFile d:/repository/accessfile                
           Require valid-user
              AuthType Basic
              AuthName "身份验证"
              AuthUserFile d:/repository/passwd                 
</Location>

用Apache的htpasswd生成用户名和密码, Htpasswd –c passwd username 第二次不用 –c。

生成的用户名和密码在passwd中:
0:$apr1$Vu5.....$XZ/csz/2YKoPNKpb88O5p0
1:$apr1$vu5.....$I1VwMJ7JtRmpmJjVUlT4h1
2:$apr1$Dv5.....$vf2MTg/p0mY.WcFhx7wET1
3:$apr1$Tv5.....$gfk4AiP49h0JjKN8BuJdB.

AuthzSVNAccessFile控制每个目录的读写权限
[test:/]
1 = r
2 = r
3 = r
[test:/1]
1 = rw
[test:/2]
2 = rw

在客户端,用http://server/repository/test可以访问。也可以直接进入子目录访问:http://server/repository/test/1,http://server/repository/test/2。系统会要求进行认证。例如用户1对目录1有读写权限,可以commit修改,但对目录2所作的修改就不能commit。
SSPI认证。

按上一种方式,用户更换一次密码,就必须修改一次密码文件。用SSPI认证则可以没有这个问题。
Httpd.conf文件:
#SSPI authentication
<Location /repository>
              DAV svn
              SVNParentPath d:/repository
              AuthzSVNAccessFile d:/repository/accessfilesspi               
              Require valid-user
              AuthType SSPI
           AuthName "Subversion repositories"
                     # SSPI settings
               SSPIAuth On
               SSPIAuthoritative On
               # point to domaincontroller
               SSPIDomain domain.com.cn
              SSPIOfferBasic On
</Location>

控制文件AuthzSVNAccessFile要作相应的修改:
[test:/]
domain\user1 = r
domain\administrator = r
[test:/1]
domain\user1 = rw
[test:/2]
domain\user1 =
domain\administrator = rw

在tortoiseSVN使用时,会提示认证,填写用户名和密码即可。

如果要按照Group的方式来控制权限,可同时建立一个groups文件,内容如下:
 
   #格式:GroupName: username1 username2
 
    svngroup: user1 user2  

在httpd.conf中的/svn处增加权限控制部分: 
 
   <Location /svn>
 
    DAV svn
 
    # 指向SVN Repository的ROOT
 
    SVNPath d:/svnrepo
 
    AuthType Basic
 
    AuthName "Subversion Repository"
 
    AuthUserFile d:/passwd/passwords
 
    AuthGroupFile d:/passwd/groups
 
    Require group svngroup
 
    </Location>
 

重起服务器,浏览http://localhost/svn,出现安全对话框,输入用户名密码即可成功。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织