天天看点

Windows下架设Subversion服务器1、前 言2、基本概念3、安装配置4、FAQ

注:在输入http://localhost:8080/repos1不行时请输入http://localhost:8080/repos1/

PROPFIND Request Failed - Error 405 HTTP Method Not Allowed

This message comes in different flavours. You might be seeing this error when:

PROPFIND Request Failed

You tried to browse the parent path of a repository instead of the repository itself using an older version of TortoiseSVN. Try appending the name of the repository you wish to access, or upgrade TortoiseSVN to 1.2.3 or newer.

PROPFIND Request Failed

You forgot to append a '/' slash to the end of the URL you entered. Older versions of TSVN requires that there be a '/' after the repository name. If you forget this, TSVN will strip the repository name from the URL and therefore try to access the parent directory.

Lock Request Failed

You tried to lock a file in your working copy which no longer exists in the repository. Update your working copy before trying to lock files.

For more information about what actually caused the error, seek out the Apache error log.

[原创] Windows下架设Subversion服务器

作者:indian

版本:v1.2

修订:2008年1月24日11:45:35

出处:blog.kysf.net

版权:作者保留对本文的一切修改、发布等权力。任何人想要转载本文部分或全部内容时,必须保留包括作者、版本、修订、出处、版权,共五项信息。对本文的参考引用,则不受限制。

关键词:subversion, 安装配置, 权限, 目录访问

1 前言

2 基本概念

 2.1 什么是版本控制

 2.2 什么是 Subversion

 2.3 版本库(repository)

3 安装配置

 3.1 安装独立服务器 SVNServer

 3.2 安装 ApacheSVN 服务器

4 FAQ

5 参考资料

1、前 言

花了72小时,终于把 Subversion 初步掌握了。从一个连“什么是版本控制”都不知道的门外汉,到配置出精确至每目录访问的入门者,中间还卡了一天时间。其中费了许多气力,摸索实验了多次,还差点放弃了,但是收获是巨大的。现把我的配置和学习过程写下来,供大家参考,也让初学者少走弯路。

由于本人不会 Unix/Linux (正在学习中),故仅以 Windows 平台为例讲解,Unix/Linux 平台请参考相关资料。如其中有谬误的地方,包括错别字,请联系我修订。

技术在分享中进步!

2、基本概念

2.1、什么是版本控制

简单点来说,版本控制就是数据仓库,它可以记录你对文件的每次更改。这样,就算你在昏天黑地的改了几个月后老板说不要了,还是按照过去那样,你也不会抓狂,简单的恢复版本操作就搞定一切。

2.2、什么是 Subversion

Subversion是一个自由/开源版本控制系统,它管理文件和目录可以超越时间。一组文件存放在中心版本库,这个版本库很像一个普通的文件服务器,只是它可以记录每一次文件和目录的修改,这便使你可以取得数据以前的版本,从而可以检查所作的更改。从这个方面看,许多人把版本控制系统当作一种“时间机器”。

Subversion可以通过网络访问它的版本库,从而使用户可以在不同的电脑上使用。一定程度上可以说,允许用户在各自的地方修改同一份数据是促进协作。进展可能非常的迅速,并没有一个所有的改变都会取得效果的通道,由于所有的工作都有历史版本,你不必担心由于失去某个通道而影响质量,如果存在不正确的改变,只要取消改变。

一些版本控制系统也是软件配置管理(SCM)系统,这种系统经过特定的精巧设计来管理源代码,有许多关于软件开发的特性—本身理解编程语言、或者提供构建程序的工具。然而,Subversion不是这样一个系统,它是一个通用系统,可以管理任何类型的文件集,对你这可能是源代码,对别人,可能是一个货物报价单或者是书稿等。

2.3、版本库(repository)

Subversion 的核心就是 rpository ,中文翻译成“版本库”。就是位于服务器端,统一管理和储存数据的地方。

3、安装配置

3.1 安装独立服务器 SVNServer

环境

OS:Windows XP SP2

Web:Apache 2.2.6

SVN:svn-win32-1.4.6

一、准备工作

1、获取 Subversion 服务器程序

