subversion手册.docx

上传人:b****5 文档编号:4363393 上传时间:2022-11-30 格式:DOCX 页数:21 大小:28.90KB
下载 相关 举报
subversion手册.docx_第1页
第1页 / 共21页
subversion手册.docx_第2页
第2页 / 共21页
subversion手册.docx_第3页
第3页 / 共21页
subversion手册.docx_第4页
第4页 / 共21页
subversion手册.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

subversion手册.docx

《subversion手册.docx》由会员分享,可在线阅读,更多相关《subversion手册.docx(21页珍藏版)》请在冰豆网上搜索。

subversion手册.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1