Subversion for Windows 安装指南
摘要
本文提供一个简易的安装指南,说明在 Windows 环境下安装 Subversion 服务器的步骤,以及 TortoiseSVN 客户端工具的安装步骤。
1 简介
Subversion 是一个版本控制系统,它是根据 CVS(Concurrent Versions System)的功能为基础来设计,但是改进了一些 CVS 的缺点,例如:在 CVS 中移动文件目录很不方便;此外,它也增加了其他的功能,例如:....等等。
由于目前手边查到的 Subversion 文件,主要都是针对 Linux 用户来撰写,所以这份文件特地针对 Windows 环境下安装 Subversion 的步骤来说明,希望透过这份文件,能夠帮助你很快的把 Subversion 安装起来。
在安装过程中,会需要输入一些命令列的指令,我不会详细解释某些指令的用途和意义,因此你除了要熟悉 DOS 的基本指令,还应该隨时查閱 Subversion 的电子书,以了解 Subverion 命令工具的使用方法。图形化介面虽然方便,但是熟悉命令工具的使用,才能让你得到完全的自由。
1.1 阅读基本概念
如果你缺乏版本控制系统的基本概念,就算能夠顺利安装好 Subversion,可能安装完成后就不知道下一步怎么做了。这里只简单的提一点必要的基础概念,记住你最终还是得阅读 Subversion 的官方文件。
1.2 环境与版本
以下是笔者安装 Subverion 的环境与版本:
- Windows 2000 Server with SP4
- Apache HTTP Server v 2.0.49
- Subversion v 1.0.4
- TortoiseSVN 1.0.6 build 1200
2 安装与建立 Subversion 服务器
本节介绍安装 Subversion 所需的步骤,请准备一台穩定的机器,作为 Subversion 的服务器。
2.1 安装 Apache HTTP Server
到 http://httpd.apache.org/ 下载 Apache HTTP Server 2.0 版 for Windows 的安装程式,我下载的文件是 apache_ 2.0.49 -win32-x86-no_ssl.msi。
下载之后直接安装,安装过程很简单,就不贅述了,但安装之前请先检查你的电脑是否有安装 IIS,由于 Apache 预设使用 80 port,会跟 IIS 的网站衝突,你必须把 IIS 的 Web 站台关闭,再安装 Apache HTTP Server。
安装完成以后,开启浏览器,浏览网址 http://127.0.0.1/ 看看有沒有出现安装成功的网页。
2.2 安装 Subversion
- 到 http://subversion.tigris.org/ 下载最新版的 Subversion,你可以下载 .zip 或者打包好的自动安装程式,我下载的是文件 svn- 1.4.0 -setup.exe。
- 下载后直接安装,安装过程都是下一步,沒什么特別的。安装完成后,连必要的环境变量都帮你设定好了(如果你下载的是 .zip 档,就要自行设定)。
- 把 <Subversion_root>/httpd/ 目录下的 mod_dav_svn.so 和 mod_authz_svn.so 复制到 <Apache_root>/modules/ 目录下。
- 把 <Subversion_root>/bin/ 目录下的 libdb42.dll、libeay32.dll、以及 ssleay32.dll 复制到 <Apache_root> 底下的 bin 或 modules 资料夾。
- 接著用文书编辑器开启 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
- 重新启动 Apache HTTP Server。
问题排除 如果 Apache HTTP Server 无法启动,请依下列步骤检查:
|
2.3 设定 Apache HTTP Server
用文书编辑器开启 Apache HTTP Server 的 httpd.conf,在文件最后面加上以下几行:
<Location /svn>
DAV svn
SVNParentPath /absolute/path/to/repository
</Location>
其中的 SVNPath 后面指定的路径是文件库的绝对路径,假设我们的文件库实际存放的路径是 d:/svn/repository,那么要加入 httpd.conf 的內容就是:
<Location /svn>
DAV svn
SVNParentPath d:/svn
</Location>
这表示可以让任何人都可以透过 http://myserver/svn/<文件库名称> 的方式,存取位于 d:/svn 这个目录以下的所有文件库。注意:Location 标记后面的 /svn 的第一个斜线不可少!
接下来就可以在 d:/svn 底下建立文件库了。
提示 方便起見,这里我用 SVNParentPath 来统一指定所有文件库的父層 URL 路径名称,如果你需要为不同的文件库指定不同的 URL 路径名称,可以改用 SVNPath,详细说明请参考 [1]。 |
2.4 建立文件库
假设我们要把所有的文件库都放在 d:/svn 目录下,现在要建立一个测试用的文件库,名称叫做 在 repository,指令为:
md d:/svn
svnadmin create d:/svn/repository
命令执行完后,检查看看 d:/svn/repository 目录底下产生了哪些目录和文件。
警告 文件库绝对不可以在建立在任何远端的储存媒体上,例如:网路硬盘机。 |
这时候你已经建立了一个文件库,你可以先在本机用浏览器测试一下,网址输入 http://svn/repository,看看能不能看到文件库的內容,正常的话应该像下图一样。
如果以上的测试可以通过,应该就行了。如果你还想要测试一下能不能从文件库取出整个工作複本,可以执行下列指令(非必要):
c:
cd/temp
svn co http://localhost/svn/repository WholeRepos
上述指令会切换到一个暂时的目录 c:/temp,然后从文件库取出整个工作複本。最后一行指令是要 svn.exe 执行 check out 动作(缩写 co),如果正确的话,应该会显示 "Checked out revision 0." 的信息,此时 /svn/repository 这个文件库底下的所有文件目录都已经取出,並且复制一份到 c:/temp/WholeRepos 目录下了。
问题排除 如果显示的错误信息是: svn: PROPFIND request failed on '/svn/repository' svn: PROPFIND of '/svn/repository': 405 Method Not Allowed (http://localhost) 请检查 Apache HTTP Server 的 httpd.conf 文件里面的 <Location> 标记所定义的位置是否跟你指定的 URL 样式相同,注意一定要完全相同,以上面的例子而言,你的 httpd.conf 的最后面应该会有以下文字: <Location /svn> DAV svn SVNPath 指向文件库的绝对路径 </Location> 如果显示的错误信息是: svn: PROPFIND request failed on '/svn/repository' svn: Could not open the requested SVN filesystem 那表示在 /svn 对应的实验目录(即 d:/svn)下找不到 reposiroty 这个目录。 註:PROPFIND 是给 WebDAV 用的 HTTP method,用来从资源中取得属性。 |
测试完毕就可以把 WholeRepos 这个目录整个刪掉了。
到目前为止,可以确定文件库已经建立完成,接下来就可以引入项目了。
2.5 引入项目
不用急著把你现有的正式项目引入文件库,先建立一个用来测试的项目目录就好了。我们先在 c:/temp 底下建一个 ProjectA 的项目目录结构,参考下面的指令:
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 这个项目已经引入文件库了,也就是说,其他使用者可以开始存取这个文件库的项目取出文件和程式码了。你可以参考 Subversion 的官方手册中关于 svn.exe 这个客户端命令列工具的使用方法,多练习一下取出文件、加入文件、以及存入文件等指令。万一练习的过程中发生错误,或者文件库弄亂了,你可以把整个文件库的目录砍掉,回到 2.4 节重新做一遍。
以下会进一步讨论文件库和项目目录结构的安排方式,如果你急著想试试看客户端如何存取 Subversion 文件库,可以先跳到2.6 节或第 3 节。
2.5.1 文件库与项目的配置方式
延续前面的范例,如果你再引入其他项目,例如 ProjectB,那么整个文件库的结构会变成这样:
/svn/repository/
+-- ProjectA/
+-- ProjectB/
也就是说 repository 这个文件库里面包含了两个项目。
如果你希望为每个项目建立一个文件库,那么在 2.4 节中建立文件库的指令就变成:
md d:/svn
svnadmin create d:/svn/ProjectA
svnadmin create d:/svn/ProjectB
这样就变成有两个文件库了,文件库名称分別是 ProjectA 与 ProjectB。
提示 如果项目之间有共享的文件,建议把这些相关的项目放进同一个文件库;如果项目之间彼此毫无关係,那就采用一个文件库放一个项目的方式,这种方式等于项目就是文件库。 第一种方式有个比较奇怪的「功能」你应该要知道,就是一个项目的 check in 动作,也会令其他项目的文件的修订版号增加 ,如果这不是你想要的,请选择第二种方式,即一个文件库只存放一个项目。 |
2.5.2 项目的目录结构
这里补充说明一下 ProjectA 的目录结构。在 ProjectA 项目的根目录下建立的 trunk、branches、和 tags 这三个目录是有特別意义的,它们的作用分別是:
- trunk 目录用来存份目前项目正在进行开发的程式文件和文件(又称为主線,即 mainline);
- branches 用来存放主線的各个仍在发展中的分支;
- tags 則用来存放已经不再变动的分支,也就是其中的文件不会再修改了。
这是 Subverion 官方手册建议的目录结构安排方式,你可以自己決定要不要用这种配置方式,详细说明请参考官方手册的第五章,子标题为 "Choosing a Repository Layout"。
提示 目录名称建议尽量不要用中文名称,这样在使用命令列时比较方便,也比较不会有问题。 |
2.6 使用 Windows 网域帐户验证
照著前面的步骤做,你会发现存取文件库时都不用输入帐号密码,这是因为我们之前的设定沒有启用身分验证的功能。但是我们通常不希望所有人都能任意存取你的文件库,免得重要资产外洩,或者资料被破坏,因此了解如何加入身分验证也是必要的。
Serversion 提供了多种验证使用者身份的方式,这里只介绍 Windows 身分验证的方式,这种方式很適合用在开发团隊成員都在區域网路內的情況。请依下列步骤进行:
- 取得 SSPI 模组,下载网址为 http://tortoisesvn.tigris.org/mod_auth_sspi.zip。
- 把 zip 里面的 mod_auth_sspi.so 解压縮到 <Apache_root>/modules 目录下。
- 把下面这行加入到 Apache 的 httpd.conf 里面:
4. LoadModule sspi_auth_module modules/mod_auth_sspi.so
注意上面加入的这行一定要放在下面这行的前面:
LoadModule auth_module modules/mod_auth.so
- 修改 httpd.conf 的 <Location> 设定如下:
6. <Location /svn>
7. DAV svn
8. SVNParentPath d:/svn
9. AuthType SSPI
10. AuthName "Subversion 文件库"
11. Require valid-user
12. SSPIAuth On
13. SSPIAuthoritative On
14. SSPIDomain <domaincontroller>
15. SSPIOfferBasic On
</Location>
其中 <domaincontroller> 就是你的 Windows 网域控制器的电脑名称(例如:WIN2KDC),注意两边的括号 <> 不用保留。如果你的环境沒有网域控制器,就維持原来的 <domaincontroller> 就行了。在我的环境下,我发现即使有网域控制器,但是这里不去设定它,还是能夠正常的验证使用者身分。
- 重新启动 Apache。
好了,现在开启浏览器,输入网址 http://127.0.0.1/svn/repository 看看,你预期应该会看到如下的验证画面:
但是卻沒有出现这个画面,而是直接显示文件库內容,怎么回事?
因为我们现在是使用 Windows 帐户验证,你目前已经登入这台机器了,而你要存取的也是本机的资源,换句话说,你的身分已经被验证过了,所以就不会再要求你输入帐号跟密码,这是采用 SSPI 网域验证的好處。
那么,如果你的同事 John 的电脑有加入网域,但是他平时都是登入本机,而非登入网域,在存取文件库时会不会要求输入帐号密码?答案是如果 John 登入他本机的帐号和密码跟他在网域使用者的帐号密码完全一样的话,就无需再输入密码;相反的,如果登入本机的使用者帐号和密码与网域使用者帐号密码不同,第一次存取时就必须输入密码。
你可以在別台机器上,用一个网域里沒有的使用者帐号去存取 Subverion 文件库,如果正确的话,应该就会出现要求输入帐号密码的視窗。
以上还只是最基本的设定,如果你希望做些进階的设定,例如允許所有人都可以检視文件库的內容,但是不能修改;或者要加入 SSL 加密机制,建议您参考 [2] 的第三章。
提示 启用身分验证之后,你会发现用命令列工具 svn.exe 存取文件库时,如果是用 http:// 协议,有些子命令(subcommand)执行时会出现 "authorization failed" 的错误,这时候你可以在 svn 命令中加入 --username 和 --password 来提供使用者名称和密码,例如: svn co http://myserver/svn/ 或者你也可以改用 file:/// 协议。 |
3 安装客户端:TortoiseSVN
现在你已经有一个可以運作的 Subversion 服务器,可以试著在其他电脑上存取文件库了。如果你習慣使用命令列工具,那就只要在客户端电脑上安装 Subversion 就行了,存取文件库都是透过命令列工具(主要是 svn.exe)。这里要介绍的是一个專門为 Windows 作業系统设計的 Subversion 客户端:TortoiseSVN(以下簡称 TSVN)。
3.1 安装 TortoiseSVN
- 到 http://tortoisesvn.tigris.org/ 下载最新的安装程式,下载后直接安装。安装过程大都是按下一步,只有在問你
安装完成后会要求你重新开机。 - 到 http://tortoisesvn.tigris.org/ 下载简体中文的语言包(language pack),请注意语言包的版本应该要跟你安装的 TSVN 版本相同,否則最好不要安装。语言包装完之后,用资源管理器在 Windows 桌面上或任何一个资料夾上点一下滑鼠右鍵,选择 TortoiseSVN -> Settings,在 "Main" 页夾中更改 Language 设定为「中文(简体)」,再按「确定」钮即可。
安装完成之后,在任何目录名称上点一下滑鼠右鍵都可以看到 TSVN 的功能選项,这也是 TSVN 方便的地方,它不用跟开发工具整合,而是跟作業系统整合在一起,这样不管你用什么开发工具,都可以輕鬆的使用 TSVN 来存取文件库。
接下来你可以用 TSVN 练习一下存取之前建立好的文件库,试著把你现有的项目引入文件库中,並且在客户端使用 TSVN 执行取出、存入、更新等动作。
TSVN 虽然是客户端工具,不过它也提供了建立文件库、以及引入、引出等功能,因此安装在服务器端也挺方便的。
4 結語
按照本文说明的安装步骤,希望能让你顺利在 Windows 环境下把 Subversion 安装起来。但是安装成功以后,真正的工作要才开始,如果你沒有花点时间阅读 Subversion 的相关文件,在使用版本控制系统的过程中,一定会碰到許多问题。
在正式將你的项目加入 Subversion 文件库之前,建议您多考虑一下:
- 文件库的配置方式。究竟要为每一个项目建立一个文件库,还是把多个项目放进同一个文件库里?
- 项目目录的结构。你要依照官方手册的方式,在项目的根目录下建立 trunk、branches、和 tags 吗?
- 哪些东西要放进文件库里?
前两个问题你可以参考 [1] 的建议(第五章),再衡量自己的需求来決定。你不見得要依照官方的建议,第一次也許采用最单纯的配置方式会比较好,例如:一个文件库就只放一个项目,而且只把程式的原始码 放进文件库,也不去分主线支线了,因此项目的目录结构可以很单纯,程式原始码的根目录就是项目的根目录。自己动手做过几次以后, 再去观察文件库的內容,就会比较有感覺了,然后再来考虑自己团队的需求,自然就能找到最适合自己团队的配置方式了。