当先锋百科网

首页 1 2 3 4 5 6 7

1.Checkout Repository

Checkout是指获得服务器端指定的Repository存储的所有文件(和ClearCaseCheckout意义完全不一样,ClearCaseCheckout指的是取得某文件的修改权,在使用Subversion时一定要注意)。

Checkout的具体方法:

1)在客户端新建一个空目录,比如:F:/Accoona,在该目录上单击右键,在弹出式菜单中选中SVN Checkout...,之后在“URL of Repository”文本框中输入服务器项目名称Repository的地址,比如“svn://xxx/Accoona” (通过自定义的协议访问一个 svnserve 服务器,xxx是服务器端主机名,或服务器端的ip地址) file:///D:/SVNProjects/Accoona从本地磁盘访问);http://svn-softmit.accoona.com/svn/repos/sofmit通过 WebDAV 协议访问 Apache 服务器,进而访问仓库
2
)然后点OK,会弹出一个认证对话框,输入服务器端为每个用户设置的用户名和密码。

3)然后点OK后就完成了对RepositoryCheckout

 

比如:在服务器端Repository中有一个a.txt文件,那么Checkout之后F:/Accoona目录下也会出现一个a.txt文件。执行Checkout后除了会在F:/Accoona目录下产生Repository存储的文件及目录外,还会产生了一个“.svn”的隐含目录,该目录是由subversion管理的,不要删除或者手工改动其中的文件和目录。

现在F:/Accoona中的文件和目录就叫做Repository“Working Copy”简写“WC”,以后对Repository中文件和目录的修改,添加,删除的操作,都是通过对这个“Working Copy”的操作来实现。

Checkout执行完后,会发现F:/Accoona目录的图标的左下角附着了一个小的状态图标(当F:/Accoona目录中的文件改变时,这个状态图标也会随之变化),它表示F:/Accoona是一个Repository“Working Copy”F:/Accoona内的所有文件和目录也会有类似的状态图标。

 

