SVN简易使用手册新手上路

本节讲解一下SVN简易使用手册中使用svn获取开源项目源代码的内容,之前一节我们没有讲解完毕,在这里做一下补充,希望通过本节大家能够学到更多知识。

修改你的工作拷贝
SVN简易使用手册介绍修改你的工作拷贝。现在你可以开始工作并且修改你的工作拷贝了,你很容易决定作出一个修改(或者是一组),像写一个新的特性,修正一个错误等等。这时可以使用的Subversion命令包括svnadd、svndelete、svncopy和svnmove。如果你只是修改版本库中已经存在的文件,在你提交之前,不必使用上面的任何一个命令。你可以对工作备份作的修改包括:
文件修改
这是最简单的一种修改,你不必告诉Subversion你想修改哪一个文件,只需要去修改,然后Subversion会自动地探测到哪些文件已经更改了。
目录树修改
你可以“标记”目录或者文件为预定要删除、增加、复制或者移动,也许这些改动在你的工作拷贝马上发生,而版本库只在你提交的时候才发生改变。
修改文件,可以使用文本编辑器、字处理软件、图形程序或任何你常用的工具,Subverion处理二进制文件像同文本文件一样―效率也一样。
这些是常用的可以修改目录树结构的子命令(我们会在后面包括svnimport和svnmkdir)。

警告
SVN简易使用手册中遇到的问题警告。你可以使用任何你喜欢的工具编辑文件,但你不可以在修改目录结构时不通知Subversion,需要使用svncopy、svndelete和svnmove命令修改工作拷贝的结构,使用svnadd增加版本控制的新文件或目录。
svnaddfoo预定将文件、目录或者符号链foo添加到版本库,当你下次提交后,foo会成为其父目录的一个子对象。注意,如果foo是目录,所有foo中的内容也会预定添加进去,如果你只想添加foo本身,使用--non-recursive(-N)参数。
svndeletefoo预定将文件、目录或者符号链foo从版本库中删除掉,如果foo是文件,它马上从工作拷贝中删除,如果是目录,不会被删除,但是Subversion准备好删除了,当你提交你的修改,foo就会在你的工作拷贝和版本库中被删除。[2]
svncopyfoobar建立一个新的项目bar作为foo的复制品,当在下次提交时会将bar添加到版本库,这种拷贝历史会记录下来(按照来自foo的方式记录),svncopy并不建立中介目录。
svnmovefoobar这个命令与与运行svncopyfoobar;svndeletefoo完全相同,bar作为foo的拷贝准备添加,foo已经预定要被删除,svnmove不建立中介的目录。
不通过工作拷贝修改版本库
SVN简易使用手册介绍不通过工作拷贝修改版本库。本章的前面曾经说过,为了使版本库反映你的改动,你应该提交所有改动。这并不完全正确―有一些方式是可以直接操作版本库的,当然只有子命令直接操作URL而不是本地拷贝路径时才可以实现,通常svnmkdir、svncopy、svnmove、和svndelete可以使用URL工作。
指定URL的操作方式有一些区别,因为在使用工作拷贝的运作方式时,工作拷贝成为一个“集结地”,可以在提交之前整理组织所要做的修改,直接对URL操作就没有这种奢侈,所以当你直接操作URL的时候,所有以上的动作代表一个立即的提交。

检查你的修改
当你完成修改,你需要提交他们到版本库,但是在此之前,检查一下做过什么修改是个好主意,通过提交前的检查,你可以整理一份精确的日志信息,你也可以发现你不小心修改的文件,给了你一次恢复修改的机会。此外,这是一个审查和仔细察看修改的好机会,你可通过命令svnstatus、svndiff和svnrevert精确地察看所做的修改。你可以使用前两个命令察看工作拷贝中的修改,使用第三个来撤销部分(或全部)的修改。
Subversion已经被优化来帮助你完成这个任务,可以在不与版本库通讯的情况下做许多事情,详细来说,对于每一个文件,你的的工作拷贝在.svn包含了一个“原始的”拷贝,所以Subversion可以快速的告诉你那些文件修改了,甚至允许你在不与版本库通讯的情况下恢复修改。
svnstatus相对于其他命令,你会更多地使用这个svnstatus命令。
CVS用户:控制另类的更新!你也许使用cvsupdate来看你做了哪些修改,svnstatus会给你所有你做的改变―而不需要访问版本库,并且不会在不知情的情况下与其他用户作的更改比较。
在Subversion,update只是做这件事―将工作拷贝更新到版本库的最新版本,你可以消除使用update察看本地修改的习惯。

