Tortoise SVN 客户端命令常用介绍



TortoiseSVN客户端命令 

 

1Checkout

 首先要Checkout服务器端的Repository

 所谓的Checkout就是指获得服务器端指定的Repository存储的所有文件。

Checkout的具体方式是:

 在客户端新建一个空目录,比如:F:\Project1 (确保是空的)

 在该目录上单击右键,在弹出式菜单中选中SVN Checkout...

 之后按要求录入内容:

 

 然后点OK,会弹出一个认证对话框,

 

 输入用户名和密码。

OK后就完成了对RepositoryCheckout

检出后,所有检出文件上都打着绿色对勾:

 

2update

获取版本库中最新版本,具体的方法是:在WC目录上单击右键,SVN Update

 

这时WC中的文件就是最新的版本了。


3commit

commit功能就是将你本地的文件修改记录上传到服务器上面,可以理解为上传。

只会上传原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右键点击文件选择Add,然后文件上面会出现一个加号,在下次commit的时候才能选到该文件。

commit页面:

 

注意:commit的时候,最好填写Log信息,

Log内容包括:修改了哪些东西及为什么做这些修改(what+why

强制必须录入log: property 中设置录入log最小长度,此时commit必须录入log,否则不允许提交.

设置录入log最小长度页面:

 

 

4add

将要添加的文件或者目录拷贝到WC下,

 然后在该文件或目录上单击右键,TortoiseSVN->Add,点OK

 如果添加了不止一个文件或目录,

 则鼠标不要在WC中点中任何文件,

 然后单击右键,TortoiseSVN->Add

 就可以添加多个文件或目录。

 这时文件的状态图标会发生如下变化:

 

 Add命令只是告诉本地的WC将该文件纳入版本管理,

 并没有将这个改变提交到服务器端,

 在F:\Project1下单击右键,SVN Commit...

 将你所做的修改提交到Repository

 

5modify

 用文本编辑器或IDE对文件修改后,

 文件的状态图标会变化,

 

 然后单击右键,SVN Commit... 即可提交修改。

 

6revert

1)、放弃未提交的修改,

 单击右键,TortoiseSVN->Revert

 本地的WC中的文件和目录会恢复到修改前的状态。

 

2)、回复到之前某个revision状态:

 a、 在本地WC中单击右键,TortoiseSVN->Update to Revision...

 

 然后输入你想要回复到的Revision

 

OK按钮。此时仅仅是WC中回复到特定版本,对Repository没有任何影响。

 

 b、把Repository回复到某个revision状态方法:

方法一:

 先执行Update命令将Working Copy更新到最新的Revision

 然后在Working Copy中单击右键,

 TortoiseSVN->Show Log

 弹出的Log Messages窗口中会显示该Repository的所有Revision

 选中最新的Revision,之后按住Shift键,

 再单击你想回复到的Revision+1的那个Revision

 (比如Repository的最新Revision79

 你想将Repository的状态回复到Revision60

 那么就选中Revision70,再按住Shift键,

 选中Revision61

 就是说选中Revision61Revision79之间的所有Revision)。

 然后在选中的Revision上单击右键,

 选中“Revert changes from these revision”

 

 再点Yes按钮,就可以将WC的状态回复到目标Revision60

 注意:此时只是WC回复到目标Revision,之后应该用Commit提交修改,

 这样Repository最新状态就与WC的状态一致,都为 Revision60

方法二:

采取大版本号向小版本号merge的方式,进行回滚
 保证我们拿到的是最新代码,TortoiseSVN右键àmerge,如果我们最新版本为79,要回滚到60,如下图,“From”URL“to”URL均了录入要回复的文件在版本库的存放地址

  “merge”,然后commit即可。

 

7delete

 删除文件时,选中要删除的文件或目录,

 单击右键,TortoiseSVN->Delete

 

 

然后提交修改。

