`

SVN 命令

 
阅读更多

SVN中的修订版本号

当新建一个版本库时,它的修订版本号为0,每当执行一次提交命令时,它的修订版本号就增加1,SVN也用一些关键字表示某一些版本:

HEAD:版本库中最新的版本

BASE:工作拷贝中一个条目的修订版本号,如果该版本在本地修改了,则“BASE版本”就是这个条目在本地未修改的版本。

COMMITTED:在BASE版本之前(或者BASE)一个项目最后修改的版本。

PREV:一个项目最后修改版本之前的那个版本。

SVN命令

SVN的命令格式为 svn command [options]


其中command是svn要执行的命令,签出,提交,更新等。主要的命令及命令格式如下:

import

svn import d:\OA http://192.168.30.57:6060/svn/oa/ -m " "


checkout

checkout可以简写为co。它是从版本库中将文件(夹)签出到工作目录中。命令格式如下:

svn co URL[@REV] [path]

URL是版本库的地址,REV是要签出的版本号。path指定工作目录,如果不指定则是当前目录。
commit

将本地修改(包括文件内容修改,添加删除文件,文件夹等)提交到SVN版本库中。其命令格式主要如下:

svn commit -m”message” [path]

-m是必须的,它后面接着的是日志的内容message,message可以为空。但是强烈建议大家添加日志内容,描述本次提交的目的和修改的范围。path指定要提交的目录,以递归的方式提交该目录下的子目录和文件。如果不指定path,则默认是当前目录。

注意:在commit之前,一定要使用一次update命令(下面介绍),并且再测试,无检测出bug之后才提交,避免版本库中的代码充满bug。(为什么要执行update以及执行它之后可能出现的情况请看本文档结尾)
update

将版本库的最新版本下载到本地。命令格式如下:

svn update [path]

选项path的作用和commit中path的作用一样。

update时候,在执行结果中会列出结果,其结果如下所示

[status] [filename]

status包括A(添加文件),D(删除文件),R(替换文件),U(更新文件),C(版本库与本地文件冲突,无法合并),G(版本库中的文件与本地文件合并),filename是发生发生了上述改变的文件的文件名。发生冲突的解决方法请看本文档结尾)
status

显示本地文件的状态。其命令格式如下:

svn status [path]

选项path和commit中的选项path一样。

status执行的结果由若干列组成,列与列有空格分开,状态很多,在这里不详细说,其中第一列的状态包括A,D,R,U,C,M,请参考update命令,还有"?",表示该文件没有被版本化,请使用add命令将其加进版本库中,"!"表示文件丢失,比如不使用SVN命令delete而删除了文件。其它状态不在这里描述。
add

添加文件(夹)到版本库中,它是做一个标志,在commit才会真正添加进去。它的命令格式如下:

svn add path

path是指定要添加的文件或者目录
delete

删除文件(夹)。同add命令的一样,它也是先做一个标志,在commit时才改变版本库。命令格式如下:

svn delete path

path选项同add
diff

diff命令用于比较文件的差别。其主要的命令格式如下

svn diff [filename]

filename是要比较的文件路径,如果它是一个目录的话,则会比较该目录下面所有的文件。不指定path则默认为当前目录。diff也可以指定要比较的文件的版本号,在这里不详细描述。这个简单的命令格式比较的是文件的当前状态和它被签出或被更新时候的状态,它并不自动比较当前文件和版本库中最新版本的文件的差别,它显示的是该文件被更新后被修改的情况。
revert

将文件恢复到它被签出或上一次被更新的状态。执行这个命令,可以恢复对指定文件的修改,不能恢复对文件夹的删除操作。命令格式如下:

svn revert filename

filename同diff中的filename。它不能省略。
resolved

删除文件冲突的标志。在执行update的时候,有可能文件被标志为冲突(C),使用这个命令可以去除这个标志,但是它并不能解决冲突。解决冲突的问题由开发人员协商解决。其命令格式如下:

svn resolved filename

filename指定文件名


commit前执行update的原因

当从版本库签出源代码到工作目录后,所有的编辑,修改都是改变工作目录中的内容,而不是实时的反映到版本库中,知道commit才会修改版本库。在多人协同开发的环境下,往往在自己进行修改源代码的时候,别人已经commit了导致版本库内容改变,这个时候,工作目录中的文件都已经“过时”了,如果将这些“过时”的代码提交到版本库中,会产生意想不到的结果。举例说,版本库中有文件a.h,a.c,并且宏MAX在a.h中定义,在a.c中用到。开发人员Peter和Amy。如果Peter修改了a.h,删除了宏MAX,再提交到版本库中,而此时,Amy仍然修改着a.c,当他修改完并且直接提交后,版本库中的文件情况如下a.h(由Peter修改),a.c(由Amy修改),这时的代码,a.c所使用的MAX在a.h中无定义了。一个BUG被无意中引入!因此在执行commit前一定要执行一遍update,否则版本库会变得很混乱。

冲突的产生

多人协同开发的情况下,多个人同时修改同一个文件的情况是很常见的。他们从版本库中签出同样一份源代码。如果他们修改了同样一个文件的话,SVN会尝试将这些修改合并,如果合并成功,则标志为合并(G,请参考update命令),如果SVN无法将这些修改合并,就会设置冲突标志(C,请参考update命令)。主要体现在不同的人对同一份文件的同一个地方做出了不同的修改(比如修改第10行的文字),SVN不能也不应该决定应该选择哪份修改而丢弃另一分修改,因此,它标志文件为冲突,由开发人员进行协商解决。

解决冲突的方法

冲突发生时,SVN会放置三个未版本化的文件到工作目录中:

filename.mine: 文更新前的被修改的文件

filename.rOLDREV: 更新前文件的BASE版本

filename.rNEWREV: 文件在版本库中的最新版本

发生冲突时,需要开发人员之间协商来决定使用哪一部份的代码。再执行resolved命令将冲突标志去除,resolved命令也将上述新建的文件删除。

在发生冲突的文件中,SVN会添加额外的标志标识冲突的地方,比如filename发生冲突,那么filename变成如下形式:

Lettuce

Tomato

<<<<<<< .mine

Salami

Mortadella

======

Sauerkraut

Prosciutto

>>>>>> .r2

Creole Mustard

Bottom piece of


其中的小于号,等于号,大于号是SVN添加的冲突标记。它表示:

小于号和等于号之间是你当前工作目录中所修改文件的内容,等于号和大于号之间的部分是版本库中文件的内容,其它部分是它们之间相同的部分。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics