1.svn环境搭建

在应用myEclips 8.5做项目时,svn会成为团队项目的一个非常好的工具,苦苦在网上寻求了一下午,终于整合好了这个环境,在这里简单介绍下,希望能为刚开始用svn的朋友一点点帮助。

 svn环境需要(1)服务器端(2)客户端(3)应用在myeclipse中的svn插件

 第一步,安装svn服务器端。我用的是VisualSVN-Server-2.1.3这个版本的。

          安装完后,打开VisualSVN-Server,创建一个根目录test,则这个目录在服务器的地址 为:https://192.168.1.66:8443/svn/test;  ip地址为你本机的地址,8443是你安装服务器时设定的端口。下来你可以设置用户及权限。



第二步,安装客户端, 我使用的是TortoiseSVN-1.6.10.19898-win32-svn-1.6.12这个版本的客户端工具。随意提供一个地 址:http://hlbr.onlinedown.net/soft.php?id=89603。  安装完毕后重启电脑,你会发现右键中多出来一些功能了,表明客户端安装成功。(附件中VisualSVN_Server安装_配置_使用图文教程.rar 是一个安装教程)



第三步,myeclips8.5下安装svn插件。在官网http://subclipse.tigris.org/下载了最新插件 site-1.6.15.zip包,

解压后使用其features和plugins两个文件夹,参考网上做法,去掉其中一些包,myEclipse启动才不报错。
     (1)MyEclipse 8.5根目录D:\Program Files\Genuitec\MyEclipse 8.5下新建名为SVN的文件夹,将这两个文件夹放进去。(后边提供的SVN插件包就是我们要用到的SVN文件夹)
     (2)在D:\Program Files\Genuitec\MyEclipse 8.5\dropins 目录下建立一个SVN.link文件,其中内容为:
path=D:\\Program Files\\Genuitec\\MyEclipse 8.5\\SVN  。也就是这个link指向刚才你建的文件夹。(后边提供的SVN-link.rar是这个link文件)
     (3)重新启动MyEclipse。

第四步,介绍下如何使用svn来应用你的项目。
    (1)在myeclipse下新建一个项目svntest,右键team-Share Project,,然后选择SVN,点next,--创建新的资源库位置, 点next后输入url:https://192.168.1.66:8443/svn/test,输入用户名和密码后就在服务器端test目录下预发布你的项目。
     (2)你会看到你项目中有?的标志,这时项目上右键team-提交,会发现你的项目问号消失,提交成功。到此你的项目发布成功了。
     (3)测试一下你发布的项目能否在局域网共享使用。客户端只需安装TortoiseSVN工具就可以下载你发布的项目了。团队其他机子上新建一个文件夹名为svntest(名字任意),右键checkout,输入服务器地址https://192.168.1.66:8443/svn/test,输入用户名和密码。ok ,会提示下载成功。

      至此,svn在myeclipse8.5的环境搭建成功了。
        你可以在myeclipse中提交,更新,删除,添加你对项目的修改,并更新到服务器中。团队其他组员只需本机安装客户端,便可以从服务器端下载最新版本 的项目,使用时,应先进行update操作,保证你的是最新的版本。当修改一个页面后,也应先update,再commit,防止冲突。
2.建立版本库,设置用户和权限

3.1  运行Subversion服务器需要首先要建立一个版本库,可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接在控制 台下运行:svnadmin create  E:\chwencong\svnhome会自动在E:\chwencong\svnhome目录下生成很多文件。  

3.2 修改配置文件,配置文件都存放在版本库的conf目录下,如E:\chwencong\svnhome\conf,里面有三个文件并对其做如下修改:  

3.2.1 修改svnserve.conf文件,去掉一下各行前面的“#”。  
anon-access = read  
auth-access = write  
password-db = passwd  
authz-db = authz  
realm = svnhome(注意)  

以上 realm 为 svn 库的名称,同一个 realm名称会共享使用此SVN的用户名和密码  

3.2.2 修改passwd文件,建立用户名与密码,在[users]下面添加形如:username = password格式的行,一行代表一个用户。  

admin = admin  

chwencong = 123  

3.2.3 修改authz文件,分配角色、权限  

[groups]  

manage = admin  

user = chwencong  

[/]  

@manage = rw  

@user = r  

以上的 manage=admin 和 user=chwencong 如果有多个用户属于此用户组,则需用 逗号分隔用户名, 如:  
manage=admin,root  
user=aa,cc,rr  

而 @manage 表示 manage 用户组所拥有的权限,rw 代表可读可写,而 r 表示只可读  


4、          启动服务  

在控制台下运行:svnserve -d -r E:\chwencong\svnhome(没有分号)  

注意:不要关闭命令行窗口,关闭窗口也会把svnserve停止  

5、          导入、导出  

5.1导入:进入到待导入的目录,如cd E:\chwencong\workspace\TestProject  (TestProject为项目名),然后运行svn import svn://localhost/TestProject -m "initial  import" --username admin --password admin  

正常情况就会在控制台出现如下信息:  

增加           .classpath  

……  

提交后的版本为 1。  

5.2 导出:进入到存放导出项目的目录,如导出D:\code下:cd D:\code 然后运行svn checkout  svn://localhost/TestProject --username chwencong --password chwencong  

正常情况就会在控制台出现如下信息:  

A    svnhome\.classpath  

3.使用图解

------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


首先就是安装程序啦,这就不用讲解了吧!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


按照默认设置安装完成后,重启电脑,点击右键会有如下两个选项!选择当前选项即打开SVN目录!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


输入贵公司SVN地址!


------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


然后就可以看见工作目录了。贵公司的所有工程文件都可以共享了。



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


如果你想下载某个文件夹或者文件的话,可以在文件上点击右键,选择CheckOut!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


第一个是当前目录,第二个是你想下载到你的电脑的什么地方,每个公司的要求不同!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


想要添加文件的话,新建文件!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


点击右键,选择Add选项,文件上方便会出现一个+字!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


点击右键,选择SVN Commit便会提交了,其他人都可以看见你的文件了!提交完成后+号就变成绿色对勾了!

有时候,因为Windows本身的问题,您可能会看到有些icon没有变成绿色的勾勾。此时,多按F5几次,应该就可以解决这个问题。如果,仍然不行,表示您之前的commit动作真的有问题。请仔细检查之前的commit动作是否正确。



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


为何需要更新?由于版本控制系统多半都是由许多人共同使用。所以,同样的档案可能还有人会去进行编辑。为了确保您工作目录中的档案与大家的档案是同步的。建议您在编辑前都先进行更新的动作。在此,我们都先假设您已经将档案check  out过一次。现在要说明的是如何在一个check out过的目录进行update。在想要更新的档案或目录icon上面按下鼠标右键。并且选择SVN Update。


------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


有时我们需要回溯至特定的日期或是版本,这时就可以利用SVN的Update to revision的功能。在想要更新的档案或目录icon上面按下鼠标右键。并且选择SVN->Update to revision。



点击后会弹出这个对话框,可以回溯到Head revision。当然也可以选择特定的版本。记不住版本就选择show log选择一个!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


每次改动前都要get lock,这样其他人就不能更改此文件了。 不然两个人修改同一个文件的话就麻烦了。锁上后显示一个小锁!没反应就F5刷新!



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


修改完毕后当然要解锁了!Release lock!


------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------

想在trunk下建立一个新的brance?在trunk上右键如下选择。



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------

请先确认From WC at URL: 中的目录是您要复制的来源目录。接着,在To  URL中输入您要复制过去的路径。通常我们会将所有的branch集中在一个目录下面。以上面的例子来说,branch档案都会集中在branch的子目 录下面。在To  URL中您只需要输入您要的目录即可。目录不存在时,会由SVN帮您建立。特别需要注意的是SVN因为斜线作为目录分隔字符,而非反斜线。

接着在Log message输入您此次branch的目的为何。按下OK就可以了。



------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------


想要恢复,选择Merge就ok了!


------------------------------------------------------- 我是分割线 --------------------------------------------------------------------------------------

本节向大家描述一下版本控制工具SVN使用方法,在学习SVN过程中这是必须要掌握的知识,在这里和大家分享一下,欢迎大家和我一起学习SVN使用方法。

SVN帮助:svnhelp

(1)svnimport[PATH]URL
将未纳入版本控制的文件或目录树提交到版本库。递归地提交PATH的副本至URL。如果省略PATH,则默认为“.”

(2)svncheckoutURL[@REV]...[PATH]
从版本库签出工作副本。如果指定REV,那么它确定了从URL首先查找的版本。如果省略路径参数,则URL最末尾的目录名作为目标目录名。如果指定多个URL,则依次将其签出到PATH的子目录中,子目录名就是URL最末尾的目录名。

(3)svnaddPATH
把文件和目录纳入版本控制,通过调度加到版本库。它们会在下一次提交时加入。

(4)svncommit[PATH...]
commit(ci):把工作副本的修改提交到版本库。常用参数:-m[--message]ARG:指定日志信息ARG

(5)svnupdate[PATH...]
将版本库的修改合并到工作副本中。如果没有指定版本,则将工作副本更新到HEAD版本。否则同步到-r选项所指定的版本。

(6)svndeletePATH-m"deletetestfle"
或者直接svndeletetest.php然后再svnci-m'deletetestfile‘,推荐使用这种简写:svn(del,remove,rm)
用法:1、deletePATH...
2、deleteURL...
1、每个PATH指定的项目会被调度到下次提交时从版本库删除。除非给出--keep-local参数,工作副本中没有提交的文件和目录会被立即删除。如果PATH是未版本控制或者已修改的项目,或者包含这些项目,那么仅当给出--force参数时这些项目才会被删除。
2、每个URL指定的项目会通过立即提交从版本库中删除。

(7)svnmkdir:创建纳入版本控制的新目录。
用法:1、mkdirPATH...
2、mkdirURL...
1、每个以工作副本PATH指定的目录,都会在本地创建,并且加入增加调度,直到下次提交。
2、每个以URL指定的目录,都会通过立即提交在版本库中创建。

(8)svnrevertPATH...:将工作副本文件恢复到原始版本(恢复大部份的本地修改)。注意:本子命令不会访问网络,它解除任何冲突的状态。但是,它不恢复被删除的目录。

(9)版本控制SVN使用其他命令还有:
摘自:http://blog.chinaunix.net/u1/38994/showart_487961.html
加锁/解锁svnlock-m"LockMessage"[--force]PATH
例如:svnlock-m"locktestfile"test.php

svnunlockPATH
查看文件或者目录状态
1)svnstatuspath(目录下的文件和子目录的状态,正常状态不显示)【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svnstatus-vpath(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svnstatus、svndiff和svnrevert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svnst

查看日志svnlogpath
例如:svnlogtest.php显示这个文件的所有修改记录,及其版本号的变化

查看文件详细信息svninfopath
例如:svninfotest.php

比较差异svndiffpath(将修改的文件与基础版本比较)
例如:svndifftest.php

svndiff-rm:npath(对版本m和版本n比较差异)
例如:svndiff-r200:201test.php
简写:svndi

将两个版本之间的差异合并到当前文件svnmerge-rm:npath
例如:svnmerge-r200:205test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)版本库下的文件和目录列表svnlistpath

显示path目录下的所有属于版本库的文件和目录
简写:svnls
版本控制SVN使用中解决冲突svnresolved:移除工作副本的目录或文件的“冲突”状态。
用法:resolvedPATH...
注意:本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让PATH可以再次提交。
输出指定文件或URL的内容。svncat目标[@版本]...如果指定了版本,将从指定的版本开始查找。svncat-rPREVfilename>filename(PREV是上一版本,也可以写具体版本号,这样输出结果是可以提交的)

代码库URL变更svnswitch(sw):更新工作副本至不同的URL。
用法:1、switchURL[PATH]
2、switch--relocateFROMTO[PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svnupdate”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。本节关于版本控制SVN使用介绍完毕。

本节和大家一起学习一下SVN使用方法,主要从三方面来介绍,在这里和大家分享一下,希望本节的介绍对你的学习有所帮助。

SVN使用:

1. 首先是安装TortoiseSVN这个Win下的客户端(当然用subversion自己的svn这个客户端也可以完成所有操作,理论上)。这个客户端是集成到Explore里的,所以没有什么独立的窗体,所有操作右键菜单来完成。

2. SVN使用基本流程
下面说的命令都与TortoiseSVN菜单上的名称一致。
a. 初次(initial)取出(checkout)repos,建立本地工作拷贝(WC WorkingCopy)。
b. 与repos同步(update),保证将要进行的编辑是最新版本。
c. 编辑源代码(包括创建、修改、删除)。
d. 与repos同步(update),提交之前先要同步到最新的版本,保证所有在自己之前的有关提交已经在本地有所知晓。
e. 解决冲突(resolve conflict)。
f. 提交(commit),一定要写上这次提交的内容的摘要,便于以后查阅。
g. 继续b。
每次开始新的编辑前的同步repos很重要,另外经常地update没有坏处,特别是多人项目中。如果每次提交(commit)前不进行更新(update)的到最新的版本的话,svn会提示当前的拷贝过期,需要更新。
在 使用的过程中,时刻注意当前的工作拷贝(WC WorkingCopy)所对应的URL很重要,特别是当有了branches和tag等时候。使用svn   info可以查看到这些信息。使用TortoiseSVN时,通过下面的操作查看这些信息:右键单击工作拷贝的根文件夹(不是上级文件夹),菜单中选择则 属性(不是TortoiseSVN那个菜单),然后在出现的对话框中选择Subversion标签就可以看到了。

3. SVN使用branches
(关于branches的内容可以在svn-book:Chapter4 Branching and Merging得到)
当 多个人合作(Sally和John)时,可能有这样的情况出现:John突然有个想法,跟原先的设计不太一致,可能是功能的添加或者日志格式的改进等等, 总而言之,这个想法可能需要花一段时间来完成,而这个过程中,John的一些操作可能会影响Sally的工作,John从现有的状态单独出一个 project的话,又不能及时得到Sally对已有代码做的修正,而且独立出来的话,John的尝试成功时,跟原来的合并也存在困难。这时最好的实践方 法是使用branches。John建立一个自己的branch,然后在里面实验,必要的时候从Sally的trunk里取得更新,或者将自己的阶段成果 汇集到trunk中。
附:TortoiseSVN帮助里的branch的说明:
One of the features of  version control systems is the ability to isolate changes onto a  separate line of development. This line is known as a branch. Branches  are often used to try out new features without disturbing the main line  of development with compiler errors and bugs. As soon as the new feature  is stable enough then the development branch is merged back into the  main branch (trunk).

3.1 创建branch
(详细的解释参考svn-book:Chapter4 Branching and Merging:Using Branches:Creating a Branch)
实际是svn copy操作
$ svn copy SourceURL/trunk \
DestinationURL/branchName \
-m "Creating a private branch of xxxx/trunk."
TorToiseSVN 操作更为简单,只要在working  copy里右键空白,然后在TorToiseSVN菜单中选择Branches/Tags,就可将整个目录分支(branch)出去,或者点击某个文件将 文件单独分支(branch),而且有多种选择,指定是“直接在服务器端copy  HEAD版本”、“直接在服务器端copy指定版本”(这两种相当于svn copy中源和目的都是URL)、“用当前的工作拷贝(WC Working  Copy)生成”。同时还有一个checkbox用于在完成了这次分支(branch)后直接切换(switch)当前的工作拷贝(WC  Working Copy)到分支。  

3.2SVN使用中 使用merge来应用branch的修改

3.2.1 trunk的变化及时更新到branch
例子原型出自svn-book:Chapter 4:Branching and Merging:Copying Changes Between Branches:Copying Specific Changes
接 着前面的例子,John在实验过程中,Sally对原有的某个文件做了一些改动,如拼写检查等,John知道了,希望将这些改动也放到自己的当前的工作拷 贝(WC Working  Copy)中。svn中使用merge指令来完成。假设Sally的修订使repos从Rev345到了Rev346,所以John就是要将 Rev345:Rev346(前:后)的变更应用到当前的WC。使用TortoiseSVN的操作就是在WC中右键空白处,然后在相关菜单中选择 “Merge...”,在弹出的对话框中,From指定比较前项的位置和版本(这里是trunk的Rev345),To指定后项的位置和版本(这里是 trunk的Rev346,可以使用一个复选框使的To的位置与From相同)。
相应的svn merge指令参考后面“merge操作实质”可知。

3.2.2 branch最终合并回trunk
例子原型出自svn-book:Chapter 4:Branching and Merging:Common Use-Cases:Merging a Whole Branch to Another
John经过尝试,终于实现了想法,并通过测试,现在他决定将所有的工作合并到trunk去。
这 里要注意的是,John打算合并的是自己的工作,假设John的branch(johnBranch)开始于Rev233,John的工作提交到 repos是Rev289,那么John的工作是将johnBranch:Rev233到johnBranch:Rev289的内容合并到trunk。而 不是johnBranch:Rev233到trunk:HEAD,因为这个变化包含了对John工作的增加和对trunk中其他人的工作的撤销(如果 John没有及时将他人在trunk的工作合并到自己的johnBranch的话)。
TortoiseSVN的操作是这样的,先 checkout出trunk(也可以switch到trunk),即保证当前的工作拷贝(WC  WorkingCopy)是trunk,然后使用菜单中的“Merge...”,选择From为johnBranch:Rev233选择To为 johnBranch:Rev289。
相应的svn merge指令参考后面“merge操作实质”可知。 下面我们来看一下SVN使用中merge操作的实质。

3.2.3 merge操作的实质
svn merge命令的原型如下
svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
svn merge -r N:M SOURCE[@REV] [WCPATH]
In  the first and second forms, the source paths (URLs in the first form,  working copy paths in the second) are specified at revisions N and M.  These are the two sources to be compared. The revisions default to HEAD  if omitted.
In the third form, SOURCE can be a URL or working copy  item, in which case the corresponding URL is used. This URL, at  revisions N and M, defines the two sources to be compared.
WCPATH is  the working copy path that will receive the changes. If WCPATH is  omitted, a default value of “.” is assumed, unless the sources have  identical basenames that match a file within “.”: in which case, the  differences will be applied to that file.
可以看出merge实际是比较前后(源:目的)两个版本 (revision)之间的差别(用运算符就是 目的 – 源),然后将这些差别应用(施用)到工作拷贝(WC  WorkingCopy)上的一个操作,根据源与目的版本号的先后,出现了“合并”、“撤销”(源版本号大于目的版本号)等不同效果,然后通过提交 (commit)来将这些效果保存到服务器端的repos中。本节关于SVN使用方法介绍完毕。

访问Google code

Google code的地址是 http://code.google.com/  ,如果使用cn去访问好像访问不了,我这里是一片空白。管理项目的话可以直接使用http://code.google.com/hosting/ 地址访问。用Gmail登录进去,页面的中间有【Create  a new project 】,点击以后就可以创建项目了。



二 创建自己的项目

在创建项目的页面,填写项目名,概要和描述,其中项目名开头要小写,还不能有空格和其他符号。然后就是选择版本管理系统,证书等等,这些我也不懂,随便选 吧,反正这有选好了,【Create Project】才可用。这里要注意的是项目名字可能冲突。如果创建成功就可以进入项目管理界面


三 项目管理

项目管理中,上方的菜单【Project  Home】可以看到项目的概述和描述。点击【Source】就可以进行源码的管理。其中有2个地址,一个是Https开头的,一个是http 的,https开头的是带加密的,所以如果要commit新的代码的时候就需要使用这个地址。而如果仅仅是取得代码可以只使用http开头的地址。


使用https的地址的时候需要提供用户名和密码,这里的用户名是Gmail的用户名,而密码是Google给每个项目生成的,而非是Gmail的密码。点击【When prompted, enter your generated googlecode.com password】后面的蓝色连接可以看到密码。这个密码是你所有项目的密码,而不是每个项目一个密码。

四 用户管理

项目建立好以后就可以把其他人加入到项目中,这样就可以共同开发了。首先点击上方的【Administer】,然后点【Project  members】,在下面填入要加入的用户Gmail就可以了。有Project owners,Project committers,Project  contributors。具体解释右侧都有。点击保存后,其他用户登录后,在右上方的【My  Favorite】下就可以看到自己加入的项目了。然后按三中介绍的方法找到密码。



五 其他管理

Google Code还提供了wiki等功能,我没用上,所以不是太了解。



六 安装客户端和VS插件

上面的工作做好后就是上传源码和文档。但是我找了半天也不知道怎么上传。以为是直接网页上上传,原来也要安装SVN客户端。在这里

http://tortoisesvn.net/downloads  可以下载到最新的TortoiseSVN,这个应该是目前用的最多的SVN客户端软件了。E文不好的朋友上面还提供了中文语言包。

安装完客户端后需要重启电脑,然后就可以远程连接到SVN服务器了。其中URL就填写Google  提供的哪个https的URL地址,然后填写用户名(Gmail)和密码(项目密码),保存后就OK了。客户端可以支持连接多个URL,每次启动的时候可 以选择要连接到那一个。


支持SVN的VS插件我使用的是AnkhSvn,http://ankhsvn.open.collab.net/servlets/ProjectDocumentList?folderID=198 这里可以下载到最新版本。目前可以支持到VS2010,之前使用老版本对VS2008支持不好,文件状态不对,而且不能提交,换到最新版的时候就好了。安装的时候配置VS要比较长时间,不要以为是死掉了。


如果只安装AnkhSvn而不安装TortoiseSVN也是可以的,不过你在VS中会发现,操作的功能少了很多,比如分支,合并等等。


七 使用VS进行开发和源码管理

进入到VS中,打开【工具】--【选项】--【Source Control】,默认应该是已经配置好了为AnkhSvn。然后可以点击【文件】-【Subvwrsion】打开服务器上的源码。和其他工具一样,要选择一个本地路径来保存。



1:文件状态介绍

蓝色小勾:Check out状态;橙色小勾:文件被修改状态;橙色小方块:文件修改被保存;加号:新添加文件。


2:SNV版本控制

和VSS不同的时,VSS默认是锁住的状态,需要手动Check Out,而SVN是自动Check Out。那么这样不是会有冲突吗,其实这个和VSS允许多人牵出是一样的。在你Commit的时候,会检查版本,会自动合并或提示冲突或是版本过期等等。


获取最新代码:这个不用说了就是从服务器上拿最新代码,但是如果你修改了文件,然后拉最新代码,这个时候系统会自动吧你修改的不部分和最新代码进行合并,如果有冲突会提示,要修修改冲突。


获取指定版本代码:这个可以通过查看历史,或者指定版本号来拉去指定版本的代码。这是同样会合并代码。需要注意的是,SVN的版本号和VSS不同,是全局版本号,而不是每个文件有一个版本号。这个要特别注意,因为你会发现一个文件版本号可能是跳跃的。


Switch:有这样一个功能,可以把当前版本切换为制定的版本,和获取指定版本不同,他也会自动合并不同的地方。


Revert:恢复功能,恢复到修改前的状态。这个要注意的是,如果你对文件修改,然后获取了最新代码,然后恢复,这个时候是恢复到最新版本,而不是修改前的那个版本。这点要注意


版本冲突:这里版本冲突有2种情况,

如果你当前版本为1,服务器版本为2,你修改或提交,服务器会提示你本地版本过期了,你可以拉最新代码,并解决冲突后再次提交;

如果你当前版本为2,服务器版本为2,而你从服务器获取版本1的代码,修改后,然后提交,这个时候是不会提示版本过期的,会覆盖掉服务器上的版本2,而成为版本3。这样是会冲掉代码的。


锁:SVN提供了锁的功能,就和VSS的单用户Check out是一样的,不能同时修改。但是目前Google Svn不提供锁的功能,所以没有办法使用了。

myeclipse安装svn

一、安装方法:

 方法一、如果可以上网可在线安装

  1. 打开Myeclipse,在菜单栏中选择Help→Software Updates→Find and Install;

  2. 选择Search for new features to install,点击Next进入下一步;

  3. 点击"New Remote Site"按钮,在弹出的对话框中输入:

   name:SVN

   url:http://subclipse.tigris.org/update_1.4.x

   点击OK,关闭对话框,并点击Finish按钮,Myeclipse自动下载插件安装程序;

  4. 下载完插件之后,进入安装画面。

  5. 选择所要安装的SVN插件内容,这里去掉第二个选项Subclipse Integrations,点击下一步;

  6. 选择 "I accept the terms in the license agreements"并点击Next,直到点击Finish即可,进入下一步。

  7. 开始安装SVN插件,安装完成之后,重启Myeclipse。


 方法二、无法连接网络的情况

  1、下载SVN插件
  下载地址:http://subclipse.tigris.org/files/documents/906/46495/site-1.6.5.zip

  2. 在MyEclipse 6.5的安装路径下的plug_in(C:/Program Files/MyEclipse 6.5/eclipse/plugins)下新建文件夹:site-1.6.5;

  3. 打开MyEclipse 6.5,在菜单栏中选择 Help → Software Updates → Find and Install;

  2. 选择Search for new features to install,点击Next进入下一步;

  3. 点击"New Local Site"按钮,找到解压出来的文件夹(site-1.6.5) → 点击OK,并点击Finish按钮,Myeclipse自动加载插件;

  4. 在弹出的菜单中,select the features to  insteall:在刚加进去的路径Subclipse-site-1.6.5这一项前打钩,此时会报错,然后展开Subclipse前的加号,去掉 Subclipse Integration for Mylyn 3.x(Optional)3.0.0前的钩,错误消失 → next → 选 I  accept the terms in the license agreements → next → next →  选中所有的8项,然后Change Location……,在弹出的菜单中选Add  Location……选择在第3步中建的文件夹的路径(C:/Program Files/MyEclipse  6.5/eclipse/plugins/site-1.6.5) → Finish → 再弹出的菜单中选 Install All → Yes

  5. 开始安装SVN插件,安装完成之后,重启Myeclipse。

 方法三、无法连接网络的情况(link链接)

  1、从官网下载 Site-1.6.5.zip

  2、解压Site-1.6.5.zip至${eclipse}/Plugins/Subclipse-1.6.5.zip,并删除  site.xml(很重要)(即把Site-1.6.5.zip解压出来的features和plugins文件夹里所有的jar包和两个XML文件 artifacts.xml、content.xml添加并替换到plugins文件夹下。例如:我应添加在C:/Program  Files/MyEclipse 6.5/eclipse/plugins/目录下)

  3、创建link文件 ${eclipse}/linksSubclipse-1.6.5.zip.link  (即在link文件夹下添加linksSubclipse-1.6.5.link文件)其内容为:  path=C:/Program  Files/MyEclipse 6.5/eclipse/

  4、重启Eclipse就是把subclipse集成完毕


二、安装完成

 1. 在MyEclipse 6.5 菜单栏中选择Window→Open Perspective→Other打开Myeclipse试图列表。这个时候Myeclipse的视图列表中,就出现了"SVN Repository Exploring"一项。

 2. 打开"SVN Repository Exploring"视图。在左边空白区域,单击右键 → New → Repository Location。

 3. 在Url一栏中输入svn://IP,点击Finish按钮。

 4. 选择要下载的项目右键选择checkout 就把项目下载到本地了

三、基本操作

 1.提交工程

      右击工程->小组->共享项目->选择SVN->选择svn://127.0.0.1(如果没有,则创建一个新的资源库)->下一步->完成

  2.下载工程

      在SVN资源库透视图下,点开svn://127.0.0.1,会显示出现在本机SVN上的所有工程,右击你想下载的工程->检出为->下一步->完成

 3.操作工程

      3.1同步

   在MyEclipse J2EE透视图下,右击你要同步的工程->小组->与资源库同步->这时会进入同步透视图,会显示出本机与SVN上内容有不同的文件,双击文件名,会显示出两个文件中哪里不同;

      3.2提交

   在同步透视图下有"灰色向右的箭头,表示你本机修改过",右击该文件,可以选择提交操作;

      3.3覆盖/更新

   在同步透视图下有"蓝色向左的箭头,表示你本机修改过",右击该文件,可以选择覆盖/更新操作;

  4.图标说明

      4.1灰色向右箭头:本地修改过

      4.2蓝色向左箭头:SVN上修改过

      4.3灰色向右且中间有个加号的箭头:本地比SVN上多出的文件

      4.4蓝色向左且中间有个加号的箭头:SVN上比本地多出的文件

      4.5灰色向右且中间有个减号的箭头:本地删除了,而SVN上未删除的文件

      4.6蓝色向左且中间有个减号的箭头:SVN上删除了,而本地未删除的文件

      4.7红色双向箭头:SVN上修改过,本地也修改过的文件

  5.一些我遇到的出错信息

      5.1在上面讲的3.2步输入URL(svn://127.0.0.1)点下一步出现"svnserve.conf:12: Option expected"错误

   你打开svnserve.conf文件中的第12行,该错误是由于该行的前面有空格引起的,把左边多出的空格删除掉即可;

      5.2在上面讲的3.2步输入URL(svn://127.0.0.1/SVN_PRJ)点下一步出现"svn://127.0.0.1/SVN_PRJ non-existent in revision '7'"错误

   URL错了,应该输入svn://127.0.0.1即可



  使用link方式安装以后,如果启动MyEclipse会产生一个冲突

例如: org.tigris.subversion.clientadapter.javahl.win32 1.6.4.jar和eclipse的冲突,还有什么mlyn包冲突,出现红X,安装不成功...

原因是因为插件包中的该jar和eclipse内部的jar包冲突造成的,所以可以选择让myeclipse忽略这些冲突的jar即可,找 到${MyEclipse_HOME}/home/xuliang/Genuitec/MyEclipse 8.5  M2/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info文件,此 处会列出eclipse启动时候可以忽略的插件jar.你会找到你自己的svn插件的默认忽略的jar,例如:

org.tigris.subversion.clientadapter,1.6.4.1,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.clientadapter_1.6.4.1.jar,4,false

org.tigris.subversion.clientadapter.javahl,1.6.4.1,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.clientadapter.javahl_1.6.4.1.jar,4,false

org.tigris.subversion.clientadapter.svnkit,1.6.4,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.clientadapter.svnkit_1.6.4.jar,4,false

org.tigris.subversion.subclipse.core,1.6.5,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.subclipse.core_1.6.5.jar,4,false

org.tigris.subversion.subclipse.doc,1.3.0,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.subclipse.doc_1.3.0.jar,4,false

org.tigris.subversion.subclipse.graph,1.0.7,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.subclipse.graph_1.0.7.jar,4,false

org.tigris.subversion.subclipse.ui,1.6.5,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.subclipse.ui_1.6.5.jar,4,false

org.tmatesoft.svnkit,1.3.0.5847,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tmatesoft.svnkit_1.3.0.5847.jar,4,false


以上这些是默认情况下eclipse葫芦的svn jar,所以加上以下2句,把刚刚冲突的包忽略就OK了

org.tigris.subversion.clientadapter.javahl.win32,1.6.4,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.clientadapter.javahl.win32_1.6.4.jar,4,false

org.tigris.subversion.subclipse.mylyn,3.0.0,file:/home/xuliang/Genuitec/MyEclipse  8.5  M2/myplugin/svn-plugin/plugins/org.tigris.subversion.subclipse.mylyn_3.0.0,4,false


总结:其实以上4种方法中的最后一种也是这个原理,只是他使用java来做这件事情

我们在一些著名开源项目的版本库中,通常可以看到trunk, branches, tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。

trunk是主分支,是日常开发进行的地方。

branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客制化的版本,也可以放在分支中进行开发。

tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。

比如一个项目有main.cpp, common.h两个文件,假设目前在开发的是最新的3.0版本,而且1.0/2.0版本也在进行维护,那么项目树将类似如下样子:

project
 |
 +-- trunk
 +     |
 +     +----- main.cpp  (3.0版本的最新文件)
 +     +----- common.h
 +
 +-- branches
 +     |
 +     +-- r1.0
 +     +     |
 +     +     +---- main.cpp (1.x版本的最新文件)
 +     +     +---- common.h
 +     +
 +     +-- r2.0
 +           |
 +           +---- main.cpp (2.x版本的最新文件)
 +           +---- common.h
 +      
 +-- tags   (此目录只读)
       |
       +-- r1.0
       +     |
       +     +---- main.cpp (1.0版本的发布文件)
       +     +---- common.h
       +
       +-- r1.1
       +     |
       +     +---- main.cpp (1.1版本的发布文件)
       +     +---- common.h
       +
       +-- r1.2
       +     |
       +     +---- main.cpp (1.2版本的发布文件)
       +     +---- common.h
       +
       +-- r1.3
       +     |
       +     +---- main.cpp (1.3版本的发布文件)
       +     +---- common.h
       +
       +-- r2.0
       +     |
       +     +---- main.cpp (2.0版本的发布文件)
       +     +---- common.h
       +
       +-- r2.1
             |
             +---- main.cpp (2.1版本的发布文件)
             +---- common.h


要使用这样的文件夹结构,在建立项目版本库时,可首先建好项目文件夹,并在其中建立trunk, branches, tags三个空的子目录,再将项目文件夹连同这三个子目录一起导入版本库。

这样在trunk中开始进行开发,当需要建立branch或tag时,使用SVN的copy操作进行。

其中tags目录需要只读,可以使用SVN中的authz文件控制该目录的访问权限为只读。

一.提交之前先更新

1.SVN更新的原则是要随时更新,随时提交。当完成了一个小功能,能够通过编译并且自己测试之后,谨慎地提交。

2.如果在修改的期间别人也更改了svn的对应文件,那么commit就可能会失败。如果别人和自 己更改的是同一个文件,那么update时会自动进行合并,如果修改的是同一行,那么合并时会产生冲突,这种情况就需要同之前的开发人员联系,两个人一起协商解决冲突,解决冲突之后,需要两人一起测试保证解决冲突之后,程序不会影响其他功能。

3.在更新时注意所更新文件的列表,如果提交过程中产生了更新,则也是需要重新编译并且完成自己的一些必要测试,再进行提交。这样既能了解别人修改了哪些文件,同时也能避免SVN合并错误导致代码有错

二.保持原子性的提交

每次提交的间歇尽可能地短,以几个小时的开发工作为宜。例如在更改UI界面的时候,可以每完成一个UI界面的修改或者设计,就提交一次。在开发功能模块的时候,可以每完成一个小细节功能的测试,就提交一次,在修改bug的时候,每修改掉一个bug并且确认修改了这个bug,也就提交一次。我们提倡多提交,也就能多为代码添加上保险。

三.提交时注意不要提交本地自动生成的文件

一般配置管理员都会将项目中一些自动生成的文件或者与本地配置环境有关的文件屏蔽提交(例如eclipse中的.classpath文件等)。如果项目中没有进行这方面的配置来强行禁止提交这样的文件,请自觉不要提交这样的文件。提交了这样的文件后,别人在更新后就可能与本地的环境冲突从而影响大家的工作。

四.不要提交不能通过编译的代码

代码在提交之前,首先要确认自己能够在本地编译。如果在代码中使用了第三方类库,要考虑到项目组成员中有些成员可能没有安装相应的第三方类库。项目经理在准备项目工作区域的时候,需要考虑到这样的情况,确保开发小组成员在签出代码之后能够在统一的环境中进行编译。

五.不要提交自己不明白的代码

代码在提交入SVN之后,你的代码将被项目成员所分享。如果提交了你不明白的代码,你看不懂,别人也看不懂,如果在以后出现了问题将会成为项目质量的隐患。因此在引入任何第三方代码之前,确保你对这个代码有一个很清晰的了解。

六.提前协调好项目组成员的工作计划

项 目经理应该合理分配工作计划。每个成员在准备开始进行某项功能的修改之前,如果有可能,先跟工作小组的成员谈谈自己的修改计划,让大家都能了解你的思想, 了解你即将对软件作出的修改,这样能尽可能的减少在开发过程中可能出现的冲突,提高开发效率。同时你也能够在和成员的交流中发现自己之前设计的不足,完善 你的设计。

七.对提交的信息采用明晰的标注

在一个项目组中使用SVN, 如果提交空的标注或者不确切的标注将会让项目组中其他的成员感到很无奈,项目经理无法很清晰的掌握工作进度,无法清晰的把握此次提交的概要信息。在发现错 误后也无法准确的定位引起错误的文件。所以,在提交工作时,要填写明晰的标注,能够概要的描述所提交文件的信息,让项目组其他成员在看到标注后不用详细看 代码就能了解你所做的修改。

八.慎用锁定功能


在项目中要慎用锁定的功能,在你锁定了一个文件之后别人就无法继续修改提交该文件,虽然可以减少冲突的发生率,但是可能会影响项目组中其他人员的工作。平时只有在编辑那些无法合并的文件(例如图片文件,flash文件等)时,才适当的采用锁定操作。

负责而谨慎地提交自己的代码

SVN更新的原则是要随时更新,随时提交。当完成了一个小功能,能够通过编译并且并且自己测试之后,谨慎地提交。

如果提交过程中产生了冲突,则需要同之前的开发人员联系,两个人一起协商解决冲突,解决冲突之后,需要两人一起测试保证解决冲突之后,程序不会影响其他功能。

如果提交过程中产生了更新,则也是需要重新编译并且完成自己的一些必要测试,再进行提交。


保持原子性的提交

每次提交的间歇尽可能地短,以一个小时,两个小时的开发工作为宜。如在更改UI界面的时候,可以每完成一个UI界面的修改或者设计,就提交一次。在开发功能模块的时候,可以每完成一个小细节功能的测试,就提交一次,在修改bug的时候,每修改掉一个bug并且确认修改了这个bug,也就提交一次。我们提倡多提交,也就能多为代码添加上保险。


不要提交自动生成的文件

Visual Studio在生成过程中会产生很多自动文件,如.suo等配置文件,Debug,Release,Obj等编译文件,以及其他的一些自动生成,同编译代码无关的文件,这些文件在提交的时候不应该签入,如果不小心签入了,需要使用Delete命令从仓库中删除。


不要提交不能通过编译的代码

代码在提交之前,首先要确认自己能够在本地编译。如果在代码中使用了第三方类库,要考虑到项目组成员中有些成员可能没有安装相应的第三方类库或者没有放入GAC(针对.Net Framework)中,项目经理在准备项目工作区域的时候,需要考虑到这样的情况,确保开发小组成员在签出代码之后能够在统一的环境中进行编译。


不要提交自己不明白的代码

代码在提交入SVN之后,你的代码将被项目成员所分享。如果提交了你不明白的代码,你看不懂,别人也看不懂,如果在以后出现了问题将会成为项目质量的隐患。因此在引入任何第三方代码之前,确保你对这个代码有一个很清晰的了解。


提前宣布自己的工作计划

在自己准备开始进行某项功能的修改之前,先给工作小组的成员谈谈自己的修改计划,让大家都能了解你的思想,了解你即将对软件作出的修改,这样能尽可能的减少在开发过程中可能出现的冲突,提高开发效率。同时你也能够在和成员的交流中发现自己之前设计的不足,完善你的设计。


对提交的信息采用明晰的标注

+) 表示增加了功能

*) 表示对某些功能进行了更改

-) 表示删除了文件,或者对某些功能进行了裁剪,删除,屏蔽。

b) 表示修正了具体的某个bug