安装 Apache
1. 从Apache网站http://httpd.apache.org/download.cgi下载最新版本的Apache,请确定你下载的版本高于2.0.54-1.3.xx的版本不能工作!同样,低于2.0.54的版本不能与Subversion 1.2一起工作,因为Apache低于2.0.54的Windows版本的编译存在问题。
2. 一旦你有了Apache2安装程序,你可以双击它,然后它会指导你的安装过程,请确认你输入的server的URL正确(如果你的服务器没有dns名称,请直接输入IP地址)。我建议安装Apache为所有用户,在80端口,作为一个服务
。注意: 如果你已经有了IIS或其他监听80段口的程序,安装会失败,如果发生这种情况,直接到程序的安装目录\Apache Group\Apache2\conf
,打开httpd.conf
。编辑文件的Listen 80
为其他可用的端口,例如Listen 81
,然后重新启动-这样就不会那个问题了。
3. 现在可以测试Apache服务器了,将浏览器指向http://localhost/
-将会看到一个预先配置的网站。
安装 Subversion
1. 从http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91下载最新版本的Subversion。
2. 运行Subversion安装程序,并根据指导安装,如果Subversion认识到你安装了Apache,你就几乎完成了工作,如果它没有找到Apache服务器,你还有额外的步骤。
3. 从Subversion的bin目录(通常是c:\program files\Subversion\bin
),找到文件mod_dav_svn.so
和mod_authz_svn.so
,复制这些文件到Apache的模块目录(通常是c:\program files\apache group\apache2\modules
)。
4. 从Subversion的bin目录将libdb*.dll
和intl3_svn.dll
复制到Apache的bin目录。
5. 使用记事本之类的文本编辑器修改Apache的配置文件(通常是 C:\Program Files\Apache Group\Apache2\conf\httpd.conf
),做出如下修改:
6. 去掉如下几行的注释号(删除 '#
'标记):
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so
7. 将下面几行添加到LoadModule
部分的最后。
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
创建版本库
你可以使用FSFS或较老但更稳定的Berkeley Database(BDB)作为版本库的后端,FSFS格式更快一点,而且可以正常运行在Windows 98,BDB格式更加的稳定,因为其经过了更长时间的验证。
1.使用命令行工具创建版本库
1.1创建一个名为SVN(例如D:\SVN\
)的空文件夹,作为你的所有版本库的根。
1.2在D:\SVN\
里创建另一个目录MyNewRepository
。
1.3打开命令行窗口(或DOS窗口),进入D:\SVN\
目录,输入
svnadmin create --fs-type bdb MyNewRepository
或
svnadmin create --fs-type fsfs MyNewRepository
现在你在D:\SVN\MyNewRepository
创建了一个新的版本库。
2.使用 TortoiseSVN 创建版本库
1.1打开资源管理器
1.2创建一个新的文件夹,命名为SVNRepository
1.3右键点击新创建的目录,选择TortoiseSVN → 在此创建版本库...。
然后就会在新文件夹创建一个版本库,不要手工编辑这些文件!!!如果你得到什么警告,一定要先确定目录非空并且没有写保护。
启动 subversion服务
"C:\Program Files\Subversion\bin\svnserve.exe" -d -r e:/svn_root/project1
配置
现在你已经设置了Apache和Subversion,也建立了版本库,但是Apache不知道如何处理Subversion客户端,例如TortoiseSVN。为了让Apache知道哪个目录是用来作为Subversion版本库,你需要使用编辑器(例如记事本)编辑Apache的配置文件(通常是c:\program files\apache group\apache2\conf\httpd.conf):
1.在配置文件最后添加如下几行:
<Location /svn> DAV svn SVNListParentPath on SVNParentPath D:\SVN #SVNIndexXSLT "/svnindex.xsl" AuthType Basic AuthName "Subversion repositories" AuthUserFile passwd #AuthzSVNAccessFile svnaccessfile Require valid-user </Location> |
这个配置告诉 Apache 你的所有 Subversion 版本库位于D:\SVN,版本库对外的URL是: http://MyServer/svn/ 。访问被文件passwd中的用户/密码限制。
2.为了创建passwd文件,再次打开命令行提示符(DOS),来到apache2目录(通常是c:\program files\apache group\apache2)通过输入下面的命令创建新文件
bin\htpasswd -c passwd <username>
用下面的命令在已有的passwd文件里加用户:
bin\htpasswd passwd <username>
3.再次重启Apache服务。
4.将浏览器指向http://MyServer/svn/MyNewRepository(MyNewRepository是你此前创建的版本库名),如果一切正常,你会被提示输入用户名和密码,然后你会看到版本库的内容。
你刚才输入的解释是:
表 3.1. 设置 Apache 的 httpd.conf
设置 | 解释 |
<Location /svn> | 意思是Subversion版本库的URL是http://MyServer/svn/ |
DAV svn | 告诉Apache是哪个模块响应那个URL的请求-此刻是Subversion模块。 |
SVNListParentPath on | 对于Subversion1.3或者更高版本,这个指示表示显示所有SVNParentPath下的版本库。 |
SVNParentPath D:\SVN | 告诉Subversion需要查看的版本库位于D:\SVN之下 |
SVNIndexXSLT "/svnindex.xsl" | 使用它可以在用浏览器浏览时更好看。 |
AuthType Basic | 激活基本认证,就是用户名/密码 |
AuthName "Subversion repositories" | 用来说明何时弹出要求用户输入认证信息的认证对话框 |
AuthUserFile passwd | 指定使用的认证密码文件 |
AuthzSVNAccessFile | 位置Subversion版本库的访问控制文件的路径 |
Require valid-user | 指定只有输入了正确的用户/密码的用户可以访问URL |
但是那只是一个例子,对于Apache你有很多的选择。
1.如果你希望所有人可以读你的版本库,但是只有特定用户可以写,你可以修改下面下面这行
Require valid-user
成为
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
2.使用passwd可以整体的控制对版本库的访问,但是如果你希望精确的控制版本库目录访问,你可以去掉#注释号启用下面这行
#AuthzSVNAccessFile svnaccessfile
,并且创建Subversion的访问控制文件svnaccessfile(随意取名)。Apache将会确保只有有效的用户可以访问你的/svn目录,然后将用户名传递给Subversion的AuthzSVNAccessFile模块然后传给Apache中指定的mod_authz_svn模块,这样就可以根据Subversion访问控制文件实现更细粒度的访问控制。请注意路径可以是repos:path或简单的path,如果你不指定特定的版本库,访问控制规则会应用到SVNParentPath下所有的版本库,使用的授权策略文件的格式如下。
mod_authz_svn模块可以根据用户名和路径实现细粒度的权限控制,对所有的Apache服务器有效,在Subversion 1.3以上版本的svnserve上也实现了路径为基础的授权。
一个可能的例子:
[groups] admin = john, kate devteam1 = john, rachel, sally devteam2 = kate, peter, mark docs = bob, jane, mike training = zak # Default access rule for ALL repositories # Everyone can read, admins can write, Dan German is excluded. [/] * = r @admin = rw dangerman = # Allow developers complete access to their project repos [proj1:/] @devteam1 = rw [proj2:/] @devteam2 = rw [bigproj:/] @devteam1 = rw @devteam2 = rw trevor = rw # Give the doc people write access to all the docs folders [/trunk/doc] @docs = rw # Give trainees write access in the training repository only [TrainingRepos:/] @training = rw |
请注意,检查每一条路径是一件消耗极大的操作,特别是修订版本日志,服务器会检查在每一个修订版本的每一条路径是否可读,对于影响很多文件的修订将会花费很多时间。
认证和授权是不同的过程,如果用户希望获得对版本库的访问,他需要同时实现这两个步骤,对于要访问文件的普通认证请求和授权请求。
注意
※ 如果指定的是Windows的磁盘根目录,会导致一些盘符的隐藏目录也被显示出来。