subversion手册.docx
《subversion手册.docx》由会员分享,可在线阅读,更多相关《subversion手册.docx(21页珍藏版)》请在冰豆网上搜索。
![subversion手册.docx](https://file1.bdocx.com/fileroot1/2022-11/30/d643d033-9f60-4c23-a2fd-e7285da6c9d6/d643d033-9f60-4c23-a2fd-e7285da6c9d61.gif)
subversion手册
Subversion简明手册
1.subversion基本概念
subversion是由包括原cvs开发者在内的一个开发组开发维护的,目的很明确,就是为了修复cvs的某些缺陷,添加一些有用的新特性。
从本地客户端连接到svn服务器有三种方式,本地访问方式、基于TCP/IP网络的HTTP方式、使用svn自带协议的svnserve方式。
2.svn工具组件
安装好svn后,有如下一些组件可用:
svn命令行客户端程序
svnversion用来显示工作拷贝的状态(当前项目的修订版本)
svnlook直接查看subversion版本库的工具
svnadmin建立、调整和修复subversion版本库的工具
svndumpfilter过滤subversion版本库转储数据流的工具
mod_dav_svnApacheHTTP服务器的一个插件,使版本库可以通过网络访问
svnserve一个单独运行的服务器程序,可以作为守护进程或由SSH调用。
svnsync一个通过网络增量镜像版本库方式
3.常用用法
使用svn的帮助:
svnhelp
单个svn命令的帮助:
svnhelpcheckout
cs7902项目使用svnserve访问svn服务器,列出项目下所有文档的命令如下:
#svnlistsvn:
//192.168.2.57/cs7902doc/mydroid/svn-commit.tmp#
字符串svn:
//192.168.2.57/cs7902就是我们的版本库根路径。
使用subversion的典型工作周期如下:
●更新你的工作拷贝
❍svnupdate
●做出修改
❍svnadd
❍svndelete
❍svncopy
❍svnmove
●检验修改
❍svnstatus
❍svndiff
●可能会取消一些修改
❍svnrevert
●解决冲突(合并别人的修改)
❍svnupdate
❍svnresolved
●提交你的修改
❍svncommit
更新你的工作拷贝
更新你的工作拷与最新的版本同步。
$svnupdate
Ufoo.c
Ubar.c
Updatedtorevision2.
服务器通过svnupdate将修改传递到你的工作拷贝时,每一个项目之前会有一个字母,来让你知道Subversion为保持最新对你的工作拷贝作了哪些工作。
关于这些字母的详细含义如下:
A添加D删除U更新C冲突G合并
修改你的工作拷贝
可以使用的Subversion命令包括svnadd、svndelete、svncopy和svnmove。
如果只是修改版本库中已经存在的文件,在你提交之前,不必使用上面的任何一个命令。
可以对工作拷贝做出两种修改:
文件修改和目录树修改。
你不需要告诉Subversion你希望修改一个文件,只需要用你的编辑器、字处理器、图形程序或任何工具做出修改,Subversion自动监测到文件的更改,此外,二进制文件的处理方式和文本文件一样—也有同样的效率。
对于目录树更改,你可以告诉Subversion将文件和目录预定的删除、添加、拷贝或移动标记,这些动作会在工作拷贝上立刻发生效果,但只有提交后才会在版本库里生效。
下面是Subversion用来修改目录树结构的五个子命令。
版本控制符号连接
在非Windows平台,Subversion可以将特殊类型符号链接(或是“symlink”)版本化,一个符号链接是对文件系统中其他对象的透明引用,可以通过对符合链接操作实现对引用对象的读写操作。
当符号链提交到Subversion版本库,Subversion会记住这个文件实际上是一个符号链,也会知道这个符号链指向的“对象”。
当这个符号链检出到另一个支持符号链的操作系统上时,Subversion会重新构建文件系统级的符号链接。
当然这样不会影响在Windows这类不支持符号链的系统上,在此类系统上,Subversion只会创建一个包含指向对象路径的文本文件,因为这个文件不能在Windows系统上作为符号链使用,所以它也会防止Windows用户作其他Subversion相关的操作。
svnaddfoo
预定将文件、目录或者符号链foo添加到版本库,当你下次提交后,foo会成为其父目录的一个子对象。
注意,如果foo是目录,所有foo中的内容也会预定添加进去,如果你只想添加foo本身,请使用--non-recursive(-N)参数。
svndeletefoo
预定将文件、目录或者符号链foo从版本库中删除,如果foo是文件,它马上从工作拷贝中删除,如果是目录,不会被删除,但是Subversion准备好删除了,当你提交你的修改,foo就会在你的工作拷贝和版本库中被删除。
[4]
svncopyfoobar
建立一个新的项目bar作为foo的复制品,会自动预定将bar添加,当在下次提交时会将bar添加到版本库,这种拷贝历史会记录下来(按照来自foo的方式记录),svncopy并不建立中介目录。
svnmovefoobar
这个命令与与运行svncopyfoobar;svndeletefoo完全相同,bar作为foo的拷贝准备添加,foo已经预定被删除,svnmove不建立中介的目录。
svnmkdirblort
这个命令同运行mkdirblort;svnaddblort相同,也就是创建一个叫做blort的文件,并且预定添加到版本库。
不通过工作拷贝修改版本库
有一些情况下会立刻提交目录树的修改到版本库,这只发生在子命令直接操作URL,而不是工作拷贝路径时。
以特定的方式使用svnmkdir、svncopy、svnmove和svndelete可以针对URL操作(并且不要忘记svnimport只针对URL操作)。
指定URL的操作方式有一些区别,因为在使用工作拷贝的运作方式时,工作拷贝成为一个“集结地”,可以在提交之前整理组织所要做的修改,直接对URL操作就没有这种奢侈,所以当你直接操作URL的时候,所有以上的动作代表一个立即的提交。
检查你的修改
当你完成修改,你需要提交他们到版本库,但是在此之前,检查一下做过什么修改是个好主意,通过提交前的检查,你可以整理一份精确的日志信息,你也可以发现你不小心修改的文件,给了你一次恢复修改的机会。
此外,这是一个审查和仔细察看修改的好机会,你可通过命令svnstatus浏览所做的修改,通过svndiff检查修改的详细信息。
这三个命令(svnstatus、svndiff和svnrevert)都可以在没有网络的情况下工作(假定你的版本库是通过网络而不是本地访问的),这让你在没有网络连接时的管理修改过程更加容易,像在飞机上旅行,乘坐火车往返或是在海滩上奋力工作时。
[5]
Subversion通过在.svn管理区域使用原始的版本缓存来做到这一点,这使得报告和恢复本地修改而不必访问网络,这个缓存(叫做“text-base”)也允许Subversion可以根据原始版本生成一个压缩的增量(“区别”)提交—即使你有个非常快的网络,有这样一个缓存有极大的好处,只向服务器提交修改的部分而不是整个文件。
Subversion已经被优化来帮助你完成这个任务,可以在不与版本库通讯的情况下做许多事情,详细来说,对于每一个文件,你的的工作拷贝在.svn包含了一个“原始的”拷贝,所以Subversion可以快速的告诉你那些文件修改了,甚至允许你在不与版本库通讯的情况下恢复修改。
查看你的修改概况
为了浏览修改的内容,你会使用这个svnstatus命令,在所有Subversion命令里,svnstatus可能会是你用的最多的命令。
CVS用户:
控制另类的更新!
你也许使用cvsupdate来看你做了哪些修改,svnstatus会给你所有你做的改变—而不需要访问版本库,并且不会在不知情的情况下与其他用户作的更改比较。
在Subversion,update只是做这件事—将工作拷贝更新到版本库的最新版本,你可以消除使用update察看本地修改的习惯。
如果你在工作拷贝的顶级目录运行不带参数的svnstatus命令,它会检测你做的所有的文件或目录的修改,以下的例子是来展示svnstatus可能返回的状态码(注意,#之后的不是svnstatus打印的)。
Astuff/loot/bloo.h#fileisscheduledforaddition
Cstuff/loot/lump.c#filehastextualconflictsfromanupdate
Dstuff/fish.c#fileisscheduledfordeletion
Mbar.c#thecontentinbar.chaslocalmodifications
在这种格式下,svnstatus打印6列字符,紧跟一些空格,接着是文件或者目录名。
第一列告诉一个文件或目录的状态或它的内容,返回代码如下:
Aitem
预定加入到版本库的文件、目录或符号链的item。
Citem
文件item发生冲突,在从服务器更新时与本地版本发生交迭,在你提交到版本库前,必须手工的解决冲突。
Ditem
文件、目录或是符号链item预定从版本库中删除。
Mitem
文件item的内容被修改了。
如果你传递一个路径给svnstatus,它只给你这个项目的信息:
$svnstatusstuff/fish.c
Dstuff/fish.c
svnstatus也有一个--verbose(-v)选项,它可以显示工作拷贝中的所有项目,即使没有改变过的:
$svnstatus-v
M4423sallyREADME
4430sallyINSTALL
M4420harrybar.c
4418irastuff
4435harrystuff/trout.c
D4419irastuff/fish.c
4421sallystuff/things
A0?
?
stuff/things/bloo.h
4436harrystuff/things/gloo.c
这是svnstatus的“加长形式”,第一列保持相同,第二列显示一个工作版本号,第三和第四列显示最后一次修改的版本号和修改人(这些列不会与我们刚才提到的字符混淆)。
上面所有的svnstatus调用并没有联系版本库,只是与.svn中的原始数据进行比较的结果,最后,是--show-updates(-u)选项,它将会联系版本库为已经过时的数据添加新信息:
$svnstatus-u-v
M*4423sallyREADME
M4420harrybar.c
*4435harrystuff/trout.c
D4419irastuff/fish.c
A0?
?
stuff/things/bloo.h
Statusagainstrevision:
46
注意这两个星号:
如果你现在执行svnupdate,你的README和trout.c会被更新,这告诉你许多有用的信息—你可以在提交之前,需要使用更新操作得到文件README的更新,或者说文件已经过时,版本库会拒绝了你的提交。
(后面还有更多关于此主题)。
关于文件和目录,svnstatus可以比我们的展示显示更多的内容,完整的描述可以看svnstatus。
检查你的本地修改的详情
另一种检查修改的方式是svndiff命令,你可以通过不带参数的svndiff精确的找出你所做的修改,这会输出统一区别格式的区别信息:
$svndiff
Index:
bar.c
===================================================================
---bar.c(revision3)
+++bar.c(workingcopy)
@@-1,7+1,12@@
+#include
+#include
+#include
+
+#include
intmain(void){
-printf("Sixty-fourslicesofAmericanCheese...\n");
+printf("Sixty-fiveslicesofAmericanCheese...\n");
return0;
}
Index:
README
===================================================================
---README(revision3)
+++README(workingcopy)
@@-193,3+193,4@@
+Notetoself:
pickuplaundry.
Index:
stuff/fish.c
===================================================================
---stuff/fish.c(revision1)
+++stuff/fish.c(workingcopy)
-Welcometothefileknownas'fish'.
-Informationonfishwillbeheresoon.
Index:
stuff/things/bloo.h
===================================================================
---stuff/things/bloo.h(revision8)
+++stuff/things/bloo.h(workingcopy)
+Hereisanewfiletodescribe
+thingsaboutbloo.
svndiff命令通过比较你的文件和.svn的“原始”文件来输出信息,预定要增加的文件会显示所有增加的文本,要删除的文件会显示所有要删除的文本。
输出的格式为统一区别格式(unifieddiffformat),删除的行前面加一个-,添加的行前面有一个+,svndiff命令也打印文件名和打补丁需要的信息,所以你可以通过重定向一个区别文件来生成“补丁”:
$svndiff>patchfile
举个例子,你可以把补丁文件发送邮件到其他开发者,在提交之前审核和测试。
Subversion使用内置区别引擎,缺省情况下输出为统一区别格式。
如果你期望不同的输出格式,你可以使用--diff-cmd指定外置的区别程序,并且通过--extensions传递其他参数,举个例子,察看本地文件foo.c的区别,同时忽略大小写差异,你可以运行svndiff--diff-cmd/usr/bin/diff--extensions'-bc'foo.c。
取消本地修改
假定我们在看svndiff的输出,你发现对某个文件的所有修改都是错误的,或许你根本不应该修改这个文件,或者是从开头重新修改会更加容易。
这是使用svnrevert的好机会:
$svnrevertREADME
Reverted'README'
Subversion把文件恢复到未修改的状态,叫做.svn目录的“原始”拷贝,应该知道svnrevert可以恢复任何预定要做的操作,举个例子,你不再想添加一个文件:
$svnstatusfoo
?
foo
$svnaddfoo
Afoo
$svnrevertfoo
Reverted'foo'
$svnstatusfoo
?
foo
注意
svnrevertITEM的效果与删除ITEM然后执行svnupdate-rBASEITEM完全一样,但是,如果你使用svnrevert它不必通知版本库就可以恢复文件。
或许你不小心删除了一个文件:
$svnstatusREADME
README
$svndeleteREADME
DREADME
$svnrevertREADME
Reverted'README'
$svnstatusREADME
README
解决冲突(合并别人的修改)
我们可以使用svnstatus-u来预测冲突,当你运行svnupdate一些有趣的事情发生了:
$svnupdate
UINSTALL
GREADME
Cbar.c
Updatedtorevision46.
U和G没必要关心,文件干净的接受了版本库的变化,文件标示为U表明本地没有修改,文件已经根据版本库更新。
G标示合并,标示本地已经修改过,与版本库没有重迭的地方,已经合并。
但是C表示冲突,说明服务器上的改动同你的改动冲突了,你需要自己手工去解决。
当冲突发生了,有三件事可以帮助你注意到这种情况和解决问题:
●Subversion在更新时打印C标记,并且标记这个文件已冲突。
●如果Subversion认为这个文件是可合并的,它会置入冲突标记—特殊的横线分开冲突的“两面”—在文件里可视化的描述重叠的部分(Subversion使用svn:
mime-type属性来决定一个文件是否可以使用上下文的,以行为基础的合并,更多信息可以看“文件内容类型”一节。
)
●对于每一个冲突的文件,Subversion放置三个额外的未版本化文件到你的工作拷贝:
filename.mine
你更新前的文件,没有冲突标志,只是你最新更改的内容。
(如果Subversion认为这个文件不可以合并,.mine文件不会创建,因为它和工作文件相同。
)
filename.rOLDREV
这是你的做更新操作以前的BASE版本文件,就是你在上次更新之后未作更改的版本。
filename.rNEWREV
这是你的Subversion客户端从服务器刚刚收到的版本,这个文件对应版本库的HEAD版本。
这里OLDREV是你的.svn目录中的修订版本号,NEWREV是版本库中HEAD的版本号。
举一个例子,Sally修改了sandwich.txt,Harry刚刚改变了他的本地拷贝中的这个文件并且提交到服务器,Sally在提交之前更新它的工作拷贝得到了冲突:
$svnupdate
Csandwich.txt
Updatedtorevision2.
$ls-1
sandwich.txt
sandwich.txt.mine
sandwich.txt.r1
sandwich.txt.r2
在这种情况下,Subversion不会允许你提交sandwich.txt,直到你的三个临时文件被删掉。
$svncommit-m"Addafewmorethings"
svn:
Commitfailed(detailsfollow):
svn:
Abortingcommit:
'/home/sally/svn-work/sandwich.txt'remainsinconflict
如果你遇到冲突,三件事你可以选择:
●“手动”合并冲突文本(检查和修改文件中的冲突标志)。
●用某一个临时文件覆盖你的工作文件。
●运行svnrevert来放弃所有的本地修改。
一旦你解决了冲突,你需要通过命令svnresolved让Subversion知道,这样就会删除三个临时文件,Subversion就不会认为这个文件是在冲突状态了。
[6]
$svnresolvedsandwich.txt
Resolvedconflictedstateof'sandwich.txt'
手工合并冲突
第一次尝试解决冲突让人感觉很害怕,但经过一点训练,它简单的像是骑着车子下坡。
这里一个简单的例子,由于不良的交流,你和同事Sally,同时编辑了sandwich.txt。
Sally提交了修改,当你准备更新你的工作拷贝,冲突发生了,我们不得不去修改sandwich.txt来解决这个问题。
首先,看一下这个文件:
$catsandwich.txt
Toppieceofbread
Mayonnaise
Lettuce
Tomato
Provolone
<<<<<<<.mine
Salami
Mortadella
Prosciutto
=======
Sauerkraut
GrilledChicken
>>>>>>>.r2
CreoleMustard
Bottompieceofbread
小于号、等于号和大于号串是冲突标记,并不是冲突的数据,你一定要确定这些内容在下次提交之前得到删除,前两组标志中间的内容是你在冲突区所做的修改:
<<<<<<<.mine
Salami
Mortadella
Prosciutto
=======
后两组之间的是Sally提交的修改冲突:
=======
Sauerkraut
GrilledChicken
>>>>>>>.r2
通常你并不希望只是删除冲突标志和Sally的修改—当她收到三明治时,会非常的吃惊。
所以你应该走到她的办公室或是拿起电话告诉Sally,你没办法从从意大利熟食店得到想要的泡菜。
[7]一旦你们确认了提交内容后,修改文件并且删除冲突标志。
Toppieceofbread
Mayonnaise
Lettuce
Tomato
Provolone
Salami
Mortadella
Prosciutto
CreoleMustard
Bottompieceofbread
现在运行svnresolved,你已经准备好提交了:
$svnresolvedsandwich.txt
$svncommit-m"Goaheadandusemysandwich,discardingSally'sedits."
现在我们准备好提交修改了,注意svnresolved不像我们本章学过的其他命令一样需要参数,在任何你认为解决了冲突的时候,只需要小心运行svnresolved,—一旦删除了临时文件,Subversion会让你提交这文件,即使文件中还存在冲突标记。
记住,如果你修改冲突时感到混乱,你可以参考subversion生成的三个文件—包括你未作更新的文件。
你也可以使用三方交互合并工具检验这三个文件。
复制文件到你的工作文件
如果你只是希望取消你的修改,你可以仅仅拷贝Subversion为你生成的文件替换你的工作拷贝:
$svnupdate
Csandwich.txt
Updatedtorevision2.
$ls