其实这文章是两三个月前写的,一直没有放上来,这段时间正好又换了配置服务器,所以才拿出来.
这几天一直在找一个能与vs.net2003相结合的源代码管理工具,几乎试用过所有的大部分工具,难者难,易则简,今天准备安装subversion试试
2. 下载 apache_2.0.53-win32-x86-no_ssl.msi
3. 转到http://subversion.tigris.org 下载svn-1.1.3-setup.exe
二 安装
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的仓库路径
l 设置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 路径与档案库实体路径的对应关系。对应的方式有两种,分别是与
l 设置仓库物理路径 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 则用来存放已经不再变动的分支,也就是其中的档案不会再修改了。
补充
Subversion具有两种服务模式,一个是作为Apache的模块,另一个是自定义协议的Subserve服务。
作为Apache的模块,客户端可以通过WebDAV/DeltaV协议访问Repository,而使用Subserve则使用
Subversion的自定义协议。
下表是两种服务模式的比较:
作为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,出现安全对话框,输入用户名密码即可成功。