You are on page 1of 267

深入浅出系列之二

——SubVersion

作者:风中叶

浪曦视频在线

2007 年 10 月 1 日
深入浅出系列之二_SubVersion 作者:风中叶

声明

此文档为免费资料,欢迎大家转载,阅读,转载时请保持

文档的完整性,作者不保证文档的完全正确,希望大家对其中

的错误进行更正并与我联系。在写作过程中,我参考了网上大

量的资料,并摘取了其中的一部分内容,在这里向这些资料的

作者表示深深的感谢,如果您认为我侵犯了您的著作版权请告

之我,我会将相关内容删除并将结果通知您。

本文档仅代表作者本人的观点。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

目录
1 SubVersion 概述 ..................................................................................................................................4

2 SubVersion 基本概念 .......................................................................................................................... 7

3 SubVersion 实战 ................................................................................................................................ 18

4 SubVersion 高级操作 ........................................................................................................................ 66

5 SubVersion 整合 Apache ..................................................................................................................99

6 SubVersion 整合 Apache 高级操作 ...............................................................................................137

7 SubVersion 整合 Eclipse .................................................................................................................169

8 SubVersion 整合 NetBeans .............................................................................................................250

9 SubVersion 整合 Visual Studio.NET .............................................................................................257

10 后记 ................................................................................................................................................267

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

1 SubVersion 概述

版本控制之于程序员,就好比安全网之于高空秋千表演者。知道安全网
就在那里,万一自己摔落它能够提供保护,高空秋千表演者才能放心大胆地
在空中飞跃。同样,版本控制使您有能力去冒以往想都不敢想的风险。如果
哪儿出了错,您总是可以使自己的代码回复到一个已知的、工作正常的版本。
您可以在不触及主干的分支中进行试验,而不会影响到其他小组成员。在已
经发布的产品的较老版本中发现 bug 时,您可以轻松检出特定版本,以确认、
修订,并生成该 bug 的修补程序。如果没有版本控制,您必须极为慎之又慎,
缓慢地推进,总而言之,生产力会更低。

Subversion 是一种开放源码的全新版本控制系统,支持可在本地访问或
通过网络访问的数据库和文件系统存储库。不但提供了常见的比较、修补、
标记、提交、回复和分支功能性,Subversion 还增加了追踪移动和删除的能
力。此外,它支持非 ASCII 文本和二进制数据,所有这一切都使 Subversion
不仅对传统的编程任务非常有用,同时也适于 Web 开发、图书创作和其他
在传统方式下未采纳版本控制功能的领域。

在开放源码程序员间,CVS 已成为一种事实上的 标准。Codehaus、


Sourceforge 和 Java™ 社区的 java.net 等站点中驻留的免费 CVS 使得为
开源项目建设存储库更为简单。以 CVS 为中心,已发展起一个大型的附件
市场,包括 TortoiseCVS、WinCVS 等工具。

与其他版本控制系统相比,CVS 最令人称道的地方就是其非锁定存储库,
这使多个开发人员能够同时检出同一个文件。CVS 在提交时解决冲突问题,
这就避免了冲突成为发展的瓶颈。CVS 第二个出色的特性就是它是一种网络
存储库。处于许多不同系统上的程序员可以通过公共的 Internet 访问相同的
存储库。

CVS 在过去的十年中,为社区提供了优质的服务,但它陈旧的劣势开始
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

体现出来。首先,它实际上仅能处理 ASCII 文件。Unicode 文件会令 CVS


严重混乱。此外,CVS 存储库更改起来极为困难。CVS 没有任何关于 ―移
动‖ 操作的概念。它只能注意到,一个文件在一处被删除了,而在一个新位
置创建了另外一个文件。由于它不会连接两个操作,因此也很容易使文件历
史轨迹丢失。设置 CVS 存储库时,您必须非常谨慎地为每个文件选择准确
的位置,因为在设置之后,您几乎就要一直使用这个位置了。

在开源软件世界,并行版本系统(CVS)一直是版本控制长久以来的唯
一选择。事实证明,这是个正确的选择。CVS 本身是自由软件,不加限制的
处事风格,对网络化操作的支持(众多身处不同地方的程序员可以共享他们
的工作)
,都非常符合开源世界的协作精神。CVS 和它半混乱状态的开发模型
已成为开源文化的基石。

但是,和其它许多工具一样,
CVS 开始显露出衰老的迹象。
而 Subversion,
正是以 CVS 继任者的面目出现的新型版本控制系统。Subversion 的设计者们
力图通过两方面的努力赢得 CVS 用户的青睐:保持构建开源软件版本控制系
统的方式(以及视觉和感觉上)与 CVS 尽可能类似,同时尽力弥补 CVS 许
多显著的缺陷。这些努力的结果使得从 CVS 迁移到 Subversion 不需要做出
重大的变革,Subversion 确实是非常强大、非常有用和非常灵活的工具。

CVS 已经不再适合现代开发,这一点越来越明显。特别是 CVS 只能满


足老式 C 程序员的 ASCII 需求,而对 Web 开发人员和其他非传统用户来
说,CVS 实际上根本不起作用。在您开始考虑存储整个 Web 站点时,在
CVS 中,将文件从一个目录移动到另外一个目录是关键考虑事项。因此,在
几年前,许多核心 CVS 开发人员认为,已经到了利用他们多年来使用 CVS
时学到的经验和教训、从头开始创建新一代开放源码存储库的时机。在 2004
年年初,他们的努力结出了丰硕的果实,那就是 Subversion 1.0。

程序员(特别是那些依赖版本控制的程序员)是一个非常谨慎的群体,
Subversion 着实用了很长一段时间,才得到他们的广泛接受。很少有程序员
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

愿意冲在易于流血的最前沿,即便是他们已经因为 CVS 受了伤。甚至是在


Subversion 变得可靠之后,仍然用了好几年的时间,所有第三方编辑器、IDE
和文档规范才相继跟进。而 Subversion 依然在不断改进,Eclipse,NetBeans
等第三方工具现在已经有了足够好的 Subversion 支持。逐渐地,新项目也
纷纷选择 Subversion 满足其版本控制需求,而老项目正在向 Subversion
移植。最近,Apache Software Foundation 已移植到 Subversion。已实现
移植的项目包括 Xerces XML 解析器、Apache HTTP Server 等。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

2 SubVersion 基本概念

SubVersion 的基本概念与 CVS 类似,如果大家已经理解了 CVS 的基本


概念,那么理解 SubVersion 的概念将非常容易。

版本库:Subversion 是一种集中的分享信息的系统,它的核心是版本库,
它储存所有的数据,版本库按照文件树形式储存数据—包括文件和目录。任
意数量的客户端可以连接到版本库,读写这些文件。通过写,别人可以看到
这些信息,通过读数据,可以看到别人的修改。

实际上,版本库是另一种文件服务器,而不是你常见的那一种。最特别
的是 Subversion 会记录每一次的更改,不仅针对文件也包括目录本身,包括
增加、删除和重新组织文件和目录。

当一个客户端从版本库读取数据时,通常只会看到最新的版本,但是客
户端也可以去看以前的任何一个版本。举个例子,一个客户端可以发出这样
的历史问题“上个星期四的目录是怎样的?”或是“谁最后一个更改了这个
文件,更改了什么?”
,这些是每一种版本控制系统的核心问题:系统是设计
来记录和跟踪每一次改动的。

版本模型:版本控制系统的核心任务是提供协作编辑和数据共享,但是
不同的系统使用不同的策略来达到目的。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

文件共享问题:所有的版本控制系统都需要解决这样一个基础问题:怎
样让系统允许用户共享信息,而不会让他们因意外而互相干扰?版本库里意
外覆盖别人的更改非常的容易。考虑下图的情景,我们有两个共同工作者,
Harry 和 Sally,他们想同时编辑版本库里的同一个文件,如果首先 Harry 保
存它的修改,过了一会,Sally 可能凑巧用自己的版本覆盖了这些文件,Harry
的更改不会永远消失(因为系统记录了每次修改)
,Harry 所有的修改不会出
现在 Sally 的文件中,所以 Harry 的工作还是丢失了—至少是从最新的版本中
丢失了—而且是意外的,这就是我们要明确避免的情况!

锁定-修改-解锁 方案:许多版本控制系统使用锁定-修改-解锁这种机制
解决这种问题,在这样的模型里,在一个时间段里版本库的一个文件只允许
被一个人修改。首先在修改之前,Harry 要“锁定”住这个文件,锁定很像是
从图书馆借一本书,如果 Harry 锁住这个文件,Sally 不能做任何修改,如果
Sally 想请求得到一个锁,版本库会拒绝这个请求。在 Harry 结束编辑并且放
开这个锁之前,她只可以阅读文件。Harry 解锁后,就要换班了,Sally 得到
自己的轮换位置,锁定并且开始编辑这个文件。下图 “锁定-修改-解锁 方案”
描述了这样的解决方案。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

锁定-修改-解锁模型有一点问题就是限制太多,经常会成为用户的障碍:

1.锁定可能导致管理问题。有时候 Harry 会锁住文件然后忘了此事,这


就是说 Sally 一直等待解锁来编辑这些文件,她在这里僵住了。然后 Harry 去
旅行了,现在 Sally 只好去找管理员放开锁,这种情况会导致不必要的耽搁和
时间浪费。

如果 Harry 编辑一个文件的开始,
2.锁定可能导致不必要的线性化开发。
Sally 想编辑同一个文件的结尾,这种修改不会冲突,设想修改可以正确的合
并到一起,他们可以轻松的并行工作而没有太多的坏处,没有必要让他们轮
流工作。

3.锁定可能导致错误的安全状态。假设 Harry 锁定和编辑一个文件 A,同


时 Sally 锁定并编辑文件 B,如果 A 和 B 互相依赖,这种变化是必须同时作
的,这样 A 和 B 不能正确的工作了,锁定机制对防止此类问题将无能为力,
从而产生了一种处于安全状态的假相。很容易想象 Harry 和 Sally 都以为自己

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

锁住了文件,而且从一个安全,孤立的情况开始工作,因而没有尽早发现他
们不匹配的修改。

拷贝-修改-合并 方案:Subversion,CVS 和一些版本控制系统使用拷贝


-修改-合并模型,在这种模型里,每一个客户联系项目版本库建立一个个人工
作拷贝——版本库中文件和目录的本地映射。用户并行工作,修改各自的工
作拷贝,最终,各个私有的拷贝合并在一起,成为最终的版本,这种系统通
常可以辅助合并操作,但是最终要靠人工去确定正误。

这是一个例子,Harry 和 Sally 为同一个项目各自建立了一个工作拷贝,


工作是并行的,修改了同一个文件 A,Sally 首先保存修改到版本库,当 Harry
想去提交修改的时候,版本库提示文件 A 已经过期,换句话说,A 在他上次
更新之后已经更改了,所以当他通过客户端请求合并版本库和他的工作拷贝
之后,碰巧 Sally 的修改和他的不冲突,所以一旦他把所有的修改集成到一起,
他可以将工作拷贝保存到版本库,下图 “拷贝-修改-合并 方案”展示了这一
过程。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

但是如果 Sally 和 Harry 的修改交迭了该怎么办?这种情况叫做冲突,这


通常不是个大问题,当 Harry 告诉他的客户端去合并版本库的最新修改到自
己的工作拷贝时,他的文件 A 就会处于冲突状态:他可以看到一对冲突的修
改集,并手工的选择保留一组修改。需要注意的是软件不能自动的解决冲突,
只有人可以理解并做出智能的选择,一旦 Harry 手工的解决了冲突—也许需
要与 Sally 讨论—它可以安全的把合并的文件保存到版本库。

拷贝-修改-合并模型感觉是有一点混乱,但在实践中,通常运行的很平稳,
用户可以并行的工作,不必等待别人,当工作在同一个文件上时,也很少会
有交迭发生,冲突并不频繁,处理冲突的时间远比等待解锁花费的时间少。

最后,一切都要归结到一条重要的因素:用户交流。当用户交流贫乏,
语法和语义的冲突就会增加,没有系统可以强制用户完美的交流,没有系统
可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突,
实践中,锁定除了约束了生产力,并没有做什么事。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

什么时候锁定是必需的

锁定-修改-解锁模型被认为不利于协作,但有时候锁定会更好。

拷贝-修改-合并模型假定文件是可以根据上下文合并的:就是版本库的文件主要
是以行为基础的文本文件(例如程序源代码)。但对于二进制格式,例如艺术品
或声音,在这种情况下,十分有必要让用户轮流修改文件,如果没有线性的访问,
有些人的许多工作就最终要被放弃。

尽管 CVS 和 Subversion 一直主要是拷贝-修改-合并系统,它们都意识到了需


要锁定一些文件,并且提供这种锁定机制。

工作拷贝:一个 Subversion 工作拷贝是你本地机器一个普通的目录,保


存着一些文件,你可以任意的编辑文件,而且如果是源代码文件,你可以像
平常一样编译,你的工作拷贝是你的私有工作区,在你明确的做了特定操作
之前,Subversion 不会把你的修改与其他人的合并,也不会把你的修改展示
给别人,你甚至可以拥有同一个项目的多个工作拷贝。

当你在工作拷贝作了一些修改并且确认它们工作正常之后,Subversion
提供了一个命令可以“发布”你的修改给项目中的其他人(通过写到版本库),
如果别人发布了各自的修改,Subversion 提供了手段可以把这些修改与你的
工作目录进行合并(通过读取版本库)

一个工作拷贝也包括一些由 Subversion 创建并维护的额外文件,用来协


助执行这些命令。通常情况下,你的工作拷贝每一个文件夹有一个以.svn 为
名的文件夹,也被叫做工作拷贝管理目录,这个目录里的文件能够帮助
Subversion 识别哪一个文件做过修改,哪一个文件相对于别人的工作已经过
期了。

一个典型的 Subversion 的版本库经常包含许多项目的文件(或者说源代


码)
,通常每一个项目都是版本库的子目录,在这种安排下,一个用户的工作
拷贝往往对应版本库的一个子目录。

举一个例子,你的版本库包含两个软件项目,paint 和 calc。每个项目在
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

它们各自的顶级子目录下,如下图“版本库的文件系统”

为了得到一个工作拷贝,你必须检出(check out)版本库的一个子树,
(术
语“check out”听起来像是锁定或者保存资源,实际上不是,只是简单的得
到一个项目的私有拷贝)
,之后你有了一个/calc 的个人拷贝,有一个附加的目
录—.svn—保存着前面提及的 Subversion 需要的额外信息。

版本库的 URL:Subversion 可以通过多种方式访问—本地磁盘访问,或


各种各样不同的网络协议,但一个版本库地址永远都是一个 URL,下表“版
本库访问 URL”描述了不同的 URL 模式对应的访问方法。

模式 访问方法

file:/// 直接版本库访问(本地磁盘)

http:// 通过配置 Subversion 的 Apache 服务器的 WebDAV 协议。

https:// 与 http://相似,但是包括 SSL 加密。


svn:// 通过 svnserve 服务自定义的协议。

svn+ssh:// 与 svn://相似,但通过 SSH 封装。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

提交(commit):假定你修改了 button.c,因为.svn 目录记录着文件的


修改日期和原始内容,Subversion 可以告诉你已经修改了文件,然而,在你
明确告诉它之前,Subversion 不会将你的改变公开。将改变公开的操作被叫
做提交(committing,或者是 checking in)修改到版本库。发布你的修改给
别人,你可以使用 Subversion 的提交(commit)命令

更新(update):假设你有个合作者,Sally,她和你同时取出了/calc 的
一个工作拷贝,
你提交了你对 button.c 的修改,
Sally 的工作拷贝并没有改变,
Subversion 只在用户要求的时候才改变工作拷贝。要使项目最新,Sally 可以
要求 Subversion 更新她的工作备份,通过使用更新(update)命令,将结合
你和所有其他人在她上次更新之后的改变到她的工作拷贝。svn update 命令
的输出表明 Subversion 更新了 button.c 的内容,注意,Sally 不必指定要更
新的文件,subversion 利用.svn 以及版本库的进一步信息决定哪些文件需要
更新。

修订版本(revision):一个 svn commit 操作可以作为一个原子事务操


作发布任意数量文件和目录的修改,在你的工作拷贝里,你可以改变文件内
容、删除、改名和拷贝文件和目录,然后作为一个整体提交。

在版本库中,每一次提交被当作一次原子事务操作:要么所有的改变发
生,要么都不发生,Subversion 努力保持原子性以应对程序错误、系统错误、
网络问题和其他用户行为。

每当版本库接受了一个提交,文件系统进入了一个新的状态,叫做一次
修订(revision),每一个修订版本被赋予一个独一无二的自然数,一个比一
个大,初始修订号是 0,只创建了一个空目录,没有任何内容。

下图可以更形象的描述版本库,
想象有一组修订号,
从 0 开始,
从左到右,
每一个修订号有一个目录树挂在它下面,每一个树好像是一次提交后的版本
库“快照”

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

全局修订号

不像其他版本控制系统,Subversion 的修订号是针对整个目录树的,而不是单
个文件。每一个修订号代表了一次提交后版本库整个目录树的特定状态,另一种
理解是修订号 N 代表版本库已经经过了 N 次提交。 当 Subversion 用户讨论
“foo.c
的修订号 5”时,他们的实际意思是“在修订号 5 时的 foo.c”。需要注意的是,
修订号 N 和 M 并不一定表示一个文件不同。而 CVS 使用每一个文件一个修订号
的策略。

需要特别注意的是,工作拷贝并不一定对应版本库中的单个修订版本,
他们可能包含多个修订版本的文件。举个例子,你从版本库检出一个工作拷
贝,最近的修订号是 4:

calc/Makefile:4

integer.c:4

button.c:4

此刻,工作目录与版本库的修订版本 4 完全对应,
然而,
你修改了 button.c
并且提交之后,假设没有别的提交出现,你的提交会在版本库建立修订版本 5,
你的工作拷贝会是这个样子的:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

calc/Makefile:4

integer.c:4

button.c:5

假设此刻,Sally 提交了对 integer.c 的修改,建立修订版本 6,如果你使


用 svn update 来更新你的工作拷贝,你会看到:

calc/Makefile:6

integer.c:6

button.c:6

Sally 对 integer.c 的改变会出现在你的工作拷贝,你对 button.c 的改变还


在,在这个例子里,Makefile 在 4、5、6 修订版本都是一样的,但是 Subversion
会把他的 Makefile 的修订号设为 6 来表明它是最新的,所以你在工作拷贝顶
级目录作一次干净的更新,会使得所有内容对应版本库的同一修订版本。