到官方网站(http://subversion.tigris.org/)下载最新的服务器安装程序。目前最新的是1.4.6版本,具体下载地址在:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=91 ,注意找 for apache 2.2.x 版本的。

2、获取 TortoiseSVN 客户端程序

从官方网站 http://tortoisesvn.net/downloads 获取最新的 TortoiseSVN 。TortoiseSVN 是一个客户端程序,用来与 subvers 服务器端通讯。Subversion 自带一个客户端程序 svn.exe ,但 TortoiseSVN 更好操作,提高效率。

二、安装服务器端和客户端

首先安装 Apache 2.2.6 ,具体安装方法大家参考相关资料,或者参看我写的《Windows下安装Apache 2.2.x》。

其次安装 Subversion(以下简称SVN)的服务器端和客户端。下载下来的服务器端是个 zip 压缩包,直接解压缩即可,比如我解压到 E:/subversion 。客户端安装文件是个 exe 可执行文件,直接运行按提示安装即可,客户端安装完成后提示重启。

三、建立版本库(Repository)

运行Subversion服务器需要首先要建立一个版本库(Repository)。版本库可以看作是服务器上集中存放和管理数据的地方。

开始建立版本库。首先建立 e:/svn 空文件夹作为所有版本库的根目录。然后,进入命令行并切换到subversion的bin目录。输入如下命令:

svnadmin create E:/svn/repos1

此命令在 E:/svn 下建立一个版本库 repos1 。repos1 下面会自动生成一些文件夹和文件。

我们也可以使用 TortoiseSVN 图形化的完成这一步:

先建立空目录 E:/svn/repos1 ,注意一定是要空的。然后在 repos1 文件夹上“右键->TortoiseSVN->Create Repository here...”,然后可以选择版本库模式,这里使用默认的FSFS即可,然后就创建了一系列文件夹和文件,同命令行建立的一样。

四、运行独立服务器

此时 subversion 服务还没有开始,只是通过它的命令建立了版本库。继续在刚才的命令窗口输入:

svnserve.exe --daemon

svnserve 将会在端口 3690 等待请求,--daemon(两个短横线)选项告诉 svnserve 以守护进程方式运行,这样在手动终止之前不会退出。注意不要关闭命令行窗口,关闭窗口会把 svnserve 停止。

为了验证svnserve正常工作,使用TortoiseSVN -> Repo-browser 来查看版本库。在弹出的 URL 对话框中输入:

svn://localhost/svn/repos1

点 OK 按钮后就可以看见 repos1 版本库的目录树结构了,只不过这时 repos1 是个空库。

你也可以使用--root选项设置根位置来限制服务器的访问目录,从而增加安全性和节约输入svnserve URL的时间:

svnserve.exe --daemon --root drive:/path/to/repository

以前面的测试作为例,svnserve 将会运行为:

svnserve.exe --daemon --root e:/svn

然后TortoiseSVN中的版本库浏览器URL缩减为:

svn://localhost/repos1

五、配置用户和权限

用文本编辑器打开E:/svn/repos1/conf目录,修改svnserve.conf:

将:

# password-db = passwd

改为:

password-db = passwd

即去掉前面的 # 注释符,注意前面不能有空格。

然后修改同目录的passwd文件,增加一个帐号:

将:

[users]

# harry = harryssecret

# sally = sallyssecret

增加帐号:

[users]

#harry = harryssecret

#sally = sallyssecret

test = test

六、初始化导入

下面就是将我们的数据(项目)导入到这个版本库,以后就由版本库管理我们的数据。我们的任何改动都回被版本库记录下来,甚至我们自己丢失、改错数据时版本库也能帮我们找回数据。

比如,我在 d:/wwwroot 下有个 guestbook 文件夹,里面存放的是我编写的留言簿程序。在此文件夹上“右键 -> TortoiseSVN -> Import...” ,在弹出对话框的“URL of repository”输入“svn://localhost/repos1/guestbook”。在“Import message”输入“导入整个留言簿”作为注释。

点 OK 后要求输入帐号。我们在用户名和密码处都输入 test 。完成后 guestbook 中的内容全部导入到了 svn://localhost/svn/repos1/guestbook 。

我们看到在 e:/svn/repos1 没有任何变化,连个 guestbook 文件夹都没有建立,唯一的变化就是e:/svn/repos1容量变大了。实际上我们源guestbook中的内容已经导入 repos1 版本库了,源 guestbook 文件夹可以删除了。

需要注意的是,这一步操作可以完全在另一台安装了 TortoiseSVN 的客户机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22” 。

七、基本操作流程

1、取出(check out)

取出版本库到一个工作拷贝:

来到任意空目录下,比如在f分区建立一个空文件夹 f:/work 。“右键 -> SVN Checkout”。在“URL of repository”中输入“svn://localhost/svn/repos1/guestbook”,这样我们就得到了一份 guestbook 中内容的工作拷贝。

2、存入(check in)/提交(commit)

在工作拷贝中作出修改并提交:

在 guestbook 工作拷贝中随便打开一个文件,作出修改,然后“右键 -> SVN Commit... ”。这样我们就把修改提交到了版本库,版本库根据情况存储我们提交的数据。

在修改过的文件上“右键 -> TortoiseSVN -> Show Log” ,可以看到对这个文件所有的提交。在不同的 revision 条目上“右键 -> Compare with working copy”,我们可以比较工作拷贝的文件和所选 revision 版本的区别。

3.2 安装 ApacheSVN 服务器

Subversion的设计包括一个抽象的网络层,这意味着版本库可以通过各种服务器进程访问。理论上讲,Subversion可以使用无限数量的网络协议实现,目前实践中存在着两种服务器。

  • SVNServer:svnserve 是一个小的(也叫轻型的)、独立服务器,使用自己定义的协议和客户端。(作者注:以下称这种服务器为“svnserver服务器”,上面的安装配置就是安装svnserver服务器。)
  • ApacheSVN:Apache是最流行的web服务器,通过使用 mod_dav_svn 模块,Apache可以访问版本库,并且可以使客户端使用HTTP的扩展协议WebDAV/DeltaV进行访问。(作者注:以下称这种服务器为“ApacheSVN服务器”)

通过 Http 协议访问版本库是 Subversion 的亮点之一。ApacheSVN服务器 具备了许多 svnserve服务器 没有的特性,使用上更加灵活,但是有一点难于配置,灵活通常会带来复杂性。

由于 Subversion 需要版本化的控制,因此标准的 Http 协议不能满足需求。要让 Apache 与 Subversion 协同工作,需要使用 WebDAV(Web-based Distributed Authoring and Versioning:)Web 分布式创作和版本控制)。WebDAV 是 HTTP 1.1 的扩展,关于 WebDAV 的规范和工作原理,可以参考 IETF RFC 2518 。