注意千万不要用windows自己的删除或者“Delete”键来删除文件,否则将无法提交你的修改。

 这一点对目录的删除来说尤为重要。 因为每个目录里有个 .svn隐藏目录 ,存放目录下文件的信息,使用操作系统命令delete/move时,  .svn还指向原来的位置,所作操作不受SVN控制。

 

8move

移动方法:

(1)、选择你要移动的文件或目录

(2)、拖拽(right-drag)他们到新的工作副本下,

(3)、松开鼠标右键

(4)、在弹出菜单选择上下文菜单 → SVN 移动文件。

 

原理同上。

 

9Branche/Tag   

操作方法

创建分支非常简单,只需在需要创建分支的工作目录上,使用TortoiseSVN → Branch/Tag命令,在 "To URL" 项指定待创建的分支 url 即可

 

实现本质:

subversion对分支和标签是通过复制一份最新的版本库的快照来实现的。

一般情况下,tag,是用来做一个milestone的,不管是不是release,都是一个可用的版本。这里应该是只读的,更多的是一个显示用的,给人一个可读(readable)的标记;branch,是用来做并行开发的,这里的并行是指和trunk进行比较。

分支与标签的区别:

在实现上,branchtag,对于svn都是使用copy实现的,所以他们在默认的权限上和一般的目录没有区别。至于何时用tag,何时用branch,完全由人主观的根据规范和需要来选择,而不是强制的(比如cvs),一个不去做任何的修改的分支就是版本库某一时刻的一个快照,相当于为某一个版本做了一个标签

BranchTag都是拷贝指向原始文件的链接,当你对拷贝做修改时,记录为相对原始文件的修改,称为延迟拷贝,效率高且几乎不占用空间。

Tag:版本号是个好东西,但是我们更倾向于记住像第二预览发布版这样的名字,而不是V01这样的数字,标签是用来做这件事情的。版本控制系统可以让你给某一个时刻的一组文件或者一些目录或者整个项目分配一个名字。如果你个某几个文件分配标签第二发布预览版,以后就能使用这个标签签出它们。

标签是一种很好地跟中项目代码开发过程中发生的重要事件的方式。

 

分支合并:

使用TortoiseSVN → Merge命令,在“ From:(start URL and revision of the range to merge) ”中选择希望合并的目录 如: trunk) ,并指定希望合并的开始 revision 编号,在“ To:(end URL and revision of the range to merge) ”中选择结束 revision 编号。


然后点击“ merge ”完成合并操作,剩下的工作就是编辑冲突了。当然运气好的话是不需要这个过程滴。 值得注意的是,“ From: ”“ To: ”中的 URL 通常是相同的,切记不要与创建分支时的含义混淆

 

10get lock/release lock

选择工作副本中你想要获取锁定的文件,然后选择命令TortoiseSVN ---> Get lock…

 

出现一个对话框,允许你输入注释,这样别人知道你为什么锁定这个文件。注释是可选的,

并且只用于基于Subversion 的库。选择需要锁定的文件在复选框打勾,点击确定按钮

锁定选择的文件:

 

出现一个对话框,输入正确的用户名和密码即可向版本库提交你想锁定文件的信息。


锁定文件成功!返回信息!”Locked by admin”表示文件已被admin 用户锁

定;”alpay_payto.php”表示锁定文件的名称。点击”OK”按钮确定锁定文件成功。

 

释放锁定(取消锁定)

选择工作副本中你想要取消锁定的文件,然后选择命令TortoiseSVN ---> Release lock…

 

之后操作同get lock

当被锁定文件commit后,会自动解锁,无需再去解锁;如果commit后还需上锁,则在commit时可选择:“keep lock”


 

 

 

 

强制锁定:设置对象文件svn:needs-lock这个属性,update后强制文件的属性为只读,只有lock之后,才能对文件进行修改操作,commit-release lock之后,又自动变成只读。

具体做法:

先将a.jpg文件拷贝到WC中,然后在该文件上单击右键,

 TortoiseSVN->Add,告诉Subversion要将该文件纳入版本控制,

 接着在该文件上单击右键并选中属性,

 在弹出的属性对话框中选中Subversion页。

 在下拉框中选中“svn:needs-lock”

 

 并在下面的文本框中填入“*”

 (其实这里填什么都无所谓,只要文件有“svn:needs-lock”附加属性就行),

 之后点Set按钮,“svn:needs-lock”附加属性就设置好了。

 然后执行Commit命令提交修改。

 这时当其他人执行Update时,

 a.jpg就会添加到他们的WC中,

 并且文件的附加属性也会随文件一起被得到。

 可以看到a.jpg此时的图标就是灰色的,

 文件的Windows属性也是只读的

 

11clean up

SVN 本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消,  

可能会造成本地文件被锁定的情况。一般出现这种情况的解决方法:

(1)、可以使用SVN clean up来清除锁定。

(2)、如果不是本目录锁定,系统提示上一层目录锁定,需要到上一层或者根目录中清除。

(3).如果在根目录下都无法clean的话,一般采取的方法是另外找一个目录重新check out。但有时SVN目录下可能有一些自己本地修改的文件,还未提交到SVN服务器,这时重新check out需要注意本地文件的备份,并且不要强制覆盖服务器上其它人修改的内容。

(4)、如果觉得第3种很麻烦,可以考虑这样的方法。其实SVN加锁会在.SVN(隐藏文件)中生成一个名字叫lock的文件(无后缀),查找所有的手工删除。然后再尝试更新,系统可能会提示某个.base文件无法访问。找到它,把相关的文件或其所在的目录删除,重新update。工作量就小多了。

 

12export

集成测试或项目上线需要版本时,使用export而不用checkoutexport 得到干净的目录与文件,不带版本控制因素。


13Check for modifications

同服务器上的项目版本进行比较,并可做相应的修改。

 

 

 

14Show log

查看版本日志及不同版本间相互比较

  

 

15Revision Graph


版本示意图

 

 

16Repo-Browser


 

查看当前版本库,这是TortoiseSVN查看版本库的入口,通过这个菜单项,我们就可以进入配置库的资源管理器,然后就可以对配置库的文件夹进行各种管理,相当于我们打开我的电脑进行文件管理一样

 

17Rename


SVN支持文件改名,点击Rename,弹出文件名称输入框,输入新的文件名称,点击确定,再把修改提交,即可完成文件改名。

 

 

18switchrelocate


版本库转移,当我们版本库发生转移的时候就需要用到这个功能。例如我原先的版本库是建在U盘上的,现在转移到(复制整个配置库文件夹)开发服务器上,使用https代替文件系统的访问。因此就需要将原来的工作拷贝的目标版本库重新定位到开发服务器上。

注意:relocateswitch的区别:

     (1)、如果WC反应相同的版本库目录,但是版本库本身位置改变了,使用relocate;

      (2)、如果WC需要反应一个版本库的新目录,素要switch

 

19switchsvn update比较:


svn switchsvn update的输出很像,switch命令只是update命令的一个超集。 
当你运行svn update时,会告诉版本库比较两个目录树,版本库这样做,并且返回给客户区别的描述,svn switchsvn update两个命令唯一区别就是update会一直比较同一路径。 
也就是了,如果你的工作拷贝是/calc/trunk的一个镜像,当运行svn update时会自动地比较你的工作拷贝的/calc/trunkHEAD版本的/calc/trunk。如果你使用svn switch跳转工作拷贝到分支,则会比较你的工作拷贝的/calc/trunk与相应分支目录的HEAD版本。 
换句话说,一个更新通过时间移动你的工作拷贝,一个转换通过时间和空间移动工作拷贝。 
因为svn switchsvn update的一个变种,具有相同的行为,当新的数据到达时,任何工作拷贝的已经完成的本地修改会被保存,这里允许你作各种聪明的把戏

 

20diff

(下面是针对同一个文件而言)
原本错误地理解了 diff 的意思是比较本地的文件与服务器的相应文件有什么不同,但实际意思并非这样。更准确地说这条语句的意思是比较一个文件中你修改过的部分与服务器的相应文件相应部分有什么不同,对于那些没有修改过的地方(同一文件中)不同也不会比较,当然可以先 up 一下再 svn diff  这样就保证了本地文件与服务器的相应文件的所有不同的地方全都显示出来了,当然冲突情况除外.

 

21dry run

合并前看看结果会是什么样的.一个简单的办法就是运行dry run先看看并不真实的将结果写入到工作副本中.它只是显示在合并过程中输出的执行结果状态码.比较'高级'的预合并,当运行svn diff可能会给出太多的详细日志.

 

22、create/apply patch 


(1)、使用create patch可以生成一个或者多个修改过的文件和当前版本差异的patch(支持目录树) 
通常情况下,create patch将修改保存为.patch.diff文件 
可以将.patch.diff文件的内容复制出来,发给需要审查的人 
.patch.diff文件中记录了发生这个patch的版本号以及具体修改的内容 
针对某个文件或某几个文件的若干种修改,可以生成多个.patch.diff文件 
(2)apply patch 
可以将.patch.diff文件应用到对应版本的项目,就像打补丁一样 
同一个项目/文件夹下,可以选择应用需要的patch 
通常来说,应用一个patch时文件版本和生成这个patch时文件的版本是一致的;如果不一致,也可以强制应用,svn会自动进行diff(这时候需要手动合并) 
linux下,可以使用系统的patch命令来应用patcheg: patch -p0 <xxx.patch 
(3)、使用 
暂时不需要提交或不允许提交的修改,可以选择create patch来保存修改的内容 
选择create patch来保存修改的内容并且提交patch,通过审查后,(在服务器端)应用patch 
当一个功能有多种解决方案时,可以生成多个patch,(提交后)分别经过测试,再决定应用哪个patch 
多个功能分别需要改同一个文件的不同地方(即没有同一行),可以做成多个patch,应用patch的顺序没有要求(在linux下应用也一样成功,只是会生成多个.orig文件) 
多个连续性的功能,他们修改的文件都与一个basepatch,例:p1v1的基础上开发v2,生成v2v1之间的patch1p2v2的基础上开发v3,生成v3v1之间的patch2,这样只要应用patch2也就应用了patch1。 
(4)、带来的问题 
一个较早的patch,在经过多轮提交后,如果想再要应用,需要严格的diff 
如果两个patch分别改了同一行代码,应用第一个patch后要再应用第二个patch时,仍然需要diff。如果在linux下,会产生冲突,生成.orig.rej两个文件(此时仍然需要手动进行比较合并) 
3部分提到的连续性,要准确的预见到,比较困难 
3部分提到的多个连续的功能,后做的功能的某个文件更新了先做的功能的内容,但先做的功能可能还涉及到其他文件,容易造成漏更新文件的情况 

 

23subversion的版本控制模型 

 当你用subversion进行版本控制时, Subversion会记录你对Repository进行的每一次修改(包括添加,修改,删除等等),每修改一次Repository都会产生一个新的Revision(修订版本号) 不同的Revision代表了不同时刻Repository的状态,因此我们可以用这个Revision回朔任意时刻Repository的状态,就时间机器一样,也就是说某一Revision就是Repository在某一时刻的一个快照

 注意:Revision不是针对某一个文件或者目录,而是针对整个Repository而言的。

 每修改一次RepositoryRevision 都会增加1。 

 Subversion的版本控制模型是一种叫做Copy-Modify-Merge (拷贝-修改-合并)的模型。


 

24“.svn”目录 

 在客户端Working Copy的每一层目录中都会有一个“.svn”目录,

 该目录是Subversion进行管理用的目录。

 不要手动修改其中的文件。

 该目录存储了Working Copy的一个副本

 实际存储副本的地方是F:\project1\.svn\text-base目录

 比如:F:\Project1是一个Working Copy

 该目录下有两个文件a.txtb.txt还有一个子目录ccc

 子目录ccc中还有一个d.txt文件。

 “.svn”目录中存储的是你最近一次执行完Update或者Commit命令之后当前目录中文件的副本,

 比如:F:\project1\.svn\text-base中存储的a.txtb.txt

 是最近一次执行完Update或者Commit命令之后F:\project1下的a.txtb.txt的拷贝。

 也就是说你所作的修改都是基于“.svn”目录存储的那些文件。

 这种机制可以让我们在不连接网络的情况下,

 将Working Copy中的文件恢复到修改之前的状态。

 SubversionRevert命令就是利用了这种机制来实现的。

 比如你修改了F:\project1\a.txt文件,

 这时你又改变了主意想放弃对该文件的修改,

 你可以单击右键,TortoiseSVN->Revert

 修改过的F:\project1\a.txt文件

 就会被F:\project1\.svn\text-basea.txt文件的副本所替代,

 使得a.txt恢复到修改前的状态。 

 Working Copy中每一个子目录下都会有一个“.svn”目录,

 并不是只有最上层目录才有“.svn”目录。

 所以,F:\project1\ccc下也有一个“.svn”目录,

 该目录存储的是F:\project1\ccc\d.txt的副本

 (d.txt的副本位于F:\project1\ccc\.svn\text-base)

 也就是说每个“.svn”目录只存储同级目录中的文件副本,

 而不存储目录副本。“.svn”目录存有许多重要的内容,

 所以前面说在删除文件或目录时,

 必须用TortoiseSVN->Delete

 而不能用windows自带的删除或者“Delete”键来删除文件或目录,尤其是对于目录的删除。 

 

25、混合版本 

 SubversionWorking Copy被设计成一种能够包含不同版本的文件共存的形式。

 比如F:\Project1是一个Working Copy

 该目录下有两个文件a.txtb.txt

 执行Update命令,将Working Copy更新到最新版本(Revision 24)。

 这时,a.txtb.txtRevision都是24

 (其实对于单个文件来说并不存在Revision

 Revision是对于整个Repository而言的,

 这里所指的是RepositoryRevision24所存储的a.txtb.txt

 但为了方便而采用这种描述方式,请注意,下同)。

 之后,你的同事修改了a.txt,并且提交了修改,

 这时RepositoryRevision就变成25了。

 注意,这时你没有再次执行Update

 因此你的Working CopyRevision还是24

 这时你修改了b.txt文件,并提交修改。

 因为Revision25并没有对b.txt文件进行修改,

 因此你对b.txt文件的修改是基于b.txt文件最新的版本,

 所以不会出现Conflict

 当你提交b.txt的修改后,产生Revision26

 这时你会发现你的Working Copy中的a.txt文件并不是Revision25中的a.txt文件,

 它还是Revision24a.txt文件,而你的b.txt文件是Revision26b.txt文件。

 也就是说当你Commit时,你的Working Copy中只有你提交的那些文件是最新版本,

 而其他没有修改的文件并不会更新为最新版本。

 这样就造成了你的Working Copy由不同的Revision文件所组成

 (Revision24a.txt文件和Revision26b.txt文件)

 前面说过在提交修改前必须保证你是在文件的最新版本基础上修改,

 如果在这种混合版本的情况下,

 怎样才能知道当前Working Copy中的文件是否为最新版本?

 在前面所说的“.svn”目录中有一个文件名为“entries”的文件,

 该文件记录了当前Working Copy中的每一个文件的Revision

 因此当你Commit时,Subversion会从该文件中取得你提交文件的Revision

 再与Repository的最新Revision一比较就可以知道你修改的文件是否基于该文件的最新版本。 

 

26、文件的附加属性 

 在Subversion中,每个文件可以拥有一种叫做附加属性的东西。

 附加属性描述了该文件所拥有的一些特性。

 Subversion已经预定义了一些附加属性

(这里只是指Subversion已经定义了一些附加属性的名称

 并不是指已经将这些属性附加在文件上了,

 比如默认情况下文本文件一开始不含任何属性,

 直到人为的对该文件添加附加属性),

 并且你可以对文件添加自定义的属性。

 Subversion对待附加属性就像对待文件内容一样,

 当修改了一个文件的附加属性(添加,改变,删除附加属性),

 即使没有对文件的内容进行修改,

 同样可以Commit该文件,就像更改了文件内容那样,

 Repository也会生成新的Revision

 所以从某种意义上来说,

 Subversion不区别对待文件的附加属性的修改和文件的内容的修改,

 文件的附加属性可以看成是一种特殊的文件内容。

 Subversion预定义了若干个附加属性,

 这里只讨论“svn:needs-lock”属性,

 因为它与我们上面的文件锁定会产生的一个问题有关。

 其他的属性可以参考Subversion自带的帮助文档。

 考虑这种情况,

 张三和李四同时想对一个图片文件a.jpg作修改,

 张三在修改时先将该文件锁定,然后进行修改,

 同时李四也开始对该文件进行修改,

 但李四忘记了对非文本文件进行修改时应该先锁定该文件。

 张三首先对该文件修改完毕,于是张三向服务器提交了他的修改。

 之后,李四也完成了修改,当他提交修改时,

 Subversion提示李四的文件版本不是最新的,

 在Commit之前应先更新a.jpg到最新版本,

 由于图片文件无法合并,

 这就意味着张三和李四之间必定有一个人的修改会作废。

 应用“svn:needs-lock”属性可以避免这个问题。

 当一个文件拥有“svn:needs-lock”属性时,

 该文件在没有锁定时,文件的图标是灰色的,

 表示该文件是一个只读文件(该文件的Windows只读属性的复选框为选中),

 这个灰色的图标就会提醒想对该文件进行修改的人,

 在修改该文件之前应该首先锁定该文件。

 锁定该文件之后,文件的只读属性就会去掉了,

 一旦释放掉锁,文件的图标又会变成灰色,

 文件也会变成只读的了。

 李四在这种情况下就会避免在没有锁定文件时对文件进行修改。

 对非文本文件添加“svn:needs-lock”

 属性应该在将该文件第一次添加到Repository时就设置,

 当然,一个文件可以在任意时刻添加附加属性,

 这样做是为了减少李四所遇到的那个问题发生的几率。

 具体的方法是:

 首先将a.jpg文件拷贝到Working Copy中,

 然后在该文件上单击右键,

 TortoiseSVN->Add,告诉Subversion要将该文件纳入版本控制,

 接着在该文件上单击右键并选中属性,

 在弹出的属性对话框中选中Subversion页。

 在下拉框中选中“svn:needs-lock”

 并在下面的文本框中填入“*”

 (其实这里填什么都无所谓,只要文件有“svn:needs-lock”附加属性就行),

 之后点Set按钮,“svn:needs-lock”附加属性就设置好了。

 然后执行Commit命令提交修改。

 这时当其他人执行Update时,

 a.jpg就会添加到他们的Working Copy中,

 并且文件的附加属性也会随文件一起被得到。

 可以看到a.jpg此时的图标就是灰色的,

 文件的Windows属性也是只读的。 

 

 

 

     在大的工程项目中,我们都需要有版本控制,SVN运用非常常见。

    在此过程中应当注意的问题也很多,比如SVN识别 空格和换行符。

    例如,如果两个人的编程习惯不同,一个人习惯用8个空格代表一个Ta键,一个另人习惯用Table+空格,在SVN将会造成几乎所有的代码有改动——“一片红”的现象。所以为了代码检查方便,可在VS中设置Tab统一转换为空格。 参见http://blog.csdn.net/tonywearme/article/details/7061530

 

 

 

猜你喜欢

转载自blog.csdn.net/u012041523/article/details/39007695