Windows下配置SVN+Apache
第一章:说明
这几天在windows环境下配置svn,看了很多网上的安装方法,但是因为配置的svn和Apache的版本问题和网上写的教程的不完整等原因,安装了好久才得以正确安装。
第二章:软件版本
SVN:Setup-Subversion-1.5.3.msi
Apache: apache_2.2.10-win32-x86-no_ssl.msi
Tortiose:TortoiseSVN-1.5.5.14361-win32-svn-1.5.4.msi(安装文件)
LanguagePack_1.5.5.14361-win32-zh_CN.msi(中文语言包)
客户端浏览器在:172.168.0.200的学习文件夹中存放。安装客户端浏览 器时先安装TortoiseSVN-1.5.5.14361-win32-svn-1.5.4.msi,然后安装LanguagePack语言包,安装完 成以后,在桌面或者文件夹中的任何地方的右键—TortoiseSVN—setting,右边最上边有Language一项改为简体中文即可。
第三章:安装和建立Subversion服务器
在安装过程中最好先安装Apache,然后在安装Subversion,这样svn可以自动寻找Apache的安装目录,自动设置需要的依赖。
3.1安装Apache
安装过程很简单,不用赘述。但安装之前请先检查你的电脑是否有安装 IIS,由于 Apache 预设使用 80 port,会跟 IIS 的网站冲突,你必须把 IIS 的 Web 站台关闭,再安装 Apache HTTP Server。
安装完成以后,启动Apache,开启浏览器,浏览网址http://127.0.0.1查看有没有安装成功。显示“It works!”则说明安装成功!
3.2安装Subversion
1. 到 http://subversion.tigris.org/ 下载最新版的Subversion,可以下载.zip 或者打包好的自动安装程序。
2. 最好下载自动安装程序,直接安装,安装过程都是下一步,没什么特别的。安装完成后,连必要的环境变量都已经设定好了(如果下载的是 .zip 文件,就要自行设定)。
3. 把 Subversion/bin/ 目录下的 mod_dav_svn.so 和 mod_authz_svn.so 复制到 Apache的/modules/ 目录下。
4. 把 Subversion/bin/ 目录下的 libdb44.dll、libeay32.dll、以及 ssleay32.dll文件 复制到 Apache目录 底下的 bin 目录下。
5. 然后用文本编辑器打开 Apache 的Apache/conf/httpd.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
6. 重新启动 Apache HTTP Server。
3现在要设定 URL 路径与文件库实际路径的对应关系。对应的方式有两种,分别是 SVNPath 与 SVNParentPath。
3.3 设定文件库路径
3.3.1 SVNPath
SVNPath 适合用来个别指定文件库的路径,语法是:
<Location /svn/repos_name>
DAV svn
SVNPath /absolute/path/to/repository
</Location>
其中 "/svn/repos_name" 就是用户端存取特定文件库的 URI(Uniform Resource Indentifier),SVNPath 后面指定的路径则是文件库的绝对路径,假设我们的文件库实际存放的路径是 d:/svn/MyRepository,并且希望用户端使用 "http://myserver/svn/myrepos" 的 URL 来存取文件库,那么要加入 httpd.conf 的內容就是:
<Location /svn/myrepos>
DAV svn
SVNPath d:/svn/MyRepository
</Location>
注意 Location 标签后面的 /svn/myrepos 的第一个斜线不可少!
3.2.2 SVNParentPath
如果你的文件库都集中放在某个目录之下,例如:d:/svn,那你就可以使用 SVNParentPath 的方式指定文件库的根路径,语法是:
<Location /svn>
DAV svn
SVNParentPath /absolute/path/to/repository
</Location>
其中的 SVNParentPath 后面指定的路径是文件库的绝对路径,假设我们的文件库实际存放的路径是 d:/svn,那么要加入 httpd.conf 的内容就是:
<Location /svn>
DAV svn
SVNParentPath d:/svn
</Location>
这表示可以让任何人都可以透过 http://myserver/svn/<文件库名称> 的方式,存取位于 d:/svn 这个目录以下的所有文件库。也就是说,这个设定动作只需要一次,如果使用 SVNPath,那么你必须为各个文件库分别指定对应的路径。
为方便起见,我们这里用 SVNParentPath 来统一指定所有文件库的父层 URL 路径。将上述的设定加到 Apache的 httpd.conf 文件尾部就行了。 接下来就可以在 d:/svn 底下建立文件库了。
3.4 建立文件库
假设我们要把所有的文件库都放在 d:/svn 目录下,现在要建立一个测试用的文件库,名称叫做 repository,我们在的d:/下建立一个名为svn文件夹,然后在cmd中输入指令为:svnadmin create d:/svn/repository。这时候你已经建立了一个文件库,你可以先在本机用浏览器测试一下,网址输入 http://127.0.0.1/svn/repository或http://localhost/svn/repository,看看能不能看到文件库的内容,正常的话应该显示“It works!”
如果以上的测试可以通过,应该就行了,假如你的局域网中安装svn的服务器IP地址是172.168.0.200,则在局域网中另外一台机器(客户端)上输入http://172.168.0.200/svn/repository,应该是可以看到同样画面。
如果你想要测试一下能否从文件库取出整个工作副本(此操作并非必需),则可以进入目标目录后(假设为d:/svn_temp)执行以下指令从文件库取出整个工作副本:
svn co http://localhost/svn/repository WholeRepos
该指令是要 svn.exe 执行 check out 动作(缩写 co),如果正确的话,应该会显示 "Checked out revision 0." 的信息,此时 d:/svn/repository 这个文件库底下的所有文件目录都已经取出,并且复制了一份到d:/svn_temp/WholeRepos 目录下了。如果安装了客户端浏览器,那么在要存放工作副本的文件夹中执行“检出”命令同样完成这个动作。
到目前为止,可以确定文件库已经建立完成,接下来就可以引入项目了。
3.5 引入项目
假设我们现在有一个测试项目,项目目录位于d:/svn_temp/projectA,底下有下列子目录(当然也可以拷贝些文件到这些子目录中):
trunk
branches
tags
则进入d:/svn_temp/projectA目录后执行以下指令就可以将测试项目projectA引入到文件库d:/svn/repository/projectA中。
svn import . http://localhost/svn/repository/projectA -m "Initial repository layout",与在客户端浏览器中使用“导入”操作一样的效果。
如果我们要在repository文件库中引入多个项目,比如再将d:/svn_temp/projectB项目放到repository/projectB目录下,则进入projectB目录,用下面的命令引入projectB:
svn import http://localhost/svn/repository/projectB -m "Initial repository layout"
引入projectB后,repository文件库的目录结构就会变成这样:
/svn/repository/
+-- projectA/
+-- projectB/
也就是说 repository 这个文件库里面包含了两个项目。
如果你希望为每个项目建立一个文件库,那么在 2.4 节中建立文件库的指令就变成:
svnadmin create d:/svn/projectA
svnadmin create d:/svn/projectB
这样就变成有两个文件库了,文件库名称分别是 ProjectA 与 ProjectB。
3.6基本(Basic)访问控制
在之前的设定中没有启用身分验证的功能,可以实现访问都不需要帐户和密码,但是我们通常不希望所有人都能任意存取你的文件库,免得重要资料外泄,或者资料被破坏,因此了解如何加入身分验证也是必要的。 Sebversion 提供了多种验证使用者身份的方式,这里介绍Basic访问控制,按下列步骤进行:
1. 修改 httpd.conf 的 <Location> ,设定如下:
<Location /svn>
DAV svn
SVNParentPath d:/svn
AuthName "Subversion repository"
AuthzSVNAccessFile "d:/svn/accessfile.txt"
Require valid-user
Satisfy Any
# The following is Basic authentication setting
AuthType Basic
AuthUserFile "d:/svn/passwd.txt"
</Location>
其中AuthzSVNAccessFile指定了文件库访问政策文件,Require valid-use表示只有经过认证的用户才可以访问, Satisfy Any表示允许匿名访问(要与后面提到的*参数配套使用),AuthUserFile用来指示使用htpasswd创建的密码文件的位置。
如果你想用不同的访问政策文件和密码文件控制不同的文件库,那么可以在httpd.conf中写多个<Location></Location>模块,并用SVNPath指定各文件库的绝对路径(参考2.3.2)。
2. 用Apache的htpasswd指令生成用户名和密码:
htpasswd -cm d:/svn/passwd.txt username1
htpasswd -m d:/svn/passwd.txt username2
htpasswd的参数-c是创建文件的意思,故只在首次使用,仅使用-m参数时也可用来修改密码。
3. 配置文件库访问政策文件(假设repository文件库下已经建立了projectA和projectB),如:
[repository:/]
username1 = rw
[repository:/projectA]
username2 = r
[repository:/projectA/trunk]
username1 =
username2 = rw
[repository:/projectB]
* = r
[repository:/projectB/trunk]
username1 =
小节名称中冒号前面的文件库名称不要轻易省略,省略就 代表是针对所有文件库,这样是很为危险的,*号代表所有用户,等于号后面为空表示没有权限,mod_authz_svn模块首先会找到匹配自己的目录,然 后是父目录,父目录的父目录,依次下去,并会以最近找到的描述为准。另外,你还可以定义一组用户,然后按组进行权限配置,比如:
[groups]
department_1 = username1, username2
department_2 = username3, username4, username5
[repository:/projectA]
@department_1 = r
@department_2 = rw
4. 重新启动 Apache(注意,对httpd.conf的修改必须重启Apache后才会生效),开启浏览器,输入网址 http://127.0.0.1/svn/repository 看看,你预期应该会看到验证画面。
5. 如果要让用户能远程修改自己的Subversion密码,也很简单,有人已经把你做了相关工作了,可访问http://bbs.iusesvn.com/thread-20-1-1.html去下载Apache20Passwd.rar或Apache22Passwd.rar, (1)\将文件Apache2xPasswd.cgi及Apache2xPasswd.cgi.ini复制到Apache的CGI脚本目录下,通常是 cgi-bin目录。(这句话中的x请用相应的版本代替,如for apache2.0,则为Apache20Passwd.cgi)。(2)、如果是for apache2.2版本,复制apache的bin目录下libapr-1.dll、libapriconv-1.dll、libaprutil- 1.dll到Apache2xPasswd.cgi所在的目录(3)、修改配置文件Apache2xPasswd.cgi.ini中 auth_user_file路径,如下
[path]
auth_user_file=这里改为你的Subversion所用的AuthUserFile全路径,如C:\SVN_repos\passwd
(4)、现在访问你服务器的http://localhost/cgi-bin/Apache2xPasswd.cgi就可以看到修改subversion密码的界面了。