一、必备条件

为了让你的版本库使用HTTP网络,你必需具备以下几个条件:

  1. 配置好httpd 2.2.x,并且使用mod_dav启动。
  2. 为mod_dav安装mod_dav_svn插件。
  3. 配置你的httpd.conf,使http协议能访问版本库。

下面以我的配置过程详细讲解。

环境:

OS:Windows XP SP2

Web:Apache 2.2.6

SVN:svn-win32-1.4.6

二、安装

1、安装Apache

具体安装方法见:《Windows下安装Apache 2.2.x》

2、安装 Subversion

将下载下来的 svn-win32-1.4.6.zip 直接解压即可,比如我解压到 e:/subversion 。

从Subversion安装目录的 bin 子目录将 intl3_svn.dll、libdb44.dll、mod_authz_svn.so、mod_dav_svn.so 拷贝到Apache的模块目录(Apache 安装目录的 modules 文件夹)。

三、基本的Apache配置

修改Apache的配置文件 httpd.conf ,使用LoadModule来加载mod_dav_svn模块。

将:

#LoadModule dav_module modules/mod_dav.so

改成:

LoadModule dav_module modules/mod_dav.so

即去掉前面的“#”号。

添加:

LoadModule dav_svn_module modules/mod_dav_svn.so

一定确定它在 mod_dav 之后。

现在你已经设置了Apache和Subversion,但是Apache不知道如何处理Subversion客户端,例如TortoiseSVN。为了让Apache知道哪个目录是用来作为Subversion版本库,你需要使用编辑器(例如记事本)编辑Apache的配置文件。

在配置文件最后添加如下几行:

<Location /repository/>

  DAV svn

  SVNPath e:/svn/repos1

</Location>

这个配置告诉Apache首先需要启用 dav_module,然后加载 dav_svn_module 。版本库对外的URL是:http://服务器IP/repository/ ,所有的Subversion版本库在物理上位于e:/svn/repos1/ 。