图:checkout Accoona库(从本地磁盘访问
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 219.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata></shape>

 

图:checkout Accoona库(通过 SVN Apache

<shape id="_x0000_i1026" style="WIDTH: 415.5pt; HEIGHT: 237.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.png"></imagedata></shape>

 

 

图:将Accoona库里的文件拷贝到本地

<shape id="_x0000_i1027" style="WIDTH: 414.75pt; HEIGHT: 183pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.png"></imagedata></shape>

 

 

图:本地Accoona目录成为库Accoona的一个“Working Copy”

 

<shape id="_x0000_i1028" style="WIDTH: 95.25pt; HEIGHT: 49.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.png"></imagedata></shape>

 

图:本地Accoona目录下目录的状态

<shape id="_x0000_i1029" style="WIDTH: 415.5pt; HEIGHT: 96pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image009.png"></imagedata></shape>

 

2.添加文件

将需要添加到库里的文件或者目录拷贝到F:/Accoona下,然后在该文件或目录上单击右键,TortoiseSVN->Add,点OK,这时文件的状态图标会发生变化。注意:Add命令只是告诉本地的“Working Copy”将该文件纳入版本管理,并没有将这个改变提交到服务器端,如果想要别人也看见新加的文件或者目录,则需要在F:/Accoona(或者在该目录或文件)单击右键,SVN Commit...,将所做的修改提交到Repository。文件的状态图标也会更新。注意:不管在“Working Copy”内添加、修改、删除文件后,要想其他人也看见修改,都必须用Commit命令将所做修改递交到服务器端的Repository

图:添加文件
<shape id="_x0000_i1030" style="WIDTH: 375.75pt; HEIGHT: 390pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image011.png"></imagedata></shape>

 

图:此时的状态(该文件纳入版本管理,但是并未将这个改变提交到服务器端)

<shape id="_x0000_i1031" style="WIDTH: 414.75pt; HEIGHT: 89.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image013.png"></imagedata></shape>

 

图:提交给服务器(让别人也看见新加的文件或者目录)

<shape id="_x0000_i1032" style="WIDTH: 372pt; HEIGHT: 334.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image015.png"></imagedata></shape>

 

图:成功提交给服务器

<shape id="_x0000_i1033" style="WIDTH: 414.75pt; HEIGHT: 73.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image017.png"></imagedata></shape>

 

3.修改文件

用文本编辑器或IDE对文件修改后,文件的状态图标会变化,然后单击右键,SVN Commit...
提交修改,只有当执行Commit提交修改后,所作的修改才会反映到服务器端的Repository中。

图:修改my svn文件后(但是此时还没有提交给服务器)

<shape id="_x0000_i1034" style="WIDTH: 415.5pt; HEIGHT: 78pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image019.png"></imagedata></shape>
图:执行Commit提交修改

<shape id="_x0000_i1035" style="WIDTH: 415.5pt; HEIGHT: 83.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image021.png"></imagedata></shape>

 

4.删除文件

删除文件时,选中要删除的文件或目录,单击右键,TortoiseSVN->Delete,提交修改。注意千万不要用“Delete”键来删除文件,否则将无法提交你的修改。这一点对目录的删除来说尤为重要。

 

图:通过TortoiseSVN->Delete的方式删除文件
<shape id="_x0000_i1037" style="WIDTH: 369.75pt; HEIGHT: 408pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image023.png"></imagedata></shape>

 

 

图:删除my svn文件后,上级目录的状态,此时还没有执行Commit

 

<shape id="_x0000_i1038" style="WIDTH: 415.5pt; HEIGHT: 73.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image025.png"></imagedata></shape>

 

 

图:执行Commit提交删除操作

<shape id="_x0000_i1039" style="WIDTH: 414.75pt; HEIGHT: 320.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image027.png"></imagedata></shape>

 

 

图:成功执行Commit后的状态

<shape id="_x0000_i1040" style="WIDTH: 415.5pt; HEIGHT: 81.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image029.png"></imagedata></shape>

 

5.放弃修改

当添加、修改、删除文件后,决定放弃修改,可以单击右键,TortoiseSVN->Revert,本地的“Working Copy”中的文件和目录会恢复到你修改前的状态。

 

图:取消文件的修改
<shape id="_x0000_i1041" style="WIDTH: 414.75pt; HEIGHT: 428.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image031.png"></imagedata></shape>

 

6.获取Repository的最新版本

当一个团队合作开发项目时,每一个人都在不断对Repository进行更新,这就需要不断的更新自己的“Working Copy”,以获取项目最新的文件。当第一次获得最新Repository的文件时,用Checkout命令(前面已经介绍)以后再获取最新文件时就不用Checkout了,而改用Update命令。

接着前面的例子,这时F:/Accoona已经成为一个“Working Copy”了(通过执行Checkout命令),现在其他人已经对Repository进行了修改,想将别人的修改反映到自己的“Working Copy”中,具体的方法是:在F:/Accoona目录上单击右键,SVN Update。此时F:/ Accoona中的文件就是最新的版本了。

注意,如果当“Working Copy”中有被修改的文件,或者有被删除的文件,并且还未提交这些修改时,这些文件在执行Update过程中是不会被更新的。比如修改了F:/Accoonaa.txt文件,还未提交修改,那么,当对F:/Accoona进行Update时,a.txt文件是不会更新为Repository上的a.txt文件的。所以如果想放弃当前自己的所有修改,并将F:/Accoona下所有文件及目录更新到最新版本,则应该先对F:/Accoona执行Revert命令再执行Update命令。当前后两个人修改同一个文件的不同地方,此时若既要保留自己的修改,又要将该文件更新到服务器的最新版本,那么先将该文件Update,后再SVN Commit...,这样既保留的了自己的修改,又获得了服务器上别人的修改。当前后两个人修改的是同一个地方,此时做Update后,将产生该文件的几个不同版本的临时文件,此时可以Revert取消自己的修改,使其恢复正常。
图:对code目录的更新

<shape id="_x0000_i1042" style="WIDTH: 379.5pt; HEIGHT: 362.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image033.png"></imagedata></shape>

 

 

图:多人同时修改了同一文件的同一个地方,此时Update后增加几个临时文件

<shape id="_x0000_i1043" style="WIDTH: 414.75pt; HEIGHT: 73.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image035.png"></imagedata></shape>

 

图:当对该文件做Rever后文件状态恢复正常

 

<shape id="_x0000_i1044" style="WIDTH: 414.75pt; HEIGHT: 35.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image037.png"></imagedata></shape>

 

7.subversion的版本控制模型

Subversion的版本控制是Copy-Modify-Merge(拷贝-修改-合并)的模型。当用subversion进行版本控制时,Subversion会记录对Repository进行的每一次修改(包括添加,修改,删除等等),每修改一次Repository都会产生一个新的Revision(修订版本号),不同的Revision代表了不同时刻Repository的状态,因此可以用这个Revision回朔任意时刻Repository的状态,就像时间机器一样,也就是说某一Revision 就是Repository 在某一时刻的一个快照。注意:Revision 不是针对某一个文件或者目录,而是针对整个Repository而言的。每修改一次RepositoryRevision 都会增加1

8.“.svn”目录

在客户端Working Copy的每一层目录中都会有一个“.svn”目录,该目录是Subversion进行管理用的目录。不要手动修改其中的文件。该目录存储了Working Copy的一个副本。

 

9.混合版本

SubversionWorking Copy被设计成一种能够包含不同版本的文件共存的形式。比如F:/Accoona是一个Working Copy,该目录下有两个文件a.txtb.txt。执行Update命令,将Working Copy更新到最新版本(Revision 24)。这时,a.txtb.txtRevision都是24。(其实对于单个文件来说并不存在RevisionRevision是对于整个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一比较就可以知道你修改的文件是否基于该文件的最新版本。

10.文件的锁定

Subversion的版本控制模型是一种叫做Copy-Modify-Merge(拷贝-修改-合并)的模型。该模型在对文本文件进行版本控制时工作的很好,但是有些需要进行版本控制的文件并不是文本文件,比如说图像文件,这种模型在这种情况下就不能正常工作了,因为文本文件可以合并,而二进制文件则无法合并。所以Subversion支持Lock-Modify-Unlock(锁定-修改-解锁)的版本控制模型。这种模型要求在对一个文件修改前首先要锁定这个文件,然后才能修改,这时,别人将无法对该文件进行修改,当修改完后再释放锁,使其他人可以对该文件进行锁定,然后修改。

锁定文件的方法是:TortoiseSVN->Get Lock...再点OK按钮,这时就完成了对文件的锁定。此时,如果其他人想对文件进行锁定时,Subversion会对他提示该文件已经被别人锁定。当修改完文件后,然后单击右键,SVN Commit...,将修改提交,默认情况下,提交的时候就会对该文件解锁,如果想仍然锁定该文件,请在commit时弹出的对话框中选中keep lock复选框。

图:文件的lock
<shape id="_x0000_i1045" style="WIDTH: 414.75pt; HEIGHT: 38.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image039.png"></imagedata></shape>

 

11.回到以前的版本

由于Subversion会记录你对Repository的每一次修改,因此能够很容易的获得Repository以前某一时刻的状态。比如:现在Repository的最新Revision56,这时我想看看RepositoryRevision24时的状态,可以在本地的Working Copy中单击右键,TortoiseSVN->Update to Revision...,然后输入你想要回复到的Revision号,点OK按钮。

12.查看修改

有时对Working Copy的许多文件进行了修改,这些文件位于不同的子目录,就可以在Working Copy的最上层目录单击右键,TortoiseSVN->Check For Modifications,弹出的对话框就会显示所做的所有修改明细。
还有一种情况:若Working Copy已经很久没有执行Update命令,想看看Working Copy中有哪些文件已经发生修改了,这时可以在Working Copy的最上层目录单击右键,TortoiseSVN->Check For Modifications,在弹出的对话框点击Check Repository按钮后,就会显示服务器端已经修改了的文件。

该方法还有一个用途就是查看文件的锁定,当想锁定一个文件时,想先看看这个文件有没有被别人锁定,点击Check Repository按钮会显示服务器端Repository所有被锁定的文件,如果你想锁定的文件不在这里面,那就说明该文件目前没有人锁定。

13.察看文件/目录的修改记录 --- log

就是看文件/目录的history。选Show Log就好

图:文件的修改记录

<shape id="_x0000_i1036" style="WIDTH: 414.75pt; HEIGHT: 347.25pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image041.png"><font size="3"></font></imagedata></shape>

14.比较文件或者不同版本间的比较 – diff

如上图,得到历史版本后,就可以直接diff了, Client自带了Compare功能