工作拷贝如何追踪版本库:对于工作拷贝的每一个文件,Subversion 在
管理区域.svn/记录两项关键的信息:

1.工作文件所作为基准的修订版本(叫做文件的工作修订版本)

2.一个本地拷贝最后更新的时间戳。

给定这些信息,通过与版本库通讯,Subversion 可以告诉我们工作文件
是处与如下四种状态的那一种:

未修改且是当前的 :文件在工作目录里没有修改,在工作修订版本之后
没有修改提交到版本库。svn commit 操作不做任何事情,svn update 不做任
何事情。

本地已修改且是当前的 :在工作目录已经修改,从工作修订版本之后没
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

有修改提交到版本库。本地修改没有提交,因此 svn commit 会成功的提交,


svn update 不做任何事情。

未修改且不是当前的了: 这个文件在工作目录没有修改,但在版本库中
已经修改了。这个文件最终将更新到最新版本,成为当时的公共修订版本。
svn commit 不做任何事情,svn update 将会取得最新的版本到工作拷贝。

本地已修改且不是最新的: 这个文件在工作目录和版本库都得到修改。
一个 svn commit 将会失败,这个文件必须首先更新,svn update 命令会合
并公共和本地修改,如果 Subversion 不可以自动完成,将会让用户解决冲突。

这看起来需要记录很多事情,但是 svn status 命令可以告诉你工作拷贝


中文件的状态。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

3 SubVersion 实战
在讲 述完 SubVersion 的基 本概 念和 基本 理论 后, 让我 们开 始 进 入
SubVersion 实战阶段,通过实际动手操作来学习这个强大的版本控制系统的
具体使用与原理。

SubVersion 与 CVS 一样,也是很典型的 C/S 系统(客户端/服务器),


所以在使用前我们需要下载安装相应的服务器端和客户端软件。

浏览器地址栏中打开如下地址:http://subversion.tigris.org/

点击左边的 Downloads 链接

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

滑动鼠标到该页下面

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

点击:Win32 packages built against Apache 2.0(注意:此处请不要选


择下面的 Apache2.2,原因我后面会讲解)

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

出现上图的下载页面,选择 svn-1.4.4-setup.exe,该文件是 SubVersion 的安


装版本,当然你也可以选择解压缩版本,解压缩版本不需要安装。点击该链
接出现下载对话框,保存该文件。

下载完毕后双击该文件进行安装,该安装过程与一般的软件没有任何区
别,选择默认即可,一路回车,最后完成。这样我们的 SubVersion 服务器端
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

软件就安装完毕了。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们到 SVN 安装目录下去看看

其中有一个 BIN 目录,SVN 的所有可执行命令都在该目录下

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这里面有很多 exe 文件,之后我们就要学习这些命令的使用方法。

注意:SVN 的命令是基于命令行的,所以我们不能直接双击这些命令来
执行他们,我们需要到命令行窗口去执行他们。

SVN 的服务器端软件同样包含了客户端执行的一些命令,我们可以利用
这些命令来完成我们日常的版本控制管理工作。

与 CVS 的使用方式一样,我们首先需要在服务器端建立仓库(repository)。

在安装完毕 SVN 后,
他会将安装目录中的 BIN 目录加入到系统 path 中,
可以通过右键点击我的电脑,选择高级—>环境变量,查看 path 环境变量的
值。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图,我们可以看到 BIN 目录已经增加到 path 环境变量里面了,这样我


们在利用命令行使用 SVN 的命令时就不必每次都转到他的安装目录了,方便
了我们的使用。
如果有的人安装完毕后在 path 环境变量中没有发现增加的值,
可以手动完成这个工作。

打开命令行窗口,输入 svn 命令

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

可以看到系统已经认出来 svn 的命令了

现在我们需要首先创建一个仓库(repository),假设我们的仓库创建位
置为:E:\svn\repository 目录下,我们需要先在硬盘上创建该目录。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

命令行输入:svnadmin create E:\svn\repository

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图,执行完命令后,SVN 没有给出任何信息,这说明我们的版本库已
经创建成功了,我们这时再到 E:\svn\repository 下去看看。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

可以看到 SVN 已经在该目录下生成了很多文件夹和文件,这些文件就是


SVN 进行版本管理时所需要的,我们在日常开发中是不会直接接触到这些文
件的。

现在服务器端的仓库已经创建成功了,接下来就是在客户端创建一个项
目,然后将该项目 import 到服务器端,将其纳入 SVN 的管理之下。不过在
创建项目之前我们首先需要启动服务器,服务器启动后才会进行网络侦听,
检查到客户端的相关命令请求。

在命令行中输入如下命令:svnserve –d –r E:\svn\repository,该命令含
义为让 SVN 将此目录作为仓库,并侦听客户端的请求。其中-d 的作用为后台
模式,而-r 的作用为指定服务器的仓库路径。

如图,当服务器启动后,请不要关闭该命令行窗口,否则也会把 svnserve
服务停下来,接下来的操作我们可以另外打开一个命令行窗口进行。

假设我们的客户端创建的项目在 E:\test\client,我们在该目录下创建一个

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

文件夹 child 和一个文件 test.txt,并在该文件中增加一些文本。

client 目录结构如下:

我们首先将命令行的当前目录转到 E:\test 目录下,在命令行中输入如下


命令:svn import svn://localhost,其中 svn://localhost 表示的是 SVN 服务器
的 ip 地址,这里就表示是我的本机地址。另外 SVN 实现了自己独有的协议
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

SVN 协议,所以我们可以看到 url 形式是 svn://localhost 这样的,这个命令的


作用就是将当前目录以及其所有子目录和文件 import 到服务器上去,纳入
SVN 的管辖范围中。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

执行完毕后我们发现该命令失败了

通过命令行的说明我们看到,该命令要求我们指定好一个记录日志的文件或
者在系统环境变量中增加一个 SVN_EDITOR 的变量。二者选一就可以了,
那么我们可以增加一个 SVN_EDITOR 的环境变量。该变量的值我们就取为
系统自带的记事本就可以了。方法同前述查看 path 环境变量一样。

点击确定即可。

现在我们再一次运行之前的 import 命令

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们发现命令依然失败,并且失败的原因与刚才一样。其实这是由于我
们修改了系统环境变量后还是使用当前的命令行窗口造成的。当修改了环境
变量后一定要重新打开一个新的命令行窗口,这样修改才会生效。

现在我们打开一个新的命令行窗口,重复执行方才的命令,不要忘记将
当前目录转到 E:\test 目录下

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

输入命令

当我们输入命令回车后,出现这个信息窗口,这证明了我们的环境变量
的增加是正确的,关闭这个窗口。出现以下窗口

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们选择 c,继续。

如图,出现认证失败的信息,这说明我们已经连接到了 SVN 服务器,不


过服务器认为我们的客户端没有相应的权限,所以这时我们改变一下 SVN 的
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

认证权限。

回到 SVN 仓库,即 E:\svn\repository 目录

我们发现这里面有一个 conf 目录,进入

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

用文本编辑器打开 svnserve.conf 文件

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到这里是关于访问 SVN 仓库的一些认证设定,找到第 12 行:


anon-access = read,这表示匿名用户的访问权限是读,并且大家注意到,该
行前面有一个警号:#。这表示该行是被注释掉的,这与 Java 的属性文件的
注释方式是一致的,这也就说明了此时 SVN 服务器是不允许匿名登录的,那
么我们现在可以将该行前的#号去掉。

不过现在客户端也只可以匿名读,我们的 import 操作是写操作,所以我


们在该行下增加一行 anon-access = write,如图:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

保存,关闭该文件。

这时我们需要停止之前的 svnserve 的服务,然后重新启动,让它接受我


们的改变,转到它的命令行窗口,用 ctrl+c 停止它,再重新启动。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

现在回到之前的命令行窗口,重新执行 import 命令。

仍然选择继续

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,大家可以看到,我们的 import 操作成功执行了。已经增加了三项,


分别是 client,child 和 text.txt。

大家一定觉得这样很繁琐吧,其实我之所以把错误让大家看到就是让大
家知其然还知其所以然,遇到错误不可怕,关键是要找到解决错误的办法,
我相信大家到现在对于 import 操作应该印象深刻了吧。

接下来,我们在本机再建一个目录,位置为 E:\test2\client2,再里面创建
一个文件夹 child2 和一个文本文件 test2.txt,在 test2 中输入一些文本,如图:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

目录结构如下:

打开命令行,执行以下命令:svn mkdir svn://localhost/project2

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

关闭弹出来的日志窗口,继续

OK,执行成功。该命令的作用是在服务器端创建一个虚拟目录 project2.
今后我们的项目可以 import 到该目录下,现在我们就开始这个操作。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

将命令行窗口定位到 E:\test2 目录下

执行以下命令:svn import svn://localhost/project2

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,执行成功了,这时我们可以到 E:\svn\repository 目录下去看看,我


们发现这与 CVS 很不一样,我们现在看不到我们 import 的文件和目录在什
么地方,实际上这都由 SVN 替我们做好了,我们不用去关心他了

好了,import 操作我们掌握好了之后,下面开始 checkout 操作,该操作


与 CVS 一样,就是将服务器上的一个模块检出到本地,作为一个工作拷贝。

另外,大家可能注意到,每次执行一次 SVN 命令后,都会弹出一个窗口,