配置完毕后重新启动 Apache,打开浏览器,输入 http://服务器IP/ repository/ 将会看到如下画面:

这表示 Apache 的 dav_svn 模块已经可以正常工作了。用户可以使用任何一种 Subversion 的客户端通过 Http 协议访问你的版本库。

如果想要指定多个版本库,可以用多个 Location 标签,也可以使用 SVNParentPath 代替 SVNPath,例如在 e:/svn 下有多个版本库 repos1,repos2 等等,用如下方式指定:

<Location /repository/>

 DAV svn

 SVNParentPath e:/svn

</Location>

“SVNParentPath e:/svn ” 表示 e:/svn 下的每个子目录都是一个版本库。可以通过 http://服务器IP/repository/repos1/,http://服务器IP/repository/repos2/ 来访问。

现在你的版本库任何人都可以访问,并且有完全的写操作权限。也就是说任何人都可以匿名读取,修改,提交,以及删除版本库中的内容(注:这时不需要配置E:/svn/repos/conf/svnserve.conf 文件,并且也不需要启动E:/subversion/bin/svnserve.exe。因为提交是通过Apache的dav模块处理的,而不是由svnservice处理。)。我们用 TortoiseSVN 客户端验证即知。

显然大部分场合这是不符合需求的。那么如何进行权限设置呢,Apache 提供了基本的权限设置:

四、认证选项

1、基本 HTTP 认证

最简单的客户端认证方式是通过 HTTP 基本认证机制,简单的使用用户名和密码来验证一个用户的身份。Apache提供了一个 htpasswd 工具来管理一个用户文件,这个文件包含用户名和加密后的密码,这些就是你希望赋予 Subversion 特别权限的用户。htpasswd 可以在 Apache 的 bin 安装目录下找到。具体使用方法如下:

创建用户文件:

htpasswd -c E:/usr/Apache2.2/bin/passwd.conf username

添加新用户(-m 表示以 MD5 加密密码,可选项):

htpasswd [-m] E:/usr/Apache2.2/bin/passwd.conf Newusername

更改用户密码:

htpasswd [-m] E:/usr/Apache2.2/bin/passwd.conf username

删除用户(要用大写的 D ):

htpasswd –D E:/usr/Apache2.2/bin/passwd.conf username

接下来修改 httpd.conf,在 Location 标签中加入如下内容:

AuthType Basic

AuthName "svn repos"

AuthUserFile E:/usr/Apache2.2/bin/passwd.conf

Require valid-user

说明:

AuthType Basic:启用基本的验证,比如用户名/密码对。

AuthName "svn repos":当一个认证对话框弹出时,出现在认证对话框中的信息。(最好用英文,TortoiseSVN 不支持中文,安装语言包除外。)

AuthUserFile E:/usr/Apache2.2/bin/passwd:指定E:/usr/Apache2.2/bin/passwd为用户文件,用来验证用户的用户名及密码。

Require valid-user:限定用户只有输入正确的用户名及密码后才能访问这个路径

重新启动 Apache ,打开浏览器访问版本库。Apache 会提示你输入用户名和密码来认证登陆了,现在只有 passwd 文件中设定的用户才可以访问版本库。也可以配置只有特定用户可以访问,替换上述 "Require valid-user" 为 "Require user tony robert" 将只有用户文件中的 tony 和 robert 可以访问该版本库。

有的时候也许不需要这样严格的访问控制,例如大多数开源项目允许匿名的读取操作,而只有认证用户才允许写操作。为了实现更为细致的权限认证,可以使用 Limit 和 LimitExcept 标签。例如:

<LimitExcept GET PROPFIND OPTIONS REPORT>

  require valid-user

</LimitExcept>

以上配置将使匿名用户有读取权限,而限制只有 passwd 中配置的用户可以使用写操作。

如果这还不能满足你的要求,你希望精确的控制版本库目录访问,可以使用 Apache 的 mod_authz_svn 模块对每个目录进行认证操作。

2、用 mod_authz_svn 进行目录访问控制

首先需要让 Apache 将 mod_authz_svn 模块加载进来。在 Subversion 的安装目录中找到 mod_auth_svn 模块,将其拷贝到 Apache 安装目录的 modules 子目录下。修改 httpd.conf 文件,添加:

LoadModule authz_svn_module modules/mod_authz_svn.so

现在可以在 Location 标签中使用 authz 的功能了。一个基本的 authz 配置如下:

<Location /repository/>

  DAV svn

  SVNParentPath e:/svn

  # our access control policy

  AuthzSVNAccessFile E:/usr/Apache2.2/bin/accesspolicy.conf

  # try anonymous access first, resort to real

  # authentication if necessary.

  Satisfy Any

  Require valid-user

  # how to authenticate a user

  AuthType Basic

  AuthName "Subversion repository"

  AuthUserFile E:/usr/Apache2.2/bin/passwd.conf

</Location>

AuthzSVNAccessFile 指向的是 authz 的策略文件,详细的权限控制可以在这个策略文件中指定。访问文件 accesspolicy.conf 的语法与svnserve.conf和 Apache 的配置文件非常相似,以(#)开头的行会被忽略;在它的简单形式里,每一小节命名一个版本库和一个里面的路径;认证用户名是在每个小节中的选项名;每个选项的值描述了用户访问版本库的级别:r(只读)或者rw(读写),如果用户没有提到或者值留空,访问是不允许的; * 表示所有用户,用它控制匿名用户的访问权限;@符号区分组和用户。如:

[groups]

committers = paulex, richard

developers = jimmy, michel, spark, sean

[/]

* = r

@committers = rw

[/branches/dev]

@developers = rw

[/tags]

tony = rw

[/private]

* =

@committers= r

使用 SVNParentPath 代替 SVNPath 来指定多个版本库的父目录时,其中所有的版本库都将按照这个策略文件配置。例如上例中 tony 将对所有版本库里的 /tags 目录具有读写权限。如果要对具体每个版本库配置,用如下的语法:

[groups]

project1_committers = paulex, richard

project2_committers = jimmy, michel, spark, tony, Robert

[repos1:/]

* = r

@ project1_committer = rw

[repos2:/]

* = r

@ project2_committer = rw

这样项目1的 project1_committer 组只能对 repos1 版本库下的文件具有写权限而不能修改版本库 repos2 ,同样项目2的 project2_commiter 组也不能修改 repos1 版本库的文件。

4、FAQ

1、路径或权限不足时将出现错误信息提示:

http://localhost (路径不对)

Error * PROPFIND request failed on '/' PROPFIND of '/': 200 OK (http://localhost)

http://localhost/svn (权限不足)

Error * PROPFIND request failed on '/svn' PROPFIND of '/svn': 403 Forbidden (http://localhost)

http://localhost/svn/repos (正常显示)

http://localhost/repos (权限不允许)

Error * PROPFIND request failed on '/repos' PROPFIND of '/repos': 405 Method Not Allowed (http://localhost)

2、不启动E:/subversion/bin/svnserve.exe ,但启动了ApacheSVN ,访问(tortoiseSVN –> Repo – browser)或提交(SVN Commit)情形如下:

现象:svn://localhost/svn/repos 不能访问或提交,提示:Error * Can't connect to host 'localhost': 由于目标机器积极拒绝,无法连接。 但 file:///e:/svn/repos 和 http://localhost/svn/repos 可以访问或提交。

原因:svn:// 是独立服务器 svnserver 自己的协议。file:/// 是本地访问,即服务器端和客户端在一个机器上。

参考资料:

Subversion 官方网站:Subversion 的官方网站,提供最权威的介绍和最新的下载。

Subversion 中文手册:Subversion 简体中文官方网站翻译的中文手册。

TortoiseSVN 中文文档:Subversion 简体中文官方网站翻译的 TortoiseSVN 中文文档。

我用SVN中文论坛:国内人气非常旺的 SVN 中文交流论坛。

《用Apache和Subversion搭建安全的版本控制环境》:IBM 工程师写的基于 Linux 的 SVN 教程。

百度百科:由全体网民共同撰写的百科全书

~ 全文完~

          印第安

      2007年12月23日23:37:41 v1.0 初稿

      2007年12月25日2:24:53 v1.1 更新。更改了几处路径,使之更加便于Win下调试。全文重新排版,阅读条理更清晰。

      2008年1月24日11:45:35 v1.2 修订。修改几处书写错误(谢谢山东济南的网易博友242);修改1个关键配置路径。