是前面公司开始使用svn时候的培训时候准备的资料,发出来,希望对使用svn的兄弟们有所帮助。里面的相关软件版本可能已经不够新了,但新的软件的大概操作方式也基本是相通的,同时,SVN的基础概念也没有发生过变化。

 

第一部分:基础使用

 

工具安装:

1. Subclipse EclipseSvn插件。安装、使用都很简单。当前最高版本1.2.4,支持Eclipse版本3.23.3。这个插件的优点是版本比较、合并很清晰,但前提是要用到Eclipse

 

安装方法:打开Eclipse,选择菜单栏中的 Help -> Software Updates -> Find And Install

 

选择Search for new features to install,然后 Next 

 

点击右边的New Remote Site按钮,出现的对话框中,Name项可以随便填写,例如subclipseURL项填写:http://subclipse.tigris.org/update_1.2.x。然后确定。

 

确定之后,在网站列表中,可以看到新加入了Subclipse一项,钩选之,然后Finish。稍等n秒,出现如下界面:

钩选下面的subclipse1.2.4。然后一路Next,或者Finish。就开始安装了。注意后面有一部需要选择同意他的使用协议。安装时间根据网速的不同而不同。

 

2. TortoiseSVN 这个是Windows操作系统上的Svn客户端。有中文语言包,与Windows系统结合得比较好,可以直接在资源管理器中做版本管理操作。这个工具的优点是小巧,不依赖别的什么软件,缺点是比较、合并等界面我觉得不太理想。

 

安装文件下载地址:http://tortoisesvn.net/downloads,注意这个页面上有TortoiseSVN的安装文件,还有语言包,最好都下载吧。

 

安装TortoiseSVN完成后,要求重新启动机器。

 

3. AnkhSVN,这个是VS.NETSVN插件,我没有用过,有兴趣的同事可以查一下。

 

工具使用:

 

1.Subclipse 按照基础操作类型,描述如下:

 

检出项目:在Eclipse的项目导航区域点击右键,Import,出来的对话框中选择最下面的从SVN导入项目。然后选择列表中的svn服务器地址,或者创建新的svn服务器地址。然后一路确定,要输入用户名密码的话按照帐号管理人分配的帐号输入就可以了。

 

共享项目:意思是把一个目前只在我机器上的项目发布到SVN版本库。在项目上点击右键,选择Team -> Share Project。然后选择SVN,后面的步骤就基本上一样了。

 

比较:比较本地版本和服务器上的版本的差异,选择Team -> 与资源库同步。比较的结果中,灰色的向右的肩头代表本地版本作了修改,还没有提交到服务器。蓝色的向左的箭头代表尤其他人修改了该文件,并且提交到了版本库,本地文件需要更新。红色的双向箭头代表本地文件和服务器上的文件有冲突,需要合并。

 

在比较结果上,点击右键,可以执行更新、提交等操作。

 

更详细的文档:

 

A. Eclipse安装Subclipse之后,也会安装Subclipse的文档,点击Help -> Help Contents,左边的树上会列出所有的文档,其中有Subclipse的文档。英文的,但有截图,说得也很好懂。(推荐)

B. http://dev2dev.bea.com.cn/techdoc/20060620822.html

 

2.TortoiseSVN,安装语言包之后,直接在资源管理器的目录上点击右键,就可以看到有TortoiseSVN的相关操作了。

 

检出项目:建立一个空目录,在目录上点击右键,选择SVN检出,后面按照提示输入地址等信息就可以了。

 

共享项目:在项目目录上点击右键,TortoiseSVN -> 导入,填入地址,按照提示操作就可以了。但是注意,完成之后,版本库中已经有了这个项目,但你本地的这一份项目和版本库依然没有任何联系。此时要新建立一个目录,执行上面说的检出操作。

 

比较、提交、更新等操作就使点击相应的选项。略。

 

另外还有两个经常用到的操作是锁定和还原。一个人锁定某个文件或者目录后,别人都不能锁定,也不能提交。另外,如果我从服务器上更新下来一个文件a.txt,修改了一部分内容后,又发现改得不好,希望恢复到服务器上的样子。那么可以执行还原操作。

 

更详细的文档:

 

A.安装TortoiseSVN中文包之后,其帮助文档也成了一个半中文半英文的翻译版本。值得一看。

B.http://www.subversion.org.cn/tsvndoc/ (推荐)

C.http://fairyfish.net/2007/09/08/tortoisesvn-introduce/

 

 

第二部分:高级使用

 

主要包含如下内容:打版本标记、分支操作

 

标记和分支可以理解为都是项目的一份拷贝。只不过用途不同。而实际上这两个东西在SVN服务器上是没有区别的。

 

