1 前言<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

这段时间有点空,闲着也无聊,所以就弄弄这个 SVN 。在做服务之前,我还是重申我的观点:

一.         要知道系统的操作,由于本服务的运行平台是 WINDOWS ,所以简单一点。但是对于 LIUNX 来说,这一点很重要。

二.         要了解所做的应用服务是用来干什么的,以及有些步骤为什么要这么做,不这样行不行,或者有更好的发法。多问一些为什么。

三.         最后一点是,做技术,尽量的要自己动手去做,光靠嘴说会做,是不行的。并且在做的时候,出现的问题越多,对你是有好处的。

 

2 关于 Subversion

Subversion 是一个版本控制系统,它是根据 CVS Concurrent Versions System )的功能为基础来设计,但是改进了一些 CVS 的缺点,例如:在 CVS 中移动文件目录很不方便;此外,它也增加了其他的功能,例如:不可分割的送交(如同资料库交易的概念,送交多个文件时,若有任何一个文件失败,则这次送交的所有文件都不会进入文件库中),支援多种网络协议,一致的文件差异比对(不管什么文件类型,均使用二进位差异比对方式),等等。

在做这个服务的时候,我也查了网上的一些资料,不是很完整的。而且在LIUNX环境下的比较多,所以我做这个服务也用的时间有点长,希望此文可以给初学者一些帮助。

 

 

 

3 服务所需软件:

 

系统平台: windows server 2003 企业版

Apache http://httpd.apache.org/download.cgi  Apache_2.0.63-win32-x86-no_ssl.msi

Setup-Subversion-1.5.1.en-us.msi

 

 

4 安装 Apache server:

 

警告:请注意,没安装 Service Pack 1 Windows XP 将导致错误的网络数据从而破坏你的版本库!

 

http://httpd.apache.org/download.cgi 最新版本的 Apache Web 服务器。确保你下载的版本大于 2.0.54 2.0.54 版本的 Apache 将不能与 Subversion 1.3.xx 配合工作。而且,小

2.0.54 Apache 也因为在 windows 上的编译存在一个 bug 而导致不能与 subversion1.2 配合使用。

 

一旦你已经有了 Apache2 的安装程序,你可以双击它,它将引导你完成整个安装过程。请确保你输入正确的服务器 URL (如果你的服务器没有 DNS 名称,你可以直接输入 IP 地址)。我

建议你将 Apache 安装成 for all Users,on Port 80,as a service 。注意:如果你已经有一个 IIS 或者其它的程序使用 80 端口,安装可能会失败。如果是这样,你可以到程序目录下

Apache Group/Apache2/conf 目录中找到文件 httpd.conf ,将其中的 Listen 80 改成一个不用的端口,比如 Listen 81 。然后重新运行这个安装程序,这次应该不会再有问题了。

 

现在你可以在你的浏览器中键入 http://loccalhost ,如果呈现了一个已经配置好的网站,那么你的 Apache 就安装成功了。

 

警告:

 

如果你将 Apache 安装成一个服务,它将以本地 system 帐户来运行。为 Apache 创建一个单独的用户来运行它将会更安全一些。

 

请确保运行 Apache 的用户有版本库的完全访问权限(右键版本库目录 -> 属性 -> 安全)。要不然,用户将无法提交他们的更改。

 

就算 Apache 以本机 system 来运行,你也要设置它能完全读写版本库目录。

 

如果没有为 Apache 配置这个许可,用户将会得到 " 禁止访问 " 的错误信息,在 Apache 的错误日志中表现为错误 500

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

 

 

 

OK ! apache 安装完成!

 

 

5 安装 Subversion

 

一.       直接运行安装 因为 apache 2 0 的,所以为第一项!

二.    E:/Program Files/Subversion/bin目录下的 mod_dav_svn.so mod_authz_svn.so 复制到E:/Program Files/Apache Group/Apache2/modules目录下。

三.    E:/Program Files/Subversion/bin 目录下的 libdb44.dlllibeay32.dll、以及 ssleay32.dll 复制到E:/Program Files/Apache Group/Apache2/ 底下的 bin 中。

用文本编辑器打开 Apache Server E:/Program Files/Apache Group/Apache2/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

 

四.    重新启动 Apache  Server

 