很不方便,这就是由于我们之前设置的 SVN_EDITOR 环境变量造成的,所
以现在我们把该环境变量删除,不过删除后我们的命令就不能执行成功了,
原因在前面我们已经遇到了,就是会出现如下信息:

不过我们可以采用提示中的另一种方法,就是建立一个日志文件,然后
输入命令时指定这个日志文件就可以了,不过这样的话就要求我们每次输入
命令时都需要指定这个日志文件的位置,所以到底用哪种方式就看大家的喜
好了。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,我们在 C 盘下简历一个文本文件作为日志文件 log.txt,内容为空。

并且删除 SVN_EDITOR 环境变量

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

删除该环境变量

在 E 盘下新建一个目录 myclient 作为检出的项目的存放目录。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

将 命 令 行 当 前 目 录 转 到 该 目 录 , 输 入 如 下 命 令 : svn checkout

svn://localhost/project2

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,命令执行成功。到 myclient 目录下去看看。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

进入 project2

进入 client2

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

大家可以看到,我们已经成功检出了之前 import 的项目了。并且每一个


文件夹下都有一个.svn 的隐藏文件夹,这与 CVS 是类似的,是 SVN 记录文
件版本的文件,我们不要改动或者删除他们。

OK,现在我们开始练习使用 commit 与 update 命令,先来看 commit

我们将 test2.txt 文件进行一些修改

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

保存,关闭。

打开一个新的命令行窗口,转到 E:\myclient\project2\client2 目录下:输


入命令:svn commit test2.txt,回车。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图:出现以上信息,说明我们的工作拷贝已经被锁定了,不能提交。

根据提示,我们清除锁定,输入:svn cleanup

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

现在已经解锁了,我们再次执行提交命令

如图,又出现一个新错误,根据提示我们看到,错误提示我们没有指定
日志文件位置,原因在于我们已经将 SVN_EDITOR 环境变量删除了。好,
那么现在我们指定之前建立的日志文件 C:\log.txt.

重新执行以下命令:svn commit test2.txt –F c:\log.txt

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,我们看到 commit 命令终于执行成功了。我相信经过这次操作,大


家对于 commit 命令已经熟练掌握了。

我们到 E:\svn\repository\db\revs 目录下去看看,这是 SVN 服务器的目


浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

用文本编辑器打开 4 这个文件

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到实际上我们的当前版本的所有文件的信息都在这里面了,这种
管理文件的方式与 CVS 是有较大差异的。

下面练习使用 update 命令,在当前目录下执行 svn update test2.txt。注


意,由于 update 不是对服务器进行写操作,而是从服务器取文件,即读操作,
所以不需要加上 –F C:\log.txt 选项,这点一定要注意。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

执行完毕后

由于文件没有修改,所以我们看到执行成功后,本地文件没有发生任何
变化。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这样我们现在就已经将 SVN 日常最常用的操作进行了讲解和演示,下面


我们从 JBOSS 的站点将它的项目 checkout 下来,加深体会 SVN 的命令使
用。

在浏览器地址栏输入如下网址:http://labs.jboss.com/jbossas/

我们进入 JBOSS 应用服务器的项目页面。点击页面左边的 Anonymous


SVN 链接

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图我们可以看到其项目的页面,注意,此时地址栏的地址就是我们在
后面要 checkout 的地址。

我们现在本地 E 盘新建一个目录:JBOSS,作为检出项目的存放目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

讲命令行转到该目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

执行以下 SVN 命令:svn checkout


http://anonsvn.jboss.org/repos/jbossas/ ,这样我们就将开发中的 JBOSS 项
目检出到本地,可以读它的源代码。

上图表示正在进行检出的命令行状态,在检出完毕后我们到 JBOSS 目录
下去看看,会发现 JBOSS 项目已经被我们成功检出了。从这里我们也可以看
到,JBOSS 项目也是使用 SVN 进行的版本控制和管理。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

上图是 JBOSS 项目的根路径,大家可以自己查看其中的子目录与源代码。

大家可能会奇怪,为什么我们从 JBOSS 检出项目时,指定的 url 形式是


http://类型,而我们之前自己检出的项目 url 类型却是 svn://形式呢,大家不要
着急,我会在后面讲解他们之间不同的原因,主要是由于 JBOSS 项目将
Apache 与 SVN 进行了整合,这个工作我们自己也可以进行的。

进行到这里,我们对于 SVN 的基本命令的使用就暂时告一段落,其实


SVN 的命令远不止这些,不过大家在学会了基本的命令后,可以通过 SVN
的帮助来了解每一个命令的参数与使用方法。

在命令行输入:svn help

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图,大家可以看到 SVN 已经将所有的命令列出来了,对于每一个命令


的使用,大家可以相同的方式进行查阅。在命令行输入 svn checkout –help

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

大家可以看到,SVN 已经将 checkout 的使用方式详细列出来了。注意:


上面命令中 help 之前是连续两个-,大家要细心。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

4 SubVersion 高级操作
在我们之前的操作中,我们都是以匿名方式对 SVN 进行操作,也就是不
需要输入用户名和密码。对于读取操作来说,这是可以的,可是对于写入操
作来说就不能随便允许匿名用户 commit,否则项目会发生严重混乱。

在 CVS 中,服务器端可以要求客户端提供用户名与密码来登录,其中用
户名就是登录操作系统的用户名。在 SVN 中,同样提供了验证机制,不过用
户名是在文件中保存的,并不像 CVS 中那样需要提供操作系统的用户名,相
对来说,是一个很大的进步,降低了系统发生侵害的可能。

下面我就来讲述如何设定验证机制。

转到 SVN 资源库的目录:E:\svn\repository

进入 conf 目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图,打开 svnserve.conf 文件

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

大家可以阅读该文件的内容,会发现实际上该文件就是一个设定 SVN 认
证信息的重要文件,我们在之前已经对该文件进行了操作,增加了匿名用户
的访问权限。现在我们来增加需要授权才能访问的信息。

首先将之前匿名可以访问的部分删除,只能通过提供用户名和密码才能
访问 SVN。将 anon-access = read 与 anon-access = write 之前增加一个#号,
表示注释掉该部分。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

注释掉该部分

将 password-db = passwd 之前的#号删掉

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

取消改行的
注释

这表示用户的用户名与密码信息放置在同目录下的 passwd 文件中。


OK,
保存该文件,关闭它。

我们看到与 svnserve.conf 文件同目录就有一个 passwd 文件,他就是存


放用户信息的文件,用文本编辑工具打开它。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

根据上面的说明,我们知道该文件存放用户的登录名和密码,其中[users]
下就是该部分信息,形式为 username=password,此时 SVN 已经给我们两
个例子了,不过都被注释掉了,我们可以增加自己的登录信息。现在我们增
加两个用户,zhangsan 和 lisi,密码分别为 zhangsan123 和 lisi123

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

保存,关闭该文件,现在我们要使用用户登录信息来操作 SVN。

注意:在一次登录后,SVN 会将我们的登录信息保存起来存放在硬盘上
的文件中,其存放位置为:C:\Documents and Settings\[你的登录系统用户
名] \Application Data\Subversion,如果想要删除该信息,只需要将该目录
中的 auth 文件夹删除即可。

现在我们要进行 SVN 操作了,不过现在我们不使用之前的命令行方式了,


而是使用图形化方式,实际上,现在已经有了 Windows 下的 SVN 图形化操
作工具,它就是 TortoiseSVN.

之所以花很大篇幅讲述命令行操作方式,主要是希望读者可以更深刻理
解 SVN 的操作方式。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

TortoiseSVN 的下载地址如下:http://tortoisesvn.tigris.org

如图:点击页面上方的 Download 链接即可进行下载,安装方式也很简


单,与一般的 Windows 程序的安装方式一样,安装完毕后需要重新启动一下
机器。

TortoiseSVN 实际上是对 Windows 操作系统的文件夹增加的一个外壳,


大家用鼠标右键点击时会出现 TortoiseSVN 的操作快捷方式。

OK,下面我们开始 TortoiseSVN 的使用介绍。实际上如果大家对之前的命


令行方式理解比较好的话,对于 TortoiseSVN 的使用会很容易掌握的。

我们首先启动 SVN 的服务,如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

接下来在 E 盘的根目录下新建一个目录:import

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

进入 import 目录后我们新建一个目录 src 和一个文本文件 test.txt,并且


在 test.txt 中输入一些文本。

import 目录结构如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们在 import 目录上点击鼠标右键,会出现 TortoiseSVN 的命令菜单,


我们选择 TortoiseSVNimport 命令,这表示将该目录导入到服务器中,纳入
到 SVN 的管理之下。

出现如下界面:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

其中上面的输入框表示我们要将该目录导入的服务器地址,这里是
svn://localhost/import,其中加上 import 的作用是将该项目与 SVN 管辖的其
他项目分开,这样我们在 checkout 时就可以只 checkout 该项目而不必全部
都检出,当然你不必一定输入 import,可以输入任何名字都可以。下面的是
输入一些日志信息,可以省略。填好后的界面如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

点击确定。

OK,这时出现一个对话框,要求我们输入用户名和密码,这是因为我们之
前已经要求必须输入用户名与密码才能登录,其中登录信息保存在 SVN 仓库
中 conf 目录下的 passwd 文件中,如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们输入 zhangsan/zhangsan123,点击确定

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,出现 import 成功的信息。表示我们的操作是没有问题的。现在该


import 目录已经没有用处了,可以删掉了,接下来我们需要从服务器端将该
项目 checkout 出来。

首先在 E 盘下新建一个目录 hello,作为 checkout 项目的目录。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

直接在 hello 目录上点击右键或者进入 hello 目录后在空白处点击右键选


择 SVN Checkout

出现如下界面

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

其中上面的输入框就表示服务器的 url,这里我们填
写:svn://localhost/import 表示从方才 import 的目录中进行检出。下面的输入
框表示检出到哪里,默认情况下会被自动填写当前目录,即 E:\hello.

点击确定。

OK,出现上面的界面表示我们的 checkout 操作是成功的,已经从服务


器上将 import 目录下的文件和目录检出,这时我们回到 hello 目录看看。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

大家可以看到,目录 src 和文件 test.txt 已经被检出,并且上面还有一个


绿色的勾,这个绿色的勾就表示该文件或者目录是与服务器保持一致的,即
内容没有发生变化,可以看到 TortoiseSVN 这种标识文件和目录的方式非常
利于我们观察文件和目录的变化。

如果我们不想让匿名用户读我们 SVN 服务器上的文件该怎么办呢?因为


之前写操作是需要输入登录信息的,而读信息是不需要的。实际上我们可以
这样来设置。

打开 SVN 仓库中的 conf 目录下的 svnserve.conf 文件,我们增加一行

anon-access = none

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

增加一行

这表示匿名用户将没有权限读和写。实际上 SVN 默认将匿名用户的访问


权限设为读,而将登录用户权限设为写。这我们可以从上述文件的注释中了
解到。

接下来重新启动一下 SVN 的服务。让改变生效。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

现在在 E 盘再新建一个目录 langsin,作为我们 checkout 的存放目录

在该目录中进行 checkout 操作

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

点击确定

大家可以看到,TortoiseSVN 让我们输入登录信息,我们输入
zhangsan/zhangsan123 后就可以执行检出操作了。

注意:如果有的读者这个地方 TortoiseSVN 并没有提示输入登录信息,而是


直接将文件检出,那么说明你之前已经将登录信息保存起来了,我们到
C:\Documents and Settings\ 【 登 录 操 作 系 统 用 户 名 】 \Application
Data\subversion 目录下将保存登录信息的 auth 目录删除就可以了

OK,下面我们开始进行 commit 操作。首先修改 text.txt 文件为如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

增加了一行文字,保存,关闭。

我们再看看 hello 目录

大家可以发现,test.txt 文件已经发生了变化,由之前绿色的勾变成了红色
的感叹号,这表明该文件已经发生了更改,变的与服务器的文件不一样了,
这时我们更可以感受到 TortoiseSVN 带给我们的便捷了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

右键点击 test.txt,选择 SVN commit…

点击 OK。

又出现输入登录信息的对话框,再次输入用户名和密码,然后选择 Save
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

authentication,这样下次就不用再次输入了,其中 SVN 将我们的登录信息保


存在本地文件中,位置在前面已经说明了。输入完毕后点击 OK。

我们看到 commit 操作已经成功执行了,服务器的版本由之前的 5 变成了


6.

我们再回到 hello 目录,刷新一下。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到 test.txt 文件又变成了绿色的勾,表示已经与服务器一致了。

下面讲述 update 操作,右键点击 test.txt 选择 SVN update…

我们看到命令成功执行了,由于该文件没有发生变化,所以更新后也没

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

有发生变化。

下面进入 src 目录,新建一个文本文件:langsin.txt,并输入一些内容。

保存,关闭。

这时我们右键点击 langsin.txt,选择 TortoiseSVNAdd…

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

点击 OK.

可以看到命令成功执行了。

我们再回到 src 目录,刷新一下界面

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

看到 langsin.txt 变成了一个蓝色加号,这表明该文件已经增加到了 SVN


的管理中,不过此时还没有 commit,下面再对该文件进行 commit 操作。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

确定

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

命令成功执行,版本变成 7.

再次刷新 src 目录

可以看到 langsin.txt 文件又变成了绿色的勾。

现在我们在 langsin.txt 文件上右键选择 delete,执行后界面如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

可以看到该文件已经被删除了,不过要想影响到服务器,我们必须

commit

在 src 目录中的空白处右键 commit

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这表示将要把删除 langsin.txt 文件的信息提交到服务器端,确定。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到,
我们已经把删除 langsin.txt 的信息成功的提交到了服务器端。

现在不仅在客户端,而且在服务器端都不存在 langsin.txt 文件了。即使


你重新进行 checkout 操作也还是无法得到该文件了,也就是说该文件彻底被
删除了,除非你 checkout 时指定检出哪个最新的版本方可以得到该文件。

这是 SVN 优于 CVS 的一个地方,在 CVS 中即使你删除文件提交。在你重新


checkout 时依然可以得到该文件,也就是说你不可能彻底删除某一个文件。
这在实际项目中是非常不方便的。

我们仔细查看 TortoiseSVN 的命令菜单,发现实际上他们是完全对应于


SVN 的命令行命令的,也就是说他们是命令行的一个包装而已,所以说如果
大家对命令行方式操作比较熟练,使用 TortoiseSVN 是易如反掌的事情。

其余的命令大家可以自己动手实验,我就不再赘述了。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

5 SubVersion 整合 Apache
本章主要讲述 SVN 与 Apache 服务器整合的操作方法与过程。

Apache 是当今最流行的 web 服务器,在很多大型的门户网站得到了应


用。

注意:该 Apache 不是在 Java Web 开发中常用的 Tomcat

为了证实 Apache 使用的广泛性,我们首先使用 telnet 工具来进行测试。

打开命令行窗口,输入 telnet www.sohu.com 80 ,该命令表示使用


telnet 登录到 sohu 的站点。

确定

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

出现一个窗口,这表明我们已经成功的登录到了 sohu 的站点了,然后准


备一个记事本,在其中输入以下内容:

接下来将其中的内容拷贝,粘贴到命令行窗口中,连续输入两次回车,
出现如下视图:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,我们看到命令已经成功执行,服务器返回响应信息。注意到 sohu 使
用的服务器为 Apache1.3.33 版本。

接下来用同样的方式测试新浪的站点:www.sina.com.cn,得到如下响应:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们可以看到新浪使用的服务器为 Apache2.0.54。

从这里我们可以看到这两个大型的门户网站都是使用的 Apache 作为服


务器。

注意:使用 telnet 登录站点并输入相关信息得到响应是利用了标准的 http 协


议命令,对此不熟悉的读者可以参考一下 http 协议。

打开 Apache 的主页:www.apache.org

点击左边的 HTTP Server 链接

下载 2.0.x 版本(注意,请不要下载 2.2.x 版本,因为我们之前下载的


SVN 是对应到 Apache2.0 版本的)

Apache 分为安装方式和解压缩方式,这里我选择安装方式。并且我选择
的安装文件为 Apache2.0.59 版本
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我安装的版本

下载完毕后双击安装。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

出现上述界面需要大家输入一些信息,实际上输入任何信息都可以,并
且下面的单选请选择第一个,这样 Apache 占用了 80 端口,并被安装为系统
服务,如果读者机器上有其他应用占用了 80 端口,比如 IIS,请将其换为其
他端口。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

安装完毕图像如上,点击 Finish

这是我们发现状态栏右边已经出现了 Apache 的图标,双击

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们发现 Apache 已经自动运行起来了

开始运行,输入 services.msc,进入系统服务

Apache 服务

我们看到 Apache 已经被安装为系统服务,并且是自动运行,也就是在


系统启动时就开始运行

在浏览器输入:http://localhost

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到,我们已经可以访问 Apache 提供给我们的默认首页。

现在我们就开始将 Apache 与 SVN 进行整合,这样大家在输入 SVN 服


务器地址时就会形如 http://形式,
我们在之前访问 JBOSS 网站时已经见到过。

首先进入 SubVersion 的安装目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

进入 bin 目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

拷贝这两个文件

选中 mod_authz_svn.so 与 mod_dav_svn.so 两个文件,选择拷贝

进入 Apache 的安装目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

进入 modules 目录

将刚才选中的两个文件粘贴到这里

回到 Apache 安装目录的 conf 目录,进入

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

用文本编辑器打开 httpd.conf 文件,这个文件是 Apache 的配置文件,非


常重要。

找到第 145 行和 146 行。将前面的#号去掉,表示取消注释。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

去掉注释

转到 173 行,增加如下两行内容:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

LoadModule dav_svn_module modules/mod_dav_svn.so

LoadModule authz_svn_module modules/mod_authz_svn.so

表示将我们之前拷贝的模块导入到 Apache 中

转到该文件的最后,增加如下内容:

<Location /svn>

DAV svn

SVNPath E:/svn/repository

</Location>

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

该语句块的作用是将 svn 的服务器目录映射到访问 Apache 的虚拟路径 svn,


就好象我们在配置 Tomcat 时,增加一个 Context 一样。即用户访问/svn
地址时,Apache 会自动将该请求转到 E:\svn\repository 目录下。

重新启动 Apache

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

已经整合了
SVN

这时我们注意到 Apache 下面的状态栏已经增加了 SVN 的信息,这就表


明我们已经成功的将二者整合起来了。

在浏览器中输入如下地址:http://localhost/svn

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,我们看到我们现在已经成功的通过浏览器访问 SVN 仓库中的内容了。


点击各个项目的名称就可以进行查看了,这已经与之前 JBOSS 项目仓库的访
问方式一致了。

注意:在进行 SVN 与 Apache 整合时,一定要注意两者的版本匹配问题,否


则将会导致失败。

大家这时会发现即使我们在 SVN 中设置好了需要登录才能读取文件,但


是使用 Apache 方式通过浏览器依然不需要登录就可以浏览。这是由于 SVN
与 Apache 是采用不同的方式来控制访问权限的,如果你使用 svn 协议来访
问,那么就必须输入登录信息才能访问,而如果使用 http 协议就不需要输入
登录信息就可以访问。

实际上采用 Apache 方式有着比 SVN 更好的访问控制方式,


因为 Apache
已经成为一个相当成熟的 web 服务器。下面我们就来学习如何在 Apache 中
设置访问权限信息。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

打开 Apache 安装目录下的 conf 目录中的 httpd.conf 文件,转到文件的


最后

我们在</Location>之前输入如下信息。

AuthType Basic

AuthName "Subversion Repository"

AuthUserFile E:/passwd/passwords

Require valid-user

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这些信息的作用是:

1. AuthType 表示验证类型,这里我们采用 BASIC 即基本方式,也是最


常用的验证方式。
2. AuthName 表示出现登录对话框时,窗口的标题名。
3. AuthUserFile 表示用户登录信息的存放文件,这里我们将该文件保存
为 E:/passwd/passwords,目前该文件还不存在,不过不要着急,我们
稍后就会创建该文件。
4. Require valid-user 表示只有认证的用户才能访问,否则匿名用户也可
以访问。

OK,保存该文件,关闭它。接下来我们需要创建登录信息文件 passwords.

转到 Apache 的安装目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

进入到 bin 目录中,这里存放的是 Apache 的所有命令文件。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

注意到有这样一个可执行文件 htpasswd.exe 文件,它就是我们创建登录


信息的文件,不过该命令不能通过直接双击的方式执行,而是需要通过命令
行的方式执行。

为了方便命令的使用,我们将 bin 目录加到系统的 path 环境变量中,否


则每次都需要将命令行定位到该目录下才能执行该命令。

点击确定,打开一个新的命令行窗口。

我们在命令行输入命令:htpasswd

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

可以看到,系统已经认出来该命令了。OK,下面让我们开始登录信息的创

我们可以参照 htpasswd 的命令选项来决定我们创建用户的命令。

在前面的配置中,我们知道我们将把存放用户名与密码的文件放在
E:/passwd/passwords,即 E 盘 passwd 目录下的 passwords 文件中。那么
首先我们需要在 E 盘根目录下创建名字叫 passwd 的文件夹。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

然后在命令行输入:htpasswd –c E:/passwd/passwords hello

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

出现如下提示

我们看到该命令已经成功执行,其中参数-c 的作用就是 create,即创建


一个新文件,因为在这之前 passwords 文件还并不存在,所以我们需要首先
创建它。而后面的文件路径就表示创建文件的位置以及文件名,这里叫
passwords,要注意的是其父目录 passwd 一定要事先创建好,否则 htpasswd
命令会报错。最后的 hello 表示我们将要创建一个用户名为 hello 的用户。

接下来的提示要求输入 hello 用户的密码,其中密码默认使用 MD5 方式


加密。

我们在这里输入 world 作为密码,并再确定一次。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,我们看到我们创建的第一个用户已经成功了,现在到目录 passwd
看下

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

用户信息文件已经创建好,用文本编辑器打开。

我们看到 hello 用户的密码已经是加密过的了,并且同样的密码加密后都


是不一样的,现在我们再创建一个用户 google,密码也为 world。方式同前。

在命令行输入:htpasswd E:\passwd\passwords google

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

因为该用户信息文件之前已经创建好,所以这里不必再使用-c 参数。

我们看到命令执行成功了,打开 passwords 文件看看


浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到 hello 与 google 两个用户的密码完全相同,都为 world,但是生


成的加密后的密码却是不同的,这有效的保证了系统用户信息的安全。

接下来,我们再创建一个用户 microsoft,密码也为 world。使用如下命


htpasswd –p E:/passwd/passwords Microsoft

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

其中-p 参数表示密码不使用加密方式,而是采用通常的字符文本方式,
即明文。

命令成功执行了,我们再来看看 passwords 文件。


浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到用户 microsoft 的密码为 world,即为不加密的方式。

在实际使用当中,这种明文方式很少使用,在这里只是起到演示的作用。

好,现在关闭 passwords 文件,重启 Apache 服务器。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

在浏览器地址栏输入 http://localhost/svn

我们看到这时出现认证窗口,只有输入有效的用户名与密码才能登录成
功,并且登录窗口的标题为:Subversion Repository 就是我们方才在

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

httpd.conf 文件中设定的 AuthName 值。

现在输入我们刚才建的用户信息:hello/world 并确定

我们看到,输入合法的用户信息后,用户就可以成功登录,并查看 SVN
仓库中的项目信息了。

现在让我们用 http 方式进行 svn 浏览,使用 TortoiseSVN 工具。

在 E 盘下新建一个目录 http

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

在 http 里面使用 TortoiseSVN 进行浏览

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

出现的窗口中输入仓库地址:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

输入 google/world 进行登录。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图,可以查看服务器端所有仓库的文件和目录。与我们之前使用 svn
协议时一样。我们也同样可以进行 checkout

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

可以看到命令成功执行了。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

6 SubVersion 整合 Apache 高级操作


有些时候我们在 SVN 服务器中有很多项目,不同的项目存放在不同的目
录下,如果用 SVNPath E:/svn/repository 来指定的话将会非常不方便,因为
这种方式只能指定一个目录,如果要包含所有项目,那就只能指定仓库的根
目录了,所以就有了 SVNParentPath 的出现。

顾名思义,SVNParentPath 指的是仓库的根目录,也就是所有项目的根
路径,那么在我们这里 SVNParentPath 就应该是 E:/svn/repository,然后我
们可以将自己的项目分别建立在这里目录之下的不同子目录中,而不必都建
在这个根目录之下,这对后面即将讲到的分级权限认证也有很大帮助。

打开 httpd.conf 文件,找到后面的 Location 部分。

将 SVNPath 改为 SVNParentPath,其他不变,保存,关闭。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

重启 Apache

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们用 TortoiseSVN 访问仓库。

这时我们发现我们更改后已经无法浏览仓库内容了,这是由于我们之前
创建的仓库都是以 repository 为根路径的,所以一旦将它改成 ParentPath 后
就无法正常访问了。实际上,在公司里,我们要 import 一个项目到 SVN 上,
一般都不会 import 到根目录中,而是 import 到项目特定的目录中,这样当从
SVN 中检出时我们也只会检出特定的项目,而不是将 SVN 中所有的项目全
部检出来,因为仓库中可能有很多个其他项目。

OK,现在我们就来实践一下。

在 E:\svn\repository 下新建一个仓库。首先建立一个目录:subsvn

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

然后在 subsvn 下新建一个仓库,方式同前,采用命令行方式,在命令行


中输入如下命令:svnadmin create E:\svn\repository\subsvn

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,仓库创建成功。接下来我们要 import 项目到该子仓库中。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

创建一个目录 try,然后在其下建立一个目录和一个文件,方式同前,并
在文件中输入一些文字。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

将 try 目录 import 到 SVN 上去

请注意,要在路径后加一个子目录 subsvn,意味着 import 到 SVN 上的


浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

一个子仓库 subsvn 中。

OK,我们看到 import 操作成功完成。采用 SVNParentPath 方式,当我们


新建仓库时也并不需要重启 Apache 服务器,因为 SVNParentPath 指定的路
径就是仓库的父目录,我们可以通过浏览器查看刚才 import 的项目。这里注
意地址:
http://localhost/svn/subsvn,如果输入 http://localhost/svn,则无权限访
问,因为默认情况下我们只能访问其中的子仓库。当然可以使用 php 等语言
改变成我们可以访问。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

访问成功进行。

可见采用 Apache 来管理 SVN 是多么的方便。

如果想让用户可以读仓库中的文件,而不能写内容到仓库中,比如不能
commit 到仓库中该怎么办呢?回想我们之前访问 JBOSS 的 SVN 仓库就遇到
了这种情况,不过 JBOSS 提供了很好的解决方案,其实用 Apache 的配置文
件同样可以做到。

将 httpd.conf 中的 Require valid-user 改为如下:

<LimitExcept GET PROPFIND OPTIONS REPORT>


Require valid-user
</LimitExcept>

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这表示对于匿名用户可以读,但是只对认证用户开放写操作。

重启 Apache.

通过浏览器访问资源库

我们看到,并不需要我们输入认证信息。说明我们的配置是正确的。现
在用 TortoiseSVN 将该项目检出,然后修改文件再提交,看看是否如预期。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

为了正确起见,先将保存 SVN 用户信息的目录 auth 删除

删除该目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Checkout

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Checkout 操作并没有提示要我们输入认证信息。

修改 abc.txt 然后提交

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到需要我们输入认证信息才能提交成功。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

确定

提交成功,一系列的操作说明我们的配置没有任何问题。

OK,现在我们又有了新的需求,假设 SVN 仓库中有很多的子仓库,每个


子仓库中又有很多目录和文件,那么我需要配置以便使某些用户可以访问某
些仓库,即可以读写;而另外一些用户只能读不能写,不过这两种类型的用
户都需要输入认证信息方能进行操作。Apache 同样为我们提供了这种需求的
解决方案。

我们先来 import 另一个项目到 SVN 仓库中以便后面操作使用,为此我


们在 SVN 仓库中再建一个子仓库。
首先要开启 SVN 服务,建仓库过程 同前。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

新建仓库名为 helloworld

仓库已经建好

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

现在我们已经有了两个子仓库:subsvn 和 helloworld

接下来,import 一个项目到 helloworld 中。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

使用 TortoiseSVN 进行 import

这里在 import 时增加了一个虚拟目录 abc


浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

输入认证信息

成功导入
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

接下来打开 httpd.conf 文件,定位到 Location 部分

将其中的内容更改为如下:

<Location /svn>

DAV svn

SVNParentPath E:/svn/repository

AuthzSVNAccessFile E:/passwd/policy

AuthType Basic

AuthName "Subversion Repository"

AuthUserFile E:/passwd/passwords

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Require valid-user

</Location>

我们看到,实际上这部分配置中增加了如下配置:

AuthzSVNAccessFile E:/passwd/policy

该配置表示对 SVN 访问策略文件。我们接下来编写该配置文件。

在 E 盘下的 passwd 目录中建立一个文件:policy

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

打开该文件,增加如下内容

[helloworld:/]

hello=rw

google=r

Microsoft=

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

保存,关闭。

增加的配置表示:对于 helloworld 路径,hello 用户可读可写,而 google


用户只读,另外的用户 microsoft 不能读也不能写。这就定义了 SVN 仓库的
访问策略。

重启 Apache。先删除保存在本地的用户认证信息。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

删除

在浏览器中访问 http://localhost/svn/helloworld

输入 microsoft/world

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

如图,我们可以看到,microsoft 已经被我们配置成不能读取也不能写入,
所以服务器给我们了 Forbidden 的信息,关闭浏览器,重新打开,输入同样
的网址,这次认证信息输入 google/world

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们可以看到,google 可以读取 SVN 仓库中 helloworld 子仓库的内容,


符合我们的定义,对于 hello 用户,也是可以访问的,因为他有读写的权限。

当我们访问:http://localhost/svn/subsvn 时出现如下界面:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

因为我们在访问策略文件中只配置了对于 helloworld 仓库的访问,没有


配置对 subsvn 仓库的访问,所以默认情况下,对于他的访问是拒绝的,这也
就要求我们对每个仓库都要进行相应的配置方可进行访问。

在公司里都有不同的项目组,每个组对应自己的仓库,一个组有很多组
员,如果对于每个组员都去指定他的访问权限显得十分繁琐,我们可以利用
SVN 中组的概念来对用户进行分类,这样大大方便了我们的操作。

将 policy 文件修改为如下:

[groups]

developers=hello,google

testers=microsoft

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

[helloworld:/]

@developers=rw

@testers=

[subsvn:/]

@developers=rw

@testers=rw

这里面我们先定义了两个组:developers 和 testers,后面表示这个组的
用户。

接下来我们可以用@developers 来引用之前定义好的组。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

保存,重启 Apache

在浏览器中输入 http://localhost/svn/helloworld

输入 microsoft/world

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

因为 microsoft 属于 testers 组,而该组对于 helloworld 仓库没有访问权


限,
所以显示为禁止页面。
如果换成 developers 组的用户就可以进行访问了。

以上详细讲述了 Apache 与 SubVersion 整合中的权限管理问题。

接下来讲述 SVN 仓库的备份。

服务器中的仓库是软件公司最重要的无形资产,所以备份非常重要。

对于备份,有两种方式:一是直接拷贝仓库到其他地方,优点是简单,
缺点是当拷贝过程中有用户对 SVN 进行操作则会出现不一致问题,所以这种
方式不提倡使用;
二是采用 SVN 提供的命令,
这也是我们要讲述的主要方式。

在命令行输入 svnadmin hotcopy E:\svn\repository E:\backup

回到 E 盘的根目录

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

生成的备份文件

我们看到,备份是多么容易,当然我们也可以指定备份的目的地是网络
上的其他计算机。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

7 SubVersion 整合 Eclipse
Eclipse 是一个非常优秀的集成开发环境。IBM 已经花了多年的时间开发
基于 Java 的公开源代码软件 Eclipse,并在其中投资了 4000 万美元。这个在
IBM 支持下的开放源代码项目经过一个时期的发展完善,已经为广大 Java 开
发者所熟悉。Eclipse 的出现,为 Java 开发者提供了免费使用强大的 Java IDE
的机会,通过集成大量的插件,Eclipse 的功能可以不断扩展,以支持各种不
同的应用。本章介绍如何使用 SubVersion 协同 Eclipse 进行版本控制。

由于 Eclipse 本身并没有内置对 SubVersion 的支持,所以我们需要使用


Eclipse 的 SVN 插件,该插件的名字为 Subclipse。

在浏览器中输入如下地址:http://subclipse.tigris.org/

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

进入 Subclipse 的主页

这里提供了若干种的安装方式,其中我强烈推荐大家采用 link 的方式进


行安装,并且我就是使用这种方式进行的安装,该方式的好处在于安装和卸
载插件都非常容易。

点击页面左边的 Downloads

点击

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

点击

根据自己的 Eclipse 版本选择合适的文件,我的 Eclipse 为 3.3

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

下载

下载完毕,采用 link 方式进行安装,然后启动 Eclipse

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

选择菜单 windowpreferencesTeam

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这时我们看到 SVN 的插件 Subclipse 已经成功的集成到了 Eclipse 中了。

我们建立一个 Java 工程

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

在工程中建立一个包 com.test.svn

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

在包下建立一个类 Test

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

在该类中增加一些代码

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

将透视图转到 Subversion 中

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

在左边新建一个远程仓库位置

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

输入:http://localhost/svn/helloworld

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

出现认证信息输入窗口,我们输入 hello/world,并保存认证信息

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

成功地和服务器建立了连接

回到 Java 透视图

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

将我们的项目 import 到服务器上去

右键 svn 项目,选择 TeamShare Project…

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

选择 SVN

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Next

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Next

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Finish

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

出现提交对话框,全部选择,确定

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

根据提示,我们得知,我们导入成功了,从输出来看,实际上 Subclipse
执行了很多步骤,
先是在服务器上创建目录 svn,
然后 checkout,
最后 commit。
这样我们的项目就直接与 SVN 发生了联系,而不必象之前那样,还要再删除
该项目,
然后重新 checkout,
这种行为与 CVS 一致,
大大方便了我们的使用。

项目的每个目录和文件前都有一个小瓶,表示和服务器文件一致。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

表示内容一致的小瓶

在这里我们为了体现真实开发中多用户操作的特点,再建立一个 Java 工
程,然后使用这两个工程同时进行操作,这样我们就能很真切看到 SVN 是如
何为我们管理仓库内容的,并且这也是在实际使用当中所发生的情况。

启动另一个 Eclipse,选择不同的工作空间

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这样我们就在一台机器上同时开启两个 Eclipse,模拟两个用户的操作

首先还是转到 SVN 透视图中

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

仿照之前的方式再建立一个资源库位置

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到我们已经成功的连接到了 SVN 服务器了,并且已经列出来上面


的项目目录。

这里需要注意:这次连接时并没有提示我们输入认证信息,这是因为我
们之前连接时已经将认证信息保存起来了,所以这时就直接用我们刚才保存
的用户信息,即:hello/world。那么之后两个工作空间的操作都会使用同样的
用户认证信息。

右键 svn 项目,选择 checkout

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Next

Finish

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,命令执行成功,这时我们转到 Java 透视图

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到我们的项目里面已经多出来一个名字叫 svn 的项目,这个就是


我们刚才 checkout 下来的项目。现在我们就要在两个 workspace 中对项目进
行操作,然后进行版本管理。

为了不产生混淆,我将第一个工作空间称为空间 1,将第二个工作空间
称为空间 2

现在我们回到空间 1,对 Test.java 进行一些修改

我们增加了一行代码,保存。然后右键该文件,选择 Teamcommit

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK.

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

根据命令行输出,我们看到我们的提交已经成功了。

这时我们转到空间 2,打开 Test.java

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到该空间 2 中的 Test.java 文件仍旧为之前的代码,我们这时需要


进行 update,将空间 1 提交上来的代码更新下来,在 update 之前我们先来
比较一下本地文件和服务器上文件的区别。

右键 Test.java,选择 CompareLatest from repository

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这时就会打开文件比较窗口

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到已经呈现出来本地文件和服务器上文件的区别,并已经标识出
来,其中左边的表示本地文件,右边的表示服务器上的文件。

这时我们进行 update 操作

右键 Test.java,选择 Teamupdate

我们看到这时本地文件已经成功的更新到了服务器的版本

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

现在我们再进行一次操作,这次我们在两个工作空间中同时修改
Test.java,并且修改不同的地方,然后分别提交,我们看看 SVN 是如何解决
冲突的

在空间 1 中对 Test.java 进行如下修改

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

修改的地方是将之前的一部分代码删除,然后增加一些代码。

在空间 2 中对 Test.java 进行如下修改

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

好,现在我们先对空间 1 中的 Test.java 进行提交

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

首先我们看到 Test.java 文件前的小瓶已经变成了*号,这表示本地文件


和服务器端文件已经不同了

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到文件已经成功提交了

这时我们对空间 2 的 Test.java 文件进行提交,方式同前

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这时我们看到 SVN 给出一个错误信息,大家仔细阅读错误提示发现该错


误表示提交过程中发生了冲突,我们现在无法提交,必须要先进行 update 操

提示:大家可以这样来想,如果这时空间 2 的 Test.java 可以提交的话,那


么空间 1 的提交就会完全被覆盖,那么之前用户的所有操作都消失了,这在真
正开发中是绝对不允许的,所以 SVN 不允许我们提交。

现在我们来进行 update

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

大家看到出现了一些很奇怪的代码。

>>>>>>> .r5
public class Test
{
public static void main(String[] args)
{
System.out.println("hello world");
<<<<<<< .mine
try
{
URL url = new URL("http://www.google.com");
System.out.println(url.getHost());
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
=======
Date date = new Date();
System.out.println(date);
>>>>>>> .r5
}

实际上这是由于两个用户同时对同一个地方进行了修改,SVN 无法判断
出如何进行 merge,那么它将这个工作交给我们自己来完成。其中出现.r5 表
示是服务器上的文件修改,而.mine 是我们自己的修改,我们必须手动来决定
到底需要保存哪些内容,我们将代码修改如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

根据具体的业务逻辑保存两个部分的代码,然后再次进行提交

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK

我们发现依然不能提交,原因同前。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这时回到 Java 透视图,我们发现包下面多出三个文件

多出三个文件

这些文件是当冲突发生时,SVN 为我们生成的临时文件,分别是当前客
户端的最新文件,服务器上最新文件以及客户端之前的文件,当我们修改完
冲突后需要删除这些文件,使用如下命令 TeamMark resolve

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK,我们发现这三个临时文件已经被删除了。

再次提交

OK

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们这时发现,修改后的文件已经成功的提交到了服务器端。

说明:提交冲突是在实际项目开发中遇到最多的一种情况,遇到这种情
况时一定要与小组成员进行讨论来决定文件的最后版本,这也同时说明了交
流在开发中的重要性。另外当修改完冲突后一定要 resolve 一下该文件,否
则该文件将永远不能提交成功。

现在服务器端的版本已经变成 6,我们回到空间 1,对 Test.java 进行


update 操作。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到 update 操作成功,空间 1 中的 Test.java 文件已经更新到了最


新版本。

我们这时再对空间 1 中的 Test.java 文件进行锁定(lock)操作。

右键 Test.java,选择 Teamlock

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK

已经被锁定

这时 Test.java 文件已经被锁定,其他用户将无法对该文件的修改提交到
SVN 服务器。

这时我们回到空间 2,对 Test.java 文件进行一些修改,然后尝试进行提


交,看能否成功。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

修改后进行提交。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK

这时我们发现提交失败,原因就是该文件已经被锁定了
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

这时我们回到空间 1,将该文件解锁。

这时再对空间 2 的 Test.java 文件进行提交

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到提交成功。

注意:一般情况下,请不要将文件锁定,除非你要很强烈的要求,不希
望其他用户对该文件进行修改,否则会影响项目的开发。

我们可以查看项目中某个文件的所有版本历史,方法是右键 Test.java,
选择 TeamShow in History Resource

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

双击某个版本号就会查看到该文件所有的版本修订历史,这非常方便我
们查看某个文件以前的历史状态。

有些时候我们对项目中的某个文件进行了一些修改,后来发现修改的不
正确,想要进行恢复,使之恢复到上一次 update 后的版本,这时我们就可以
使用 Revert 命令。

我们在空间 1 对 Test.java 进行一些修改

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

增加的内容

现在我想将该文件恢复到之前的状态,右键 Test.java,选择

TeamRevert…

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK.

我们看到该文件已经恢复到了之前 update 的状态,这对于我们来说很方


便。

为了实现版本管理,SVN 会在工作区的每个目录下都生成一个隐藏
的.svn 文件夹,而我们有时却希望得到一个干净的没有.svn 文件夹的项目结
构,比如发布软件时,这种情况下就可以使用 Export 功能

右键 svn 项目,TeamExport

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

确定

这时我们到 D 盘下的 export 目录去查看一下。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到,一个干净的项目就导出来了。

高效的分支(branching)与标签(tagging)功能

先说标签功能,通俗的讲,标签就是某个时间点的快照(snapshot)
,我
们可以在项目进行到一些重要的里程碑之时为之建立标签,这样可以方便以
后随时取出这些历史版本。我想你会有一个疑问:SVN 不是本身就有随意取
出任何一个历史版本的功能吗?是的,标签的作用主要是为了给这些特定的
历史版本取一个友好的名字,以方便使用和维护。

分支则是用于创建多个并行的工作线,比如,当我们的一个项目需要为
某个用户提供一些特殊的功能时,那么就可以为之创建一个分支,这样能够
保证大部分代码的共用,也使得整个项目变得容易维护和管理。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

SVN 对于分支和标签的实现都是一样的,并且采用了与 Unix/Linux 硬链


接(Hard-Link)类似的机制,即是说,当我们创建分支或标签时,SVN 并
不会立即为之创建一份拷贝,而是创建一个链接,只有当这些文件以后被修
改时才会真正产生一份副本。这种“缓式拷贝”方法是一种常见的优化方法,
能够有效的节约空间。

那分支和标签又有什么不同呢?不同之处仅仅在于其“约定成俗”的含
义,标签意味着你不会再对其进行修改,而分支意味着你会对它进行开发 。
二者在实现上却是一样的,都是通过 Branch/tag 命令执行。

现在我们为 svn 项目创建一个标签。

右键 svn 项目,选择 TeamBranch/tag…

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

将 url 路径改为:http://localhost/svn/helloworld/svn2,确定

我们等待一段时间后发现,我们的动作失败了。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

难道是我们使用方式不正确?其实不是,失败的原因不在于我们的操作,
而在于杀毒软件,我的机器上装的是卡巴斯基,正是由于它的阻止,我们动
作导致失败,解决方案是在进行该动作时,可以先停止卡巴斯基的监控,待
成功执行后再开启它的监控。如果读者在使用时也遇到这个问题,可以先停
止本机杀毒软件的实时监控再重新做一次即可。

OK,关闭卡巴斯基的实时监控后我们再尝试一次。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

确定

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到命令成功执行。

这时用浏览器查看该地址:http://localhost/svn/helloworld

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到了我们方才创建的分支 svn2,以后我们可以象使用其他项目一
样来使用该分支。

我们也可以通过配置方式来创建分支或标签。

右键项目名,TeamConfigue Branch/Tag

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们可以在这里面为 svn 创建分支与标签。

OK,创建成功,然后进行项目的提交。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK

右键 svn,TeamSwitch

在这里面可以选择你要转到的分支或标签

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

点击 Browse…

我们转到刚才创建的分支

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

根据命令行提示,我们的转换是成功的。

那么现在就可以在这个分支中进行开发了,也可以随时转到主干里面。

到此为止,SubVersion 与 Eclipse 的整合就告一段落了。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

8 SubVersion 整合 NetBeans
SubVersion 与 NetBeans 的整合更加容易,因为 NetBeans 本身已经内
置了 SVN 客户端,非常容易使用,我们现在以实例的形式展现二者的整合操
作。

我使用的 NetBeans 版本为 NetBeans IDE 6.0 Beta 1,可以从


http://www.netbeans.org 下载

首先启动 NetBeans

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们首先建一个 Java 项目,然后 import 到 SVN 仓库中

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

确定

现在我们将该项目 import 到 SVN 仓库中


浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

输入必要的信息,现在对于这些信息,大家应该都很清楚其含义了。

确定

完成。

现在修改一下 Main.java.然后提交

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

进行提交

Commit

我们看到命令已经成功执行了。

其实对于 NetBeans 来说,它的操作基本与 Eclipse 一样,所以这里就不


再进行更详细的演示了,大家可以自己进行尝试。

注意:NetBeans 现在还是测试版,所以有些功能会有问题,大家在使
用时需要注意

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

9 SubVersion 整合 Visual Studio.NET


到目前为止,SVN 已经有了.NET 整合的插件了,它就是 VisualSVN,可
以到如下地址下载:http://www.visualsvn.com,注意这是一个收费软件,不
过有 30 天试用期,我们可以以它作为讲解。

点击 Download 链接

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

需要注意:安装 VisualSVN 之前,一定要保证自己机器上已经安装了


TortoiseSVN1.4 以上版本。

保存。安装

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

现在启动 vs.net2005

集成成功

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

我们看到 VisualSVN 已经成功的集成到了 vs.net 中了。

新建一个 c#控制台项目,然后将其 import 到 SVN 中。

编写代码如下:

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

现在我们将该项目 import 到 SVN 中。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

OK

OK

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

成功完成导入,接下来需要 commit 相关文件。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

Commit

我们看到,实际上 VisualSVN 是 TortoiseSVN 的一个外壳,实际完成操


作的依然是 TortoiseSVN,这也就是为什么我们需要安装它的原因。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

命令成功执行。

其他操作与 TortoiseSVN 类似,这里不再赘述。

浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶

10 后记
至此,这个 SubVersion 实用指南教程就结束了,写作过程中也参考了网上
很多资料.该教程不足和错误之处再所难免,还希望大家多提宝贵意见.写这个
教程的目的就是帮助大家尽快掌握 SVN 这个强大的版本管理软件,提高团队
开发效率,为开源世界贡献自己的一份绵薄之力.

浪曦视频在线

You might also like