SVN简易使用手册中如果你在工作拷贝的顶级目录运行不带参数的svnstatus命令,它会检测你做的所有的文件或目录的修改,以下的例子是来展示svnstatus可能返回的状态码(注意,#之后的不是svnstatus打印的)。Labc.c#svn已经在.svn目录锁定了abc.cMbar.c#bar.c的内容已经在本地修改过了Mbaz.c#baz.c属性有修改,但没有内容修改X3rd_party#这个目录是外部定义的一部分?foo.o#svn并没有管理foo.o!some_dir#svn管理这个,但它可能丢失或者不完整~qux#作为file/dir/link进行了版本控制,但类型已经改变I.screenrc#svn不管理这个,配置确定要忽略它A+moved_dir#包含历史的添加,历史记录了它的来历M+moved_dir/README#包含历史的添加,并有了本地修改Dstuff/fish.c#这个文件预定要删除Astuff/loot/bloo.h#这个文件预定要添加Cstuff/loot/lump.c#这个文件在更新时发生冲突Rxyz.c#这个文件预定要被替换Sstuff/squawk#这个文件已经跳转到了分支在这种格式下,svnstatus打印五列字符,紧跟一些空格,接着是文件或者目录名。第一列告诉一个文件的状态或它的内容,返回代码解释如下:
Aitem文件、目录或是符号链item预定加入到版本库。
Citem文件item发生冲突,在从服务器更新时与本地版本发生交迭,在你提交到版本库前,必须手工的解决冲突。
Ditem文件、目录或是符号链item预定从版本库中删除。
Mitem文件item的内容被修改了。
Ritem文件、目录或是符号链item预定将要替换版本库中的item,这意味着这个对象首先要被删除,另外一个同名的对象将要被添加,所有的操作发生在一个修订版本。
Xitem目录没有版本化,但是与Subversion的外部定义关联,关于外部定义,可以看“外部定义”一节。
?item文件、目录或是符号链item不在版本控制之下,你可以通过使用svnstatus的--quiet(-q)参数或父目录的svn:ignore属性忽略这个问题,关于忽略文件的使用,见“svn:ignore”一节。!item文件、目录或是符号链item在版本控制之下,但是已经丢失或者不完整,这可能因为使用非Subversion命令删除造成的,如果是一个目录,有可能是检出或是更新时的中断造成的,使用svnupdate可以重新从版本库获得文件或者目录,也可以使用svnrevertfile恢复原来的文件。
~item文件、目录或是符号链item在版本库已经存在,但你的工作拷贝中的是另一个。举一个例子,你删除了一个版本库的文件,新建了一个在原来的位置,而且整个过程中没有使用svndelete或是svnadd。


Iitem文件、目录或是符号链item不在版本控制下,Subversion已经配置好了会在svnadd、svnimport和svnstatus命令忽略这个文件,关于忽略文件,见“svn:ignore”一节。注意,这个符号只会在使用svnstatus的参数--no-ignore时才会出现―否则这个文件会被忽略且不会显示!
第二列说明文件或目录的属性的状态(更多细节可以看“属性”一节),如果一个M出现在第二列,说明属性被修改了,否则显示空白。
第三列只显示空白或者L,L表示Subversion已经在.svn工作区域锁定了这个项目,当你的svncommit正在运行的时候―也许正在输入log信息,运行svnstatus你可以看到L标记,如果这时候Subversion并没有运行,可以推测Subversion发生中断并且已经锁定,你必须运行svncleanup来清除锁定(本节后面将有更多论述)。
第四列只会显示空白或+,+的意思是一个有附加历史信息的文件或目录预定添加或者修改到版本库,通常出现在svnmove或是svncopy时,如果是看到A+就是说要包含历史的增加,它可以是一个文件或是拷贝的根目录。+表示它是即将包含历史增加到版本库的目录的一部分,也就是说他的父目录要拷贝,它只是跟着一起的。M+表示将要包含历史的增加,并且已经更改了。当你提交时,首先会随父目录进行包含历史的增加,然后本地的修改提交到更改后的版本。
第五列只显示空白或是S,表示这个目录或文件已经转到了一个分支下了(使用svnswitch)。如果你传递一个路径给svnstatus,它只给你这个项目的信息:$svnstatusstuff/fish.cDstuff/fish.c
svnstatus也有一个--verbose(-v)选项,它可以显示工作拷贝中的所有项目,即使没有改变过:

$svnstatus--verboseM4423sallyREADME4430  


sallyINSTALLM4420harrybar.c4418ira  


stuff4435harrystuff/trout.cD4419ira  


stuff/fish.c4421sallystuff/thingsA0??  


stuff/things/bloo.h4436harrystuff/things/gloo.c  


 

这是svnstatus的“加长形式”,第一列保持相同,第二列显示一个工作版本号,第三和第四列显示最后一次修改的版本号和修改人。上面所有的svnstatus调用并没有联系版本库,只是与.svn中的元数据进行比较的结果,最后,是--show-updates(-u)参数,它将会联系版本库为已经过时的数据添加新信息:

相关推荐