5.1  设定 Subversion 文件库路径

现在要设定 URL 路径与文件库实际路径的对应关系。对应的方式有两种,分别是 SVNPath SVNParentPath

5.1.1 SVNPath

SVNPath 适合用来个别指定文件库的路径,语法是:

<Location /svn/repos_name>

DAV svn

SVNPath /absolute/path/to/repository

</Location>

其中 "/svn/repos_name" 就是用户端存取特定文件库的 URIUniform 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 的第一个斜线不可少!

5.1.2 SVNParentPath

如果你的文件库都集中放在某个目录之下,例如:d:/svn,那你就可以使用 SVNParentPath 的方式指定文件库的根路径,语法是:

<Location /svn>

DAV svn

SVNParentPath /absolute/path/to/repository

</Location>

其中的 SVNParentPath 后面指定的路径是文件库的绝对路径,假设我们的文件库实际存放的路径是 E:/svn,那么要加入 httpd.conf 的内容就是:

<Location /svn>

DAV svn

SVNParentPath E:/svn

</Location>

这表示可以让任何人都可以透过 http://myserver/svn/<文件库名称> 的方式,存取位于 E:/svn 这个目录以下的所有文件库。也就是说,这个设定动作只需要一次,如果使用 SVNPath,那么你必须为各个文件库分别指定对应的路径。

为方便起见,我们这里用 SVNParentPath 来统一指定所有文件库的父层 URL 路径。将上述的设定加到 Apache HTTP Server httpd.conf 文件尾部就行了。

接下来就可以在 E:/svn 底下建立文件库了。

6 建立文件库

假设我们要把所有的文件库都放在 E:/svn 目录下,现在要建立一个测试用的文件库,名称叫做 repository ,指令为:

md E:\svn

svnadmin create E:/svn/repository ( 要进入到此目录才用 svnadmin 这个命令 E:\Program Files\Subversion\bin) 命令执行完后,检查看看 E:/svn/repository 目录底下产生了哪些目录和文件。

 

警告:

文件库绝对不可以在建立在任何远端的储存媒体上,例如:网络硬盘

 

这时候你已经建立了一个文件库,你可以先在本机用浏览器测试一下,网址输入 http://127.0.0.1/svn/repositoryhttp://localhost/svn/repository,看看能不能看到文件库的内容,正常的话应该像下图一样。

:

 

7   引入项目测试

假设我们现在有一个测试项目,项目目录位于 E:/svn_temp/projectA,底下有下列子目录(当然也可以拷贝些文件到这些子目录中):

trunk

branches

tags

 

 

则进入E:/svn_temp/projectA目录后执行以下指令就可以将测试项目projectA到文件库 E/svn/repository 中。

svn import . http://localhost/svn/repository/projectA -m "Initial repository layout"

         :

 

提示

本文在执行 svn 命令时,都是使用 http 协议的方式,这样我们可以确知 Subversion Apache HTTP Server 的设定无誤,其他人就可以透过 Internet 存取文件库。当然你也可以用其他的协议,例如:file:///,如果使用 file 协议,则该指令要变成:

svn import . file:///d:/svn/repository/projectA -m "Initial repository layout"

这时候 projectA 这个项目已经引入文件库了(此时你会发现在E:\svn\repository\db\revs\0目录下多了一个叫1的文件),也就是说,其他使用者可以开始存取这个文件库的项目取出文件和程序码了。

 

7.1 件库与项目的配置方式

如果我们要在 repository 文件库中引入多个项目,比如再将 E:/svn_temp/projectB 项目放到 repository 目录下,则进入 projectB 目录,用下面的命令引入 projectB

svn import . http://localhost/svn/repository/projectB -m "Initial repository layout"

 

引入 projectB 后, repository 文件库的目录结构就会变成这样:

 

也就是说 repository 这个文件库里面包含了两个项目。

如果你希望为每个项目建立一个文件库,那么建立文件库的指令就变成:

md d:\svn

svnadmin create d:/svn/projectA

svnadmin create d:/svn/projectB

这样就变成有两个文件库了,文件库名称分别是 ProjectA ProjectB

 

7.2 项目的目录结构说明

这里补充说明一下 ProjectA 的目录结构。在 ProjectA 项目的根目录下建立的 trunkbranches、和 tags 这三个目录是有特别意义的,它们的作用分别是:

trunk 目录用来存放目前项目正在进行开发的程序文件和文档(又称为主线,即 mainline);

branches 用来存放主线的各个仍在发展中的分支;

tags 则用来存放已经不再变动的分支,也就是其中的文件不会再修改了。

这是 Subverion 官方手册建议的目录结构安排方式,你可以自己决定要不要用这种配置方式,详细说明请参考官方手册的第五章,子标题为 "Choosing a Repository Layout"

8   访问控制

8.1 基本 (Basic) 访问控制

照着前面的步骤做,你会发现存取文件库时都不用输入帐号密码,这是因为我们之前的设定没有启用身分验证的功能。但是我们通常不希望所有人都能任意存取你的文件库,免得重要资料外泄,或者资料被破坏,因此了解如何加入身分验证也是必要的。

Sebversion 提供了多种验证使用者身份的方式,现在介绍Basic访问控制,按下列步骤进行:

 

一.     修改 httpd.conf <Location> ,设定如下:(可以将下面的复制到以前5.1.2做的那段)

二.    <Location /svn>

DAV svn

SVNParentPath E:/svn

AuthName "请输入用户名和密码"

AuthzSVNAccessFile "E:/svn/accessfile.txt"

Require valid-user

# The following is Basic authentication setting

AuthType Basic

AuthUserFile "E:/svn/passwd.txt"

</Location>

 

.说明:

<Location /svn>:意味着可以通过像这样的URL(http://MyServer/svn)来访问Subversion版本库.

 

DAV svn:告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块.

 

SVNParentPath E:\SVN:告诉Subversion在目录 E:\SVN下寻找版本库

 

AuthName "Subversion repositories":当一个验证对话框弹出时,告诉用户这个验证是用来做什么的.

 

 

AuthUserFile E:\passwd.txt:指定E:\passwd.txt用为密码文件用来验证用户的用户名及密码.

 

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

 

AuthzSVNAccessFile E:\svnaccessfile.txt:指定E:\svnaccessfile.txt来限定各个用户或组在版本库中目录的访问权限.

 

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

 

 

如果你想用不同的访问政策文件和密码文件控制不同的文件库,那么可以在httpd.conf中写多个<Location></Location>模块,并用SVNPath指定各文件库的绝对路径

 

.Apachehtpasswd指令生成用户名和密码:

 

htpasswd -cm E:/svn/passwd.txt user1

htpasswd -m E:/svn/passwd.txt user2

htpasswd 的参数 -c 是创建文件的意思,故只在首次使用,仅使用 -m 参数时也可用来修改密码。

 

进入: E:\Program Files\Apache Group\Apache2\bin

 

 

五:配置文件库访问政策文件

 

E:\svn建立一个accessfile.txt

 

内容如下:

 

[repository:/]        (文件库 repository 中所有的文件)

user1 = rw             (用户 user1 为读写权限)

[repository:/projectA] (文件库 repository projectA 项目文件)

user2 = r

 

 [repository:/projectB]

* = r

 

小节名称中冒号前面的文件库名称不要轻易省略,省略就代表是针对所有文件库,这样是很为危险的,*号代表所有用户,等于号后面为空表示没有权限,mod_authz_svn模块首先会找到匹配自己的目录,然后是父目录,父目录的父目录,依次下去,并会以最近找到的描述为准。另外,你还可以定义一组用户,然后按组进行权限配置,比如:

[groups]

department_1 = user1, user2

department_2 = user3, user4

[repository:/projectA]

@department_1 = r

@department_2 = rw

 

权限说明:

  #[groups]   //群组设置

 

#group1 = harry   // 群组1中的成员

 

#@group1 = rw // 表示这是个群组权限设置

 

#[/]          //所有仓库的根目录

 

 

#* = r         //所以成员为只读

 

# 明确定义的权限大于继承权限,没有明确定义的权限将从上层继承下来,因此赋权应在仓库内用户必须要的目录中指定.

 

 

六. 重新启动 Apache(注意,对httpd.conf的修改必须重启Apache后才会生效),开启浏览器,输入网址http://127.0.0.1/svn/repository 看看,你预期应该会看到如下的验证画面:

 

六.如果要让用户能远程修改自己的Subversion密码,也很简单,有人已经把你做了相关工作了,可访问http://bbs.iusesvn.com/thread-20-1-1.html站点下载Apache20Passwd.rar,将其中的passwd.cgipasswd.cgi.ini复制到<Apache_root>cgi-bin子目录中,然后修改配置文件passwd.cgi.ini中的auth_user_file路径,使得其指向实际的AuthUserFile的全路径(比如d:/svn/passwd.txt),这时用户就可以访问http://localhost/cgi-bin/passwd.cgi修改subversion密码了。

9 安装客户端 TortoiseSVN

现在你已经有一个可以运作的 Subversion 服务器,可以试着在其他电脑上存取文件库了。如果你习惯使用命令列工具,那就只要在客户端电脑上安装 Subversion 就行了,存取文件库都是透过命令列 工具(主要是 svn.exe )。这里要介绍的是一个专门为 Windows 操作系统设计的 Subversion 客户端: TortoiseSVN (以下简称 TSVN )。

9.1 安装 TortoiseSVN

. http://tortoisesvn.tigris.org/ 下载最新的安装程序,比如TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。安装完成后会要求你重新开机。

. http://tortoisesvn.tigris.org/ 下载简体中文的语言包(language pack),请注意语言包的版本应该要跟你安装的 TSVN 版本相同,否则最好不要安装。语言包装完之后,用资源管理器在Windows 桌面上或任何一个文件夹点一下滑鼠右键,选择 TortoiseSVN -> Settings,在 "Main" 页夹中更改 Language 设定为「中文(简体)」,再按「确定」钮即可。

. 如果你是透过 proxy server 存取 Internet,请在 TSVN 的设定窗口中,切到「网络」页面,然后输入你的 proxy server 相关信息,否则你将无法存取位于 Internet 上的文件库。

安装完成之后,在任何目录名称上点一下滑鼠右键都可以看到 TSVN 的功能选项,这也是 TSVN 方便的地方,它不用跟开发工具整合,而是跟操作系统整合在一起,这样不管你用什么开发工具,都可以轻松的使用 TSVN 来存取文件库。如果你希望在TSVN中使用Beyond Compare工具比较文件,则在客户端安装Beyond Compare后,在任意目录点鼠标右键,进入Tortoise-->Settings-->External Programs-->Diff Viewer/Merge Tool/Unified Diff Viewer,在External Programs中指定BC2.exe的路径即可。

 

接下来你可以用 TSVN 练习一下存取之前建立好的文件库,试着把你现有的项目引入文件库中,并且在客户端使用 TSVN 执行取出、存入、更新等动作。

TSVN 虽然是客户端工具,不过它也提供了建立文件库、以及引入、引出等功能,因此安装在服务器端也挺方便的。

这里顺便提几个客户端提交修改点时的注意事项:

? 要保证本地编译通过后方可提交,否则会导致其他人取下新版本后编译不过。

? 要一次性全部提交,即在项目的根目录下按右键选“SVN Commit”,若必须部分提交,则需要保证部分提交后其他人取下新版本后能编译通过。

? 提交时一定要在Message栏写上有效的说明信息,以便后续进行Patch提取,版本比较等。如果是修改了一个BUG然后提交,则需要将BUGID号和简单描述写到Message栏中。

? 不要提交无需进行版本控制的文件,比如编译产生的目标文件,备份文件,可执行文件,以及临时文件等。

? 如果提交失败,则很可能是文件冲突导致,即提交者同其他人同时修改了某文件,且其他人的修改点已经提交到了服务器,这时需要在项目的根目录下按右键选“SVN Update”,然后Merge修改点

 

10  设置 Subversion 随系统启动:

在命令行执行

svnserve --daemon --root E:\svn

服务启动,--daemon可简写为-d--root可简写为-r,可以建立一个批处理文件并放在windows启动组中便于开机就运行SVN服务(注意:这是临时打开的服务,命令执行后不能关闭窗口)

用后台服务的方式可以设置开机自动执行。

E:\Program Files\Subversion\bin>sc create svnservice binpath= "E:\Program Files\Subversion\bin\svnserve.exe --service -r E:\SVN"

可以在Sevices.msc来启动了。