建立标记、分支:所谓打标记,和CVS里面的Tag as a version是一个意思。就是整个项目的当前状况拍一个照片,放在某目录,日后方便查看。例如我们可以记住某项目的134版本是这个阶段工作的阶段性成果,而使用标记,我们可以把这个项目的134版本拷贝一份放在某个目录,并命名为project_a_final_20080227。以后任何时候都可以从这个位置方便的找回这个版本。

 

Subclipse中,SVN操作选项中有Tag/Branche选项,点击之,第二个地址就是tag的存放地址(分支、标记存放在哪里都有一些一般性的建议,关于版本库的规划请参见另外一份文档《版本库结构规划建议》)。

 

而在TortoiseSVN中,也有分支/标记这样的选项。操作起来大同小异。

 

分支的创建和上面的Tag创建是完全一样的,只不过我们一般建议把分支存放于一个叫做branches的目录。

 

切换分支:假设我们创建了一个分支叫做branchesA。之后开发人员可以工作在主干或者这个分支上,二者之间的切换也很简单,菜单中有一个“切换”选项。点击按提示操作即可。

 

分支合并:这个是分支开发中最重要的一步。假设BranchesA是为了一个新功能的开发而创建的,那么该功能开发完成后,需要把这个分支合并回到主干上来。这时可以选择SVN操作菜单中的“合并”功能。

 

所谓合并,实际上是比较两个资源的不同,找出差异,并将这个差异应用到本地工作拷贝上。

合并的过程中涉及到的两个资源一般称作起始路径和目标路径。这两个路径的选取是很随意的。举以下几个例子:

 

起始路径 http://domain/svn/project/branches/b1 创建分支时的版本(例如130

目标路径 http://domain/svn/project/branches/b1 当前最新版本(例如200

假设本地拷贝 该项目的主干版本

 

合并操作可以表达为:

 

本地版本 + (分支当前版本 - 分支创建时的版本) =  合并后的版本

(我们可以将开发理解成在版本库上的一种增量操作,此时括号中的减法得出的是一个正值,例如“增加了a.txt这个文件”)

 

合并意义:比较分支b1创建时的样子和现在的样子,找出差异(注意这个差异实际上就是b1分支的开发成果),将这个差异应用到本地工作拷贝。而当前工作拷贝是项目的主干本本,这就意味着把分支b1的开发成果应用到了主干上,经过检查、提交到版本库,最后达到了将分支开发所完成的功能合并到了主干上的目的。

 

------------------------------------------------------------------------------------------------------------

 

起始路径:http://domain/svn/project/odps 上一次提交给信访项目时的版本 120

目标路径:http://domain/svn/project/odps 当前版本 145

假设本地拷贝:信访项目的当前版本

 

合并操作表达如下:

 

项目A当前版本 + (框架当前版本 - 框架上次提交给项目时的版本) = 项目A进行了框架升级后的版本

(注意其中的减法结果依然是正值)

 

合并意义:比较上一次把odps框架提交给信访项目使用时的样子和该框架现在的样子,找出差异,应用到本地工作拷贝。而当前工作拷贝是信访项目,这就意味着把ODPS框架这个阶段开发的成果应哟功能到信访项目中,经过检查、提交到版本库,最后达到的目的是把信访项目中的ODPS项目部分进行了升级(ODPS框架和信访项目是由不同的小组开发的,所以这个操作很有意义)。

 

------------------------------------------------------------------------------------------------------------

 

起始路径:http://domain/svn/project/trunk 当前版本 300

目标路径:http://domain/svn/project/trunk 某个历史版本 250

工作拷贝:http://domain/svn/project/trunk 当前版本 300 ,与起始路径相同

 

注意:这个例子和上面两个例子不同,上面两个例子其实路径在时间上都早于目标路径。

 

合并操作表达如下:

 

项目当前版本 + (项目历史版本250 - 项目当前版本) = 项目回滚后的版本

注意这一次括号中的减法操作按照上面的规则来讲得出的结果是负的。也就是说,假设我们在开发过程中新增了一个文件a.txt,那么减法(新版本 - 旧版本)表达的含义是“以当初的版本位处发现,看现在的版本”,得出的结论是新增了一个文件a.txt,而减法(旧版本- 新版本),也就是把起始路径和目标路径的时间顺序倒了一下,表达的含义就变成了“站在今天,看过去有什么不同”,得出的结论是少了一个a.txt文件。

 

合并意义:从现在看过去,整个差异部分“加了一个负号”,经过检查、提交,最后的结果是当前项目恢复到了历史上的250版本。

 

其它:单一差异文件,补丁

 

上面的分支合并操作是比较两个资源的不同,将差异应用到本地工作拷贝。在此之外,SVN可以比较两个资源的不同,并将这些不同之处记录在一个独立文件中。而这一个差异文件也就是所谓的补丁。