Monday, August 11, 2008

routine tortoisesvn operations-2

我自己写了一点关于svn的常用功能, 见http://focuswindows.blogspot.com/2008/08/routine-tortoisesvn-operations-1.html


以下内容摘自http://blog.csdn.net/iNarcissuss/archive/2007/09/16/1787411.aspx

Check-out(检出) 和 Export(导出)
+-------------------------------------------------
从 服务器取得 最新版本(Subversion术语--Head Revision)或某个历史版本的拷贝 复制到本地的某个目录,这个本地的目录有个Subversion专门的术语---working copy(工作拷贝),working copy的特点是自动与服务器关联,并受服务器的版本控制。
所以Subverion的CheckOut相当于VSS的 设定工作路径+签出 。
与CheckOut类似的一个命令是------Export(导出),它能将某个版本复制一份到本机的某个目录,与CheckOut不同的是,这个目录不是woking copy,Export(导出)
后就与服务器没有任何关系了,当然更不会受服务器的版本控制。
TortoiseSVN会在是working copy的目录上加上各种标志,而Export的目录不会有任何标志
SVN Update(SVN 更新) & Get Lock
+-------------------------------------------------
最常用的命令,你可以只CheckOut一次,但是最好经常update,特别是在你修改之前尤其特别一定用Update,以保证本地工作拷贝与服务器项目版本库一致。它的功能是
,从服务器取得最新版本跟新本机工作拷贝,相当于VSS的Get Latest Version,如果习惯VSS,并且对SVN的复制--修改--合并模型不放心的话,可以在Update之后,马上使用
“获取锁定”命令,它的作用是使的别人不可以修改你正在修改的文件,以避免冲突。
Import Export (导入 导出)
+-------------------------------------------------
Import是一种快速批量向服务器添加文件的方法,如果你像把本地的文件或文件夹添加到服务器的某个目录下面,那么在本地目录中,右单击选择Import命令,然后
设定URL即可,这是从别的版本管理系统向VSS迁移的一种方法,在版本浏览器上单击某个目录,会有加入文件和加入文件夹的命令,其中加入文件一次只能加入一个文件
加入文件夹只能加入该文件夹下的所有文件,不能加入子文件夹,你可以根据实际需要使用.需要注意的是, 本机目录导入到服务器后,本机目录没有改变,和服务器也没关联,
并不是工作拷贝。Export命令请在本文其他地方找。
Switch & Relocate (切换和重定位)
+-------------------------------------------------
Switch -----在版本库内改变与当前工作拷贝关联的服务器路径URL(只限于同一个Repository内),应用情景:有时,服务器的目录会有所变化,和你当前工作拷贝
关联的服务器URL改变了,这种改变的直接结果是,你在工作拷贝中所做的修改不能提交到服务器,这时就需要Switch到正确的URL再提交。
Relocate----功能和Switch雷同,差别在于,Relocate实现的是Repository和Repository之间的切换。当服务器地址或Repository名称发生变化时,可以用它来更新
你的工作拷贝。
Create/Apply patch (创建和应用补丁)
+-------------------------------------------------
如果你对某个文件没有修改的权限,但又必须对它进行修改,这时你可以对其创建补丁,然后把补丁发给对此目录有write权限的工作人员,他进行一系列的审核,审核
通过后,他会执行应用补丁命令,可以将你所做的修改提交到服务器上。
copy to working copy...(复制到工作拷贝...)
+-------------------------------------------------
首先,注意这里是working copy ,后面在选择目录时一定不要选错!,当然,选错了tortoisesvn会提示错误的,正确的操作应该是选那些有tortoisesvn标志的目录。
执行此命令会在working copy中增加你copy的目录和文件,然后修改,再commit,repository中就做了相应的变化。
当你需要用到这样一个模块,它与已经存在的某个模块类似,然而又不完全一样,需要有一定改动时,用copy to working copy...命令较为快捷。
Resolved ...(已解决的...)
+-------------------------------------------------
当两个人同时编辑一个文件,一个人先提交后,另一个人再进行提交时就会出现冲突,TortoiseSVN会提出必须更新你的工作拷贝后才能对这个文件进行修改,
Subversion冲突的种类及解决方法
+-------------------------------------------------
--->1.当两个人同时编辑一个文件的不同部分,一个人先提交后,另一个人再进行提交时就会出现冲突
--->解决方法:在冲突的文件上调用命令SVN Update(SVN更新),TortoiseSVN会自动从服务器上下载最新版本,并与本地工作拷贝进行合并,然后调用命令
SVN Commit(SVN 提交),就会自动生成一个新版本传到服务器上。
--->2.当两个人同时编辑一个文件的相同部分,一个人先提交后,另一个人再进行提交时就会出现冲突
--->解决方法:这种情况下调用SVN Update时,由于是同一部分修改,TortoiseSVN不知道应该怎么办,它会自动在发生冲突的文件的目录下生成三个文件,一个
发生冲突文件的基础版本,名称为文件的全名再加上基础版本的版本号,如FileConflict.cpp.r90,另一个是你调用SVN Update时更新的版本,名称也是文件
的全名再加上基础版本的版本号,如FileConflict.cpp.r95,它是别人已经修改好提交的文件, 还有一个是你的本地修改,后缀为.mine,而原文件以一种TortoriseSVN能识别的方式显示冲突的双方,而且这个文件上会出现TortoiseSVN的图标,要解决这种
冲突要求造成冲突的两个人进行沟通,确定最终的修改方案,然后进行修改,具体操作是右击有冲突图标的文件,选择“编辑冲突”命令,这时就可以对出现冲突
的文件进行编辑,TortoiseSVN会打开TortoiseMerge,里面会显示别人的修改、你的修改、最终合并的文件,在最终合并的文件中产生冲突的行上右击,根据弹出
菜单选择使用别人的修改、我的修改还是两个都用,编辑完后保存,关闭TortoiseMerge,然后右击有冲突图标的文件,选择Resolved...(已解决的...)命令后
确定即可。

关于“基础版本”及其命令 ---比较差异,检查更新,显示日志,版本分支图
+-------------------------------------------------+-------------------------------------------------
当我们从服务器上CheckOut某个版本,经过一定的修改后,右击修改的文件(注意,不是目录)会有一个“比较差异”命令,调用它会弹出TortoiseMerge,它列出了
当前修改的工作拷贝与我们CheckOut时用到的版本之间的差异,这个被我们CheckOut的版本称为当前工作拷贝的“基础版本”,注意,基础版本不一定是最新版本,最新版
本也不一定是基础版本,比如另一个人和我们CheckOut同一个版本,它在我们之前提交了一份修改会形成一个最新版本----这时,我们进行提交可能造成冲突。
刚才说过,只有文件才会有“比较差异”命令,而目录没有,有没有办法看到目录的变化呢?--肯定有,是哪个呢?先试一下第一个---“显示日志”,结果不行,它只
显示的是当前工作拷贝对应的服务器目录或文件的版本变化记录,从第一个版本到最新版本,一个也不缺。“版本分支图”也一样,它是“显示日志”命令的图形化显示,
功能和“显示日志”完全一样。答案是----“检查更新”,它比较的是当前工作拷贝相对于基础版本的更新记录,不仅能显示文件的变化,也能显示目录的增减等。
Revert (复原) 和 Update to version
+-------------------------------------------------
当你CheckOut并修改了文件后,如果在提交前发现修改不正确,可以用Revert来取消这次的修改,使文件回到基础版本的状态;如果已经提交,可以用Update to Version
(更新至版本)返回某个旧的版本,或者调用显示日志命令,在任意一处日志上单击,在下方会出现修改记录,右击某一记录,在弹出菜单中选择Save Revision to(保存版本至)
,也可以把原来版本进行存档。需要注意的是,你的本地工作拷贝可以返回到原来的版本,可是服务器上只会记录你对它进行最后一个提交的版本,所以服务器端版本不
会 变化,如果你想把服务器端的文档内容也换为原来的状态,可以用旧版本文件覆盖新版本文件,然后提交,或者使用Revert changes from this revision 和 Revert to this revision命令,她们的用法在本文档中有,自己找找,调用显示日志命令,在任意一处日志上右击,在快捷菜单中会出现这两个命令。
注意,Revert命令很危险,它不向Ctrl-Z命令一样一次只撤销一次修改,它的名字是“还原”,它会把所有的修改全部撤销,直接回到基础版本的状态,如果想只撤销
一 次的修改,我的方法是,使用“检查更新”和“比较差异”命令在TortoriseSVN中修改,TortoriseSVN中的"use this text block ","use other text block ","use both text block "等命令很方便,关于这两个命令在本文中也有介绍,自己找。
Revert changes from this revision 跟Revert to this revision的区别?
+-------------------------------------------------
譬如有个文件,有十个版本,假定版本号是1,2,3,4,5,6,7,8,9,10。

-->1.Revert to this revision(恢复到某个以前的版本): 如果在版本6这里点击“Revert to this revision",表示7~10的修改全部作废,历史倒退到了版本6那个年代。
如果你做了多处修改,然后决定要返回到版本 N,你就可以使用这个命令。再次说明,恢复的修改位于你的工作复本,在你提交之前,并不会影响版本库。
注意,这将会丢弃从那个版本以来的所有修改,使用选中的版本来替换文件/文件夹。

-->2.Revert changes from this revision(还原选中版本所做的修改):如果在版本6这里点击“Revert changes from this revision",表示版本6这个历史事件被抹杀了,只剩下9个历史事件了。 如果同时选择了6,7,8三个历史时期并点击“Revert changes from this revision”,表示抹杀6~8这仨历史时期。同理,如果同时选择7~10,然后点击“Revert changes from this revision”,则效果跟在版本6这里点击“Revert to this revision”是一样的。
还原的内容只在你的工作副本中,所以此操作完全不会影响版本库!要注意的是,这个操作仅仅还原该版本中的修改。不是将整个文件替换成选中的那个版本。
它对于已经做过其它无关修改的还原早期修改非常有用。如果你做了本地修改,此命令将会合并修改到工作副本。
关于“基础版本”及其命令 ---比较差异,检查更新,显示日志,版本分支图
+-------------------------------------------------+-------------------------------------------------
当我们从服务器上CheckOut某个版本,经过一定的修改后,右击修改的文件(注意,不是目录)会有一个“比较差异”命令,调用它会弹出TortoiseMerge,它列出了
当前修改的工作拷贝与我们CheckOut时用到的版本之间的差异,这个被我们CheckOut的版本称为当前工作拷贝的“基础版本”,注意,基础版本不一定是最新版本,最新版
本也不一定是基础版本,比如另一个人和我们CheckOut同一个版本,它在我们之前提交了一份修改会形成一个最新版本----这时,我们进行提交可能造成冲突。
刚才说过,只有文件才会有“比较差异”命令,而目录没有,有没有办法看到目录的变化呢?--肯定有,是哪个呢?先试一下第一个---“显示日志”,结果不行,它只
显示的是当前工作拷贝对应的服务器目录或文件的版本变化记录,从第一个版本到最新版本,一个也不缺。“版本分支图”也一样,它是“显示日志”命令的图形化显示,
功能和“显示日志”完全一样。答案是----“检查更新”,它比较的是当前工作拷贝相对于基础版本的更新记录,不仅能显示文件的变化,也能显示目录的增减等。
Branch & Tag (分支与标记)
+-------------------------------------------------
---->1.定义与理解
-->1.1 Branch and Thunk (分支和主线)
版本控制系统的一个特性是能够把各种修改分离出来放在产品的一个分割线上。这条线被称为Branch(分支)。
分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足够稳定之后,产品的分支就可以混合回Thunk(主线)里.

-->1.2 Tag (标记/标签)
版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何时候重新建立一个特定的构件和环境。这个过程被称作Tag(标记/标签)。
Subversion 没有专门的用于建立分支和标记的特殊命令,它所谓的分支其实就是一个拷贝,把原目录的内容拷到一个新的目录下面。但是这个拷贝的操作不是真正意义
上的拷贝,Subversion称之为"Lean copy"(便宜复制),它类似于Linux的硬链接,实际的操作是建立了一个内部链接,指向那个被建立分支的目录,只有当我们提交一个文件
的修改,才在分支目录下建立一个真实的文件,它的内容就是我们提交的内容,需要注意的时,这时候,除了这个文件以外,其余的文件仍然是作为被建立分支目录下文件的
链接存在的。
采用Lean copy技术的结果是分支和标记能迅速被创建,并且没有在版本库里占据任何额外的空间。
-->1.3 理解Branch
建立分支的情况举例:
a.Project发行版已经完成,正在继续开发Project贺岁版,计划在两个月后发行。不久,客户开始抱怨Project有问题,于是CheckOut(检出)Project的发行版,
找到几个错误,并进行代码更正。但是当前的版本是个不稳定的版本(现在正处于Project2贺岁版的开发中.....),并且在下个月才能有希望稳定下来,这样就没有办法基于
最新的代码去发行一个修复错误的版本。....这种情况下就可以创建一个Branch(分支),分支的所有文件是基于Project发行版的,可以修改这个分支而不影响到主干(即当
前正在开发的Project2贺岁版),当Project2贺岁版完成时,你可以选定是否要把这个分支同主干(Project2贺岁版)合并或继续保留在这个分支里。
b.如果我们在维护一个项目的文档,但有一天,另一个项目也要这份文档,她们有和我们不同的需求,因此要对文档做一些修改才能适应她们的需要,这时,也可以对
这个文档建立一个分支。
c.Branch可以是项目分支,也可以是私有分支。
所谓的项目分支,是指两个项目需要并发开发,它们基于同一个原始版本的拷贝,且这两个项目又互不干扰的进行独立开发,那么这两条开发线对于原来的那个原始版
本来说,就是项目分支,而原始版本就是项目主干。
所谓的私有分支,是指如果多个人共同负责一个模块,当出现两个人同时修改一个文件的同一部分的情况时,就会不断的出现冲突,开发人员就要花大量的时间解决这
些冲突,而在分支上工作避免了频繁的解决冲突,这种分支叫做私有分支,个人可以在主干上建立一个私有分支出来,当开发到一定阶段以后,可以再对自己分支与主干进
行合并,在与主干进行合并的同时,也能关注到其他人在这一段时间内对主干做的修改。
---->2.创建分支
利用TortoiseSVN有两种方法建立分支:
-->1.从本地工作拷贝到服务器建立,在本地工作拷贝右击在弹出菜单中选择“Branch/Tag”会弹出一个对话框,在其中设定要建立分支的URL即可。
-->2.从URL到URL,在Repository Explorer(版本浏览器)中右击要建立分支的目录,在弹出菜单中选择Copy to...(“复制到...”),在弹出对话框设定要建立分支的URL.
---->3.分支的合并
创建分支后一段时间可以根据需要进行Merge(合并)操作,我们既可以将主线的改动合并到分支上,也可以将分支的改动合并到主线上:
-->1.将主线的改动合并到分支上,需要在分支的工作拷贝下进行合并,合并的范围是从主线上上次合并的版本(或建立分支时候的版本)到当前主线上的最新版本,
如果主线和分支都修改了相同的文件的相同部分,合并后会出现冲突,就要进行解决冲突,如果主线修改但是分支没有修改,则主线上合并的变更内容会增加到当前工作
拷贝中,合并的结果会保存到当前的工作拷贝中,提交后改动就会体现在分支中,如果是第一次合并,则起始版本号是上次建立分支的版本号。
-->2.将分支的改动合并到主线中,需要在主线的工作拷贝下进行合并,相关事项与上雷同。
Blame (追溯)
+-------------------------------------------------
这个命令很不错,能显示文件的所有行在哪个版本中被修改及修改的时间,还可以追溯版本库等,有兴趣可以自己研究。

No comments: