Professional Documents
Culture Documents
——SubVersion
作者:风中叶
浪曦视频在线
2007 年 10 月 1 日
深入浅出系列之二_SubVersion 作者:风中叶
声明
此文档为免费资料,欢迎大家转载,阅读,转载时请保持
文档的完整性,作者不保证文档的完全正确,希望大家对其中
的错误进行更正并与我联系。在写作过程中,我参考了网上大
量的资料,并摘取了其中的一部分内容,在这里向这些资料的
作者表示深深的感谢,如果您认为我侵犯了您的著作版权请告
之我,我会将相关内容删除并将结果通知您。
本文档仅代表作者本人的观点。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
目录
1 SubVersion 概述 ..................................................................................................................................4
3 SubVersion 实战 ................................................................................................................................ 18
10 后记 ................................................................................................................................................267
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
1 SubVersion 概述
版本控制之于程序员,就好比安全网之于高空秋千表演者。知道安全网
就在那里,万一自己摔落它能够提供保护,高空秋千表演者才能放心大胆地
在空中飞跃。同样,版本控制使您有能力去冒以往想都不敢想的风险。如果
哪儿出了错,您总是可以使自己的代码回复到一个已知的、工作正常的版本。
您可以在不触及主干的分支中进行试验,而不会影响到其他小组成员。在已
经发布的产品的较老版本中发现 bug 时,您可以轻松检出特定版本,以确认、
修订,并生成该 bug 的修补程序。如果没有版本控制,您必须极为慎之又慎,
缓慢地推进,总而言之,生产力会更低。
Subversion 是一种开放源码的全新版本控制系统,支持可在本地访问或
通过网络访问的数据库和文件系统存储库。不但提供了常见的比较、修补、
标记、提交、回复和分支功能性,Subversion 还增加了追踪移动和删除的能
力。此外,它支持非 ASCII 文本和二进制数据,所有这一切都使 Subversion
不仅对传统的编程任务非常有用,同时也适于 Web 开发、图书创作和其他
在传统方式下未采纳版本控制功能的领域。
与其他版本控制系统相比,CVS 最令人称道的地方就是其非锁定存储库,
这使多个开发人员能够同时检出同一个文件。CVS 在提交时解决冲突问题,
这就避免了冲突成为发展的瓶颈。CVS 第二个出色的特性就是它是一种网络
存储库。处于许多不同系统上的程序员可以通过公共的 Internet 访问相同的
存储库。
CVS 在过去的十年中,为社区提供了优质的服务,但它陈旧的劣势开始
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在开源软件世界,并行版本系统(CVS)一直是版本控制长久以来的唯
一选择。事实证明,这是个正确的选择。CVS 本身是自由软件,不加限制的
处事风格,对网络化操作的支持(众多身处不同地方的程序员可以共享他们
的工作)
,都非常符合开源世界的协作精神。CVS 和它半混乱状态的开发模型
已成为开源文化的基石。
但是,和其它许多工具一样,
CVS 开始显露出衰老的迹象。
而 Subversion,
正是以 CVS 继任者的面目出现的新型版本控制系统。Subversion 的设计者们
力图通过两方面的努力赢得 CVS 用户的青睐:保持构建开源软件版本控制系
统的方式(以及视觉和感觉上)与 CVS 尽可能类似,同时尽力弥补 CVS 许
多显著的缺陷。这些努力的结果使得从 CVS 迁移到 Subversion 不需要做出
重大的变革,Subversion 确实是非常强大、非常有用和非常灵活的工具。
程序员(特别是那些依赖版本控制的程序员)是一个非常谨慎的群体,
Subversion 着实用了很长一段时间,才得到他们的广泛接受。很少有程序员
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
2 SubVersion 基本概念
版本库:Subversion 是一种集中的分享信息的系统,它的核心是版本库,
它储存所有的数据,版本库按照文件树形式储存数据—包括文件和目录。任
意数量的客户端可以连接到版本库,读写这些文件。通过写,别人可以看到
这些信息,通过读数据,可以看到别人的修改。
实际上,版本库是另一种文件服务器,而不是你常见的那一种。最特别
的是 Subversion 会记录每一次的更改,不仅针对文件也包括目录本身,包括
增加、删除和重新组织文件和目录。
当一个客户端从版本库读取数据时,通常只会看到最新的版本,但是客
户端也可以去看以前的任何一个版本。举个例子,一个客户端可以发出这样
的历史问题“上个星期四的目录是怎样的?”或是“谁最后一个更改了这个
文件,更改了什么?”
,这些是每一种版本控制系统的核心问题:系统是设计
来记录和跟踪每一次改动的。
版本模型:版本控制系统的核心任务是提供协作编辑和数据共享,但是
不同的系统使用不同的策略来达到目的。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
文件共享问题:所有的版本控制系统都需要解决这样一个基础问题:怎
样让系统允许用户共享信息,而不会让他们因意外而互相干扰?版本库里意
外覆盖别人的更改非常的容易。考虑下图的情景,我们有两个共同工作者,
Harry 和 Sally,他们想同时编辑版本库里的同一个文件,如果首先 Harry 保
存它的修改,过了一会,Sally 可能凑巧用自己的版本覆盖了这些文件,Harry
的更改不会永远消失(因为系统记录了每次修改)
,Harry 所有的修改不会出
现在 Sally 的文件中,所以 Harry 的工作还是丢失了—至少是从最新的版本中
丢失了—而且是意外的,这就是我们要明确避免的情况!
锁定-修改-解锁 方案:许多版本控制系统使用锁定-修改-解锁这种机制
解决这种问题,在这样的模型里,在一个时间段里版本库的一个文件只允许
被一个人修改。首先在修改之前,Harry 要“锁定”住这个文件,锁定很像是
从图书馆借一本书,如果 Harry 锁住这个文件,Sally 不能做任何修改,如果
Sally 想请求得到一个锁,版本库会拒绝这个请求。在 Harry 结束编辑并且放
开这个锁之前,她只可以阅读文件。Harry 解锁后,就要换班了,Sally 得到
自己的轮换位置,锁定并且开始编辑这个文件。下图 “锁定-修改-解锁 方案”
描述了这样的解决方案。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
锁定-修改-解锁模型有一点问题就是限制太多,经常会成为用户的障碍:
如果 Harry 编辑一个文件的开始,
2.锁定可能导致不必要的线性化开发。
Sally 想编辑同一个文件的结尾,这种修改不会冲突,设想修改可以正确的合
并到一起,他们可以轻松的并行工作而没有太多的坏处,没有必要让他们轮
流工作。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
锁住了文件,而且从一个安全,孤立的情况开始工作,因而没有尽早发现他
们不匹配的修改。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
拷贝-修改-合并模型感觉是有一点混乱,但在实践中,通常运行的很平稳,
用户可以并行的工作,不必等待别人,当工作在同一个文件上时,也很少会
有交迭发生,冲突并不频繁,处理冲突的时间远比等待解锁花费的时间少。
最后,一切都要归结到一条重要的因素:用户交流。当用户交流贫乏,
语法和语义的冲突就会增加,没有系统可以强制用户完美的交流,没有系统
可以检测语义上的冲突,所以没有任何证据能够承诺锁定系统可以防止冲突,
实践中,锁定除了约束了生产力,并没有做什么事。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
什么时候锁定是必需的
锁定-修改-解锁模型被认为不利于协作,但有时候锁定会更好。
拷贝-修改-合并模型假定文件是可以根据上下文合并的:就是版本库的文件主要
是以行为基础的文本文件(例如程序源代码)。但对于二进制格式,例如艺术品
或声音,在这种情况下,十分有必要让用户轮流修改文件,如果没有线性的访问,
有些人的许多工作就最终要被放弃。
当你在工作拷贝作了一些修改并且确认它们工作正常之后,Subversion
提供了一个命令可以“发布”你的修改给项目中的其他人(通过写到版本库),
如果别人发布了各自的修改,Subversion 提供了手段可以把这些修改与你的
工作目录进行合并(通过读取版本库)
。
举一个例子,你的版本库包含两个软件项目,paint 和 calc。每个项目在
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
它们各自的顶级子目录下,如下图“版本库的文件系统”
:
为了得到一个工作拷贝,你必须检出(check out)版本库的一个子树,
(术
语“check out”听起来像是锁定或者保存资源,实际上不是,只是简单的得
到一个项目的私有拷贝)
,之后你有了一个/calc 的个人拷贝,有一个附加的目
录—.svn—保存着前面提及的 Subversion 需要的额外信息。
模式 访问方法
file:/// 直接版本库访问(本地磁盘)
。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
更新(update):假设你有个合作者,Sally,她和你同时取出了/calc 的
一个工作拷贝,
你提交了你对 button.c 的修改,
Sally 的工作拷贝并没有改变,
Subversion 只在用户要求的时候才改变工作拷贝。要使项目最新,Sally 可以
要求 Subversion 更新她的工作备份,通过使用更新(update)命令,将结合
你和所有其他人在她上次更新之后的改变到她的工作拷贝。svn update 命令
的输出表明 Subversion 更新了 button.c 的内容,注意,Sally 不必指定要更
新的文件,subversion 利用.svn 以及版本库的进一步信息决定哪些文件需要
更新。
在版本库中,每一次提交被当作一次原子事务操作:要么所有的改变发
生,要么都不发生,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
calc/Makefile:6
integer.c:6
button.c:6
工作拷贝如何追踪版本库:对于工作拷贝的每一个文件,Subversion 在
管理区域.svn/记录两项关键的信息:
1.工作文件所作为基准的修订版本(叫做文件的工作修订版本)
2.一个本地拷贝最后更新的时间戳。
给定这些信息,通过与版本库通讯,Subversion 可以告诉我们工作文件
是处与如下四种状态的那一种:
未修改且是当前的 :文件在工作目录里没有修改,在工作修订版本之后
没有修改提交到版本库。svn commit 操作不做任何事情,svn update 不做任
何事情。
本地已修改且是当前的 :在工作目录已经修改,从工作修订版本之后没
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
未修改且不是当前的了: 这个文件在工作目录没有修改,但在版本库中
已经修改了。这个文件最终将更新到最新版本,成为当时的公共修订版本。
svn commit 不做任何事情,svn update 将会取得最新的版本到工作拷贝。
本地已修改且不是最新的: 这个文件在工作目录和版本库都得到修改。
一个 svn commit 将会失败,这个文件必须首先更新,svn update 命令会合
并公共和本地修改,如果 Subversion 不可以自动完成,将会让用户解决冲突。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
3 SubVersion 实战
在讲 述完 SubVersion 的基 本概 念和 基本 理论 后, 让我 们开 始 进 入
SubVersion 实战阶段,通过实际动手操作来学习这个强大的版本控制系统的
具体使用与原理。
浏览器地址栏中打开如下地址:http://subversion.tigris.org/
点击左边的 Downloads 链接
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
滑动鼠标到该页下面
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
下载完毕后双击该文件进行安装,该安装过程与一般的软件没有任何区
别,选择默认即可,一路回车,最后完成。这样我们的 SubVersion 服务器端
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
软件就安装完毕了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
注意:SVN 的命令是基于命令行的,所以我们不能直接双击这些命令来
执行他们,我们需要到命令行窗口去执行他们。
SVN 的服务器端软件同样包含了客户端执行的一些命令,我们可以利用
这些命令来完成我们日常的版本控制管理工作。
与 CVS 的使用方式一样,我们首先需要在服务器端建立仓库(repository)。
在安装完毕 SVN 后,
他会将安装目录中的 BIN 目录加入到系统 path 中,
可以通过右键点击我的电脑,选择高级—>环境变量,查看 path 环境变量的
值。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
打开命令行窗口,输入 svn 命令
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在我们需要首先创建一个仓库(repository),假设我们的仓库创建位
置为:E:\svn\repository 目录下,我们需要先在硬盘上创建该目录。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
如图,执行完命令后,SVN 没有给出任何信息,这说明我们的版本库已
经创建成功了,我们这时再到 E:\svn\repository 下去看看。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在服务器端的仓库已经创建成功了,接下来就是在客户端创建一个项
目,然后将该项目 import 到服务器端,将其纳入 SVN 的管理之下。不过在
创建项目之前我们首先需要启动服务器,服务器启动后才会进行网络侦听,
检查到客户端的相关命令请求。
在命令行中输入如下命令:svnserve –d –r E:\svn\repository,该命令含
义为让 SVN 将此目录作为仓库,并侦听客户端的请求。其中-d 的作用为后台
模式,而-r 的作用为指定服务器的仓库路径。
如图,当服务器启动后,请不要关闭该命令行窗口,否则也会把 svnserve
服务停下来,接下来的操作我们可以另外打开一个命令行窗口进行。
假设我们的客户端创建的项目在 E:\test\client,我们在该目录下创建一个
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
client 目录结构如下:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
执行完毕后我们发现该命令失败了
通过命令行的说明我们看到,该命令要求我们指定好一个记录日志的文件或
者在系统环境变量中增加一个 SVN_EDITOR 的变量。二者选一就可以了,
那么我们可以增加一个 SVN_EDITOR 的环境变量。该变量的值我们就取为
系统自带的记事本就可以了。方法同前述查看 path 环境变量一样。
点击确定即可。
现在我们再一次运行之前的 import 命令
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们发现命令依然失败,并且失败的原因与刚才一样。其实这是由于我
们修改了系统环境变量后还是使用当前的命令行窗口造成的。当修改了环境
变量后一定要重新打开一个新的命令行窗口,这样修改才会生效。
现在我们打开一个新的命令行窗口,重复执行方才的命令,不要忘记将
当前目录转到 E:\test 目录下
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
输入命令
当我们输入命令回车后,出现这个信息窗口,这证明了我们的环境变量
的增加是正确的,关闭这个窗口。出现以下窗口
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们选择 c,继续。
认证权限。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
用文本编辑器打开 svnserve.conf 文件
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
保存,关闭该文件。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
仍然选择继续
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
大家一定觉得这样很繁琐吧,其实我之所以把错误让大家看到就是让大
家知其然还知其所以然,遇到错误不可怕,关键是要找到解决错误的办法,
我相信大家到现在对于 import 操作应该印象深刻了吧。
接下来,我们在本机再建一个目录,位置为 E:\test2\client2,再里面创建
一个文件夹 child2 和一个文本文件 test2.txt,在 test2 中输入一些文本,如图:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
目录结构如下:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
关闭弹出来的日志窗口,继续
OK,执行成功。该命令的作用是在服务器端创建一个虚拟目录 project2.
今后我们的项目可以 import 到该目录下,现在我们就开始这个操作。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
不过我们可以采用提示中的另一种方法,就是建立一个日志文件,然后
输入命令时指定这个日志文件就可以了,不过这样的话就要求我们每次输入
命令时都需要指定这个日志文件的位置,所以到底用哪种方式就看大家的喜
好了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
删除该环境变量
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
将 命 令 行 当 前 目 录 转 到 该 目 录 , 输 入 如 下 命 令 : svn checkout
svn://localhost/project2
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
进入 project2
进入 client2
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
保存,关闭。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
如图:出现以上信息,说明我们的工作拷贝已经被锁定了,不能提交。
根据提示,我们清除锁定,输入:svn cleanup
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在已经解锁了,我们再次执行提交命令
如图,又出现一个新错误,根据提示我们看到,错误提示我们没有指定
日志文件位置,原因在于我们已经将 SVN_EDITOR 环境变量删除了。好,
那么现在我们指定之前建立的日志文件 C:\log.txt.
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
用文本编辑器打开 4 这个文件
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到实际上我们的当前版本的所有文件的信息都在这里面了,这种
管理文件的方式与 CVS 是有较大差异的。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
执行完毕后
由于文件没有修改,所以我们看到执行成功后,本地文件没有发生任何
变化。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在浏览器地址栏输入如下网址:http://labs.jboss.com/jbossas/
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
如图我们可以看到其项目的页面,注意,此时地址栏的地址就是我们在
后面要 checkout 的地址。
我们现在本地 E 盘新建一个目录:JBOSS,作为检出项目的存放目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
讲命令行转到该目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
上图表示正在进行检出的命令行状态,在检出完毕后我们到 JBOSS 目录
下去看看,会发现 JBOSS 项目已经被我们成功检出了。从这里我们也可以看
到,JBOSS 项目也是使用 SVN 进行的版本控制和管理。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在命令行输入:svn help
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_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 作者:风中叶
注释掉该部分
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
取消改行的
注释
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
根据上面的说明,我们知道该文件存放用户的登录名和密码,其中[users]
下就是该部分信息,形式为 username=password,此时 SVN 已经给我们两
个例子了,不过都被注释掉了,我们可以增加自己的登录信息。现在我们增
加两个用户,zhangsan 和 lisi,密码分别为 zhangsan123 和 lisi123
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
保存,关闭该文件,现在我们要使用用户登录信息来操作 SVN。
注意:在一次登录后,SVN 会将我们的登录信息保存起来存放在硬盘上
的文件中,其存放位置为:C:\Documents and Settings\[你的登录系统用户
名] \Application Data\Subversion,如果想要删除该信息,只需要将该目录
中的 auth 文件夹删除即可。
之所以花很大篇幅讲述命令行操作方式,主要是希望读者可以更深刻理
解 SVN 的操作方式。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
TortoiseSVN 的下载地址如下:http://tortoisesvn.tigris.org
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
接下来在 E 盘的根目录下新建一个目录:import
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
import 目录结构如下:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
出现如下界面:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
其中上面的输入框表示我们要将该目录导入的服务器地址,这里是
svn://localhost/import,其中加上 import 的作用是将该项目与 SVN 管辖的其
他项目分开,这样我们在 checkout 时就可以只 checkout 该项目而不必全部
都检出,当然你不必一定输入 import,可以输入任何名字都可以。下面的是
输入一些日志信息,可以省略。填好后的界面如下:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击确定。
OK,这时出现一个对话框,要求我们输入用户名和密码,这是因为我们之
前已经要求必须输入用户名与密码才能登录,其中登录信息保存在 SVN 仓库
中 conf 目录下的 passwd 文件中,如下:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们输入 zhangsan/zhangsan123,点击确定
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
出现如下界面
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
其中上面的输入框就表示服务器的 url,这里我们填
写:svn://localhost/import 表示从方才 import 的目录中进行检出。下面的输入
框表示检出到哪里,默认情况下会被自动填写当前目录,即 E:\hello.
点击确定。
anon-access = none
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
增加一行
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在该目录中进行 checkout 操作
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击确定
大家可以看到,TortoiseSVN 让我们输入登录信息,我们输入
zhangsan/zhangsan123 后就可以执行检出操作了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
增加了一行文字,保存,关闭。
我们再看看 hello 目录
大家可以发现,test.txt 文件已经发生了变化,由之前绿色的勾变成了红色
的感叹号,这表明该文件已经发生了更改,变的与服务器的文件不一样了,
这时我们更可以感受到 TortoiseSVN 带给我们的便捷了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击 OK。
又出现输入登录信息的对话框,再次输入用户名和密码,然后选择 Save
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到命令成功执行了,由于该文件没有发生变化,所以更新后也没
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
有发生变化。
保存,关闭。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击 OK.
可以看到命令成功执行了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
确定
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
命令成功执行,版本变成 7.
再次刷新 src 目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
可以看到该文件已经被删除了,不过要想影响到服务器,我们必须
commit
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到,
我们已经把删除 langsin.txt 的信息成功的提交到了服务器端。
其余的命令大家可以自己动手实验,我就不再赘述了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
5 SubVersion 整合 Apache
本章主要讲述 SVN 与 Apache 服务器整合的操作方法与过程。
确定
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
接下来将其中的内容拷贝,粘贴到命令行窗口中,连续输入两次回车,
出现如下视图:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK,我们看到命令已经成功执行,服务器返回响应信息。注意到 sohu 使
用的服务器为 Apache1.3.33 版本。
接下来用同样的方式测试新浪的站点:www.sina.com.cn,得到如下响应:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们可以看到新浪使用的服务器为 Apache2.0.54。
打开 Apache 的主页:www.apache.org
Apache 分为安装方式和解压缩方式,这里我选择安装方式。并且我选择
的安装文件为 Apache2.0.59 版本
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我安装的版本
下载完毕后双击安装。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
出现上述界面需要大家输入一些信息,实际上输入任何信息都可以,并
且下面的单选请选择第一个,这样 Apache 占用了 80 端口,并被安装为系统
服务,如果读者机器上有其他应用占用了 80 端口,比如 IIS,请将其换为其
他端口。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
安装完毕图像如上,点击 Finish
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
开始运行,输入 services.msc,进入系统服务
Apache 服务
在浏览器输入:http://localhost
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
进入 bin 目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
拷贝这两个文件
进入 Apache 的安装目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
进入 modules 目录
将刚才选中的两个文件粘贴到这里
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
去掉注释
转到 173 行,增加如下两行内容:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
表示将我们之前拷贝的模块导入到 Apache 中
转到该文件的最后,增加如下内容:
<Location /svn>
DAV svn
SVNPath E:/svn/repository
</Location>
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
重新启动 Apache
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
已经整合了
SVN
在浏览器中输入如下地址:http://localhost/svn
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们在</Location>之前输入如下信息。
AuthType Basic
AuthUserFile E:/passwd/passwords
Require valid-user
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
这些信息的作用是:
OK,保存该文件,关闭它。接下来我们需要创建登录信息文件 passwords.
转到 Apache 的安装目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击确定,打开一个新的命令行窗口。
我们在命令行输入命令:htpasswd
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
可以看到,系统已经认出来该命令了。OK,下面让我们开始登录信息的创
建
在前面的配置中,我们知道我们将把存放用户名与密码的文件放在
E:/passwd/passwords,即 E 盘 passwd 目录下的 passwords 文件中。那么
首先我们需要在 E 盘根目录下创建名字叫 passwd 的文件夹。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
出现如下提示
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK,我们看到我们创建的第一个用户已经成功了,现在到目录 passwd
看下
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
用户信息文件已经创建好,用文本编辑器打开。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
因为该用户信息文件之前已经创建好,所以这里不必再使用-c 参数。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
其中-p 参数表示密码不使用加密方式,而是采用通常的字符文本方式,
即明文。
在实际使用当中,这种明文方式很少使用,在这里只是起到演示的作用。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在浏览器地址栏输入 http://localhost/svn
我们看到这时出现认证窗口,只有输入有效的用户名与密码才能登录成
功,并且登录窗口的标题为:Subversion Repository 就是我们方才在
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在输入我们刚才建的用户信息:hello/world 并确定
我们看到,输入合法的用户信息后,用户就可以成功登录,并查看 SVN
仓库中的项目信息了。
在 E 盘下新建一个目录 http
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
出现的窗口中输入仓库地址:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
输入 google/world 进行登录。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
如图,可以查看服务器端所有仓库的文件和目录。与我们之前使用 svn
协议时一样。我们也同样可以进行 checkout
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
可以看到命令成功执行了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
顾名思义,SVNParentPath 指的是仓库的根目录,也就是所有项目的根
路径,那么在我们这里 SVNParentPath 就应该是 E:/svn/repository,然后我
们可以将自己的项目分别建立在这里目录之下的不同子目录中,而不必都建
在这个根目录之下,这对后面即将讲到的分级权限认证也有很大帮助。
将 SVNPath 改为 SVNParentPath,其他不变,保存,关闭。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
重启 Apache
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
这时我们发现我们更改后已经无法浏览仓库内容了,这是由于我们之前
创建的仓库都是以 repository 为根路径的,所以一旦将它改成 ParentPath 后
就无法正常访问了。实际上,在公司里,我们要 import 一个项目到 SVN 上,
一般都不会 import 到根目录中,而是 import 到项目特定的目录中,这样当从
SVN 中检出时我们也只会检出特定的项目,而不是将 SVN 中所有的项目全
部检出来,因为仓库中可能有很多个其他项目。
OK,现在我们就来实践一下。
在 E:\svn\repository 下新建一个仓库。首先建立一个目录:subsvn
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
创建一个目录 try,然后在其下建立一个目录和一个文件,方式同前,并
在文件中输入一些文字。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
一个子仓库 subsvn 中。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
访问成功进行。
如果想让用户可以读仓库中的文件,而不能写内容到仓库中,比如不能
commit 到仓库中该怎么办呢?回想我们之前访问 JBOSS 的 SVN 仓库就遇到
了这种情况,不过 JBOSS 提供了很好的解决方案,其实用 Apache 的配置文
件同样可以做到。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
这表示对于匿名用户可以读,但是只对认证用户开放写操作。
重启 Apache.
通过浏览器访问资源库
我们看到,并不需要我们输入认证信息。说明我们的配置是正确的。现
在用 TortoiseSVN 将该项目检出,然后修改文件再提交,看看是否如预期。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
删除该目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Checkout
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Checkout 操作并没有提示要我们输入认证信息。
修改 abc.txt 然后提交
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到需要我们输入认证信息才能提交成功。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
确定
提交成功,一系列的操作说明我们的配置没有任何问题。
新建仓库名为 helloworld
仓库已经建好
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在我们已经有了两个子仓库:subsvn 和 helloworld
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
使用 TortoiseSVN 进行 import
输入认证信息
成功导入
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
将其中的内容更改为如下:
<Location /svn>
DAV svn
SVNParentPath E:/svn/repository
AuthzSVNAccessFile E:/passwd/policy
AuthType Basic
AuthUserFile E:/passwd/passwords
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Require valid-user
</Location>
我们看到,实际上这部分配置中增加了如下配置:
AuthzSVNAccessFile E:/passwd/policy
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
打开该文件,增加如下内容
[helloworld:/]
hello=rw
google=r
Microsoft=
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
保存,关闭。
重启 Apache。先删除保存在本地的用户认证信息。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
删除
在浏览器中访问 http://localhost/svn/helloworld
输入 microsoft/world
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
如图,我们可以看到,microsoft 已经被我们配置成不能读取也不能写入,
所以服务器给我们了 Forbidden 的信息,关闭浏览器,重新打开,输入同样
的网址,这次认证信息输入 google/world
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
当我们访问:http://localhost/svn/subsvn 时出现如下界面:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在公司里都有不同的项目组,每个组对应自己的仓库,一个组有很多组
员,如果对于每个组员都去指定他的访问权限显得十分繁琐,我们可以利用
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 作者:风中叶
服务器中的仓库是软件公司最重要的无形资产,所以备份非常重要。
对于备份,有两种方式:一是直接拷贝仓库到其他地方,优点是简单,
缺点是当拷贝过程中有用户对 SVN 进行操作则会出现不一致问题,所以这种
方式不提倡使用;
二是采用 SVN 提供的命令,
这也是我们要讲述的主要方式。
回到 E 盘的根目录
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
生成的备份文件
我们看到,备份是多么容易,当然我们也可以指定备份的目的地是网络
上的其他计算机。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
7 SubVersion 整合 Eclipse
Eclipse 是一个非常优秀的集成开发环境。IBM 已经花了多年的时间开发
基于 Java 的公开源代码软件 Eclipse,并在其中投资了 4000 万美元。这个在
IBM 支持下的开放源代码项目经过一个时期的发展完善,已经为广大 Java 开
发者所熟悉。Eclipse 的出现,为 Java 开发者提供了免费使用强大的 Java IDE
的机会,通过集成大量的插件,Eclipse 的功能可以不断扩展,以支持各种不
同的应用。本章介绍如何使用 SubVersion 协同 Eclipse 进行版本控制。
在浏览器中输入如下地址:http://subclipse.tigris.org/
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
进入 Subclipse 的主页
点击页面左边的 Downloads
点击
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
下载
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
选择菜单 windowpreferencesTeam
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们建立一个 Java 工程
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在工程中建立一个包 com.test.svn
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在包下建立一个类 Test
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在该类中增加一些代码
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
将透视图转到 Subversion 中
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
在左边新建一个远程仓库位置
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
输入:http://localhost/svn/helloworld
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
出现认证信息输入窗口,我们输入 hello/world,并保存认证信息
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
成功地和服务器建立了连接
回到 Java 透视图
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
选择 SVN
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Next
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Next
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Finish
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
出现提交对话框,全部选择,确定
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
根据提示,我们得知,我们导入成功了,从输出来看,实际上 Subclipse
执行了很多步骤,
先是在服务器上创建目录 svn,
然后 checkout,
最后 commit。
这样我们的项目就直接与 SVN 发生了联系,而不必象之前那样,还要再删除
该项目,
然后重新 checkout,
这种行为与 CVS 一致,
大大方便了我们的使用。
项目的每个目录和文件前都有一个小瓶,表示和服务器文件一致。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
表示内容一致的小瓶
在这里我们为了体现真实开发中多用户操作的特点,再建立一个 Java 工
程,然后使用这两个工程同时进行操作,这样我们就能很真切看到 SVN 是如
何为我们管理仓库内容的,并且这也是在实际使用当中所发生的情况。
启动另一个 Eclipse,选择不同的工作空间
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
这样我们就在一台机器上同时开启两个 Eclipse,模拟两个用户的操作
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
仿照之前的方式再建立一个资源库位置
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
这里需要注意:这次连接时并没有提示我们输入认证信息,这是因为我
们之前连接时已经将认证信息保存起来了,所以这时就直接用我们刚才保存
的用户信息,即:hello/world。那么之后两个工作空间的操作都会使用同样的
用户认证信息。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Next
Finish
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
为了不产生混淆,我将第一个工作空间称为空间 1,将第二个工作空间
称为空间 2
我们增加了一行代码,保存。然后右键该文件,选择 Teamcommit
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK.
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
根据命令行输出,我们看到我们的提交已经成功了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
这时就会打开文件比较窗口
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到已经呈现出来本地文件和服务器上文件的区别,并已经标识出
来,其中左边的表示本地文件,右边的表示服务器上的文件。
这时我们进行 update 操作
右键 Test.java,选择 Teamupdate
我们看到这时本地文件已经成功的更新到了服务器的版本
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在我们再进行一次操作,这次我们在两个工作空间中同时修改
Test.java,并且修改不同的地方,然后分别提交,我们看看 SVN 是如何解决
冲突的
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
修改的地方是将之前的一部分代码删除,然后增加一些代码。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到文件已经成功提交了
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在我们来进行 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 作者:风中叶
多出三个文件
这些文件是当冲突发生时,SVN 为我们生成的临时文件,分别是当前客
户端的最新文件,服务器上最新文件以及客户端之前的文件,当我们修改完
冲突后需要删除这些文件,使用如下命令 TeamMark resolve
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK,我们发现这三个临时文件已经被删除了。
再次提交
OK
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们这时发现,修改后的文件已经成功的提交到了服务器端。
说明:提交冲突是在实际项目开发中遇到最多的一种情况,遇到这种情
况时一定要与小组成员进行讨论来决定文件的最后版本,这也同时说明了交
流在开发中的重要性。另外当修改完冲突后一定要 resolve 一下该文件,否
则该文件将永远不能提交成功。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
右键 Test.java,选择 Teamlock
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK
已经被锁定
这时 Test.java 文件已经被锁定,其他用户将无法对该文件的修改提交到
SVN 服务器。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
修改后进行提交。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK
这时我们发现提交失败,原因就是该文件已经被锁定了
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
这时我们回到空间 1,将该文件解锁。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到提交成功。
注意:一般情况下,请不要将文件锁定,除非你要很强烈的要求,不希
望其他用户对该文件进行修改,否则会影响项目的开发。
我们可以查看项目中某个文件的所有版本历史,方法是右键 Test.java,
选择 TeamShow in History Resource
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
双击某个版本号就会查看到该文件所有的版本修订历史,这非常方便我
们查看某个文件以前的历史状态。
有些时候我们对项目中的某个文件进行了一些修改,后来发现修改的不
正确,想要进行恢复,使之恢复到上一次 update 后的版本,这时我们就可以
使用 Revert 命令。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
增加的内容
现在我想将该文件恢复到之前的状态,右键 Test.java,选择
TeamRevert…
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK.
为了实现版本管理,SVN 会在工作区的每个目录下都生成一个隐藏
的.svn 文件夹,而我们有时却希望得到一个干净的没有.svn 文件夹的项目结
构,比如发布软件时,这种情况下就可以使用 Export 功能
右键 svn 项目,TeamExport
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
确定
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到,一个干净的项目就导出来了。
高效的分支(branching)与标签(tagging)功能
先说标签功能,通俗的讲,标签就是某个时间点的快照(snapshot)
,我
们可以在项目进行到一些重要的里程碑之时为之建立标签,这样可以方便以
后随时取出这些历史版本。我想你会有一个疑问:SVN 不是本身就有随意取
出任何一个历史版本的功能吗?是的,标签的作用主要是为了给这些特定的
历史版本取一个友好的名字,以方便使用和维护。
分支则是用于创建多个并行的工作线,比如,当我们的一个项目需要为
某个用户提供一些特殊的功能时,那么就可以为之创建一个分支,这样能够
保证大部分代码的共用,也使得整个项目变得容易维护和管理。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
那分支和标签又有什么不同呢?不同之处仅仅在于其“约定成俗”的含
义,标签意味着你不会再对其进行修改,而分支意味着你会对它进行开发 。
二者在实现上却是一样的,都是通过 Branch/tag 命令执行。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
将 url 路径改为:http://localhost/svn/helloworld/svn2,确定
我们等待一段时间后发现,我们的动作失败了。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
难道是我们使用方式不正确?其实不是,失败的原因不在于我们的操作,
而在于杀毒软件,我的机器上装的是卡巴斯基,正是由于它的阻止,我们动
作导致失败,解决方案是在进行该动作时,可以先停止卡巴斯基的监控,待
成功执行后再开启它的监控。如果读者在使用时也遇到这个问题,可以先停
止本机杀毒软件的实时监控再重新做一次即可。
OK,关闭卡巴斯基的实时监控后我们再尝试一次。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
确定
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到命令成功执行。
这时用浏览器查看该地址:http://localhost/svn/helloworld
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
我们看到了我们方才创建的分支 svn2,以后我们可以象使用其他项目一
样来使用该分支。
我们也可以通过配置方式来创建分支或标签。
右键项目名,TeamConfigue Branch/Tag
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK,创建成功,然后进行项目的提交。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK
右键 svn,TeamSwitch
在这里面可以选择你要转到的分支或标签
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击 Browse…
我们转到刚才创建的分支
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
根据命令行提示,我们的转换是成功的。
那么现在就可以在这个分支中进行开发了,也可以随时转到主干里面。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
8 SubVersion 整合 NetBeans
SubVersion 与 NetBeans 的整合更加容易,因为 NetBeans 本身已经内
置了 SVN 客户端,非常容易使用,我们现在以实例的形式展现二者的整合操
作。
首先启动 NetBeans
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
确定
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
输入必要的信息,现在对于这些信息,大家应该都很清楚其含义了。
确定
完成。
现在修改一下 Main.java.然后提交
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
进行提交
Commit
我们看到命令已经成功执行了。
注意:NetBeans 现在还是测试版,所以有些功能会有问题,大家在使
用时需要注意
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
点击 Download 链接
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
保存。安装
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
现在启动 vs.net2005
集成成功
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
编写代码如下:
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
OK
OK
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
Commit
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
命令成功执行。
浪曦视频在线
深入浅出系列之二_SubVersion 作者:风中叶
10 后记
至此,这个 SubVersion 实用指南教程就结束了,写作过程中也参考了网上
很多资料.该教程不足和错误之处再所难免,还希望大家多提宝贵意见.写这个
教程的目的就是帮助大家尽快掌握 SVN 这个强大的版本管理软件,提高团队
开发效率,为开源世界贡献自己的一份绵薄之力.
浪曦视频在线