Linux下SVN命令使用大全

来源:互联网 发布:免费交友恋爱软件 编辑:程序博客网 时间:2024/04/16 15:34

LinuxSVN命令使用大全

版本号

V0.1

修订内容


详细修订日期


文件性质


备注

正在继续添加和完善...

  1. 将文件checkout到本地目录

svncheckout pathpath是服务器上的目录)

例如:svncheckout svn://192.168.1.1/pro/domain

简写:svnco

  1. 往版本库中添加新的文件、目录或符号链

svnadd PATH...

例如:svnadd test.php(添加test.php)

svnadd *.php(添加当前目录下所有的php文件)

  • 文件、目录或符号链到你的工作拷贝并且预定添加到版本库。它们会在下次提交上传并添加到版本库,如果你在提交之前改变了主意,你可以使用svnrevert取消预定。

  • 是否访问版本库否

  • 选项

--targetsFILENAME

--non-recursive(-N)

--quiet(-q)

--config-dirDIR

--no-ignore

--auto-props

--no-auto-props

--force

  • 例子

添加一个文件到工作拷贝:

$svn add foo.c

A foo.c

当添加一个目录,svnadd缺省的行为方式是递归的:

$svn add testdir

A testdir

A testdir/a

A testdir/b

A testdir/c

A testdir/d

你可以只添加一个目录而不包括其内容:

$svn add --non-recursive otherdir

A otherdir

通常情况下,命令svnadd *会忽略所有已经在版本控制之下的目录,有时候,你会希望添加所有工作拷贝的未版本化文件,包括那些隐藏在深处的文件,可以使用svnadd--force递归到版本化的目录下:

$svn add * --force

A foo.c

A somedir/bar.c

A otherdir/docs/baz.doc


  1. 将改动的文件提交到版本库

svncommit -m “LogMessage“ [-N] [--no-unlock]PATH(如果选择了保持锁,就使用–no-unlock开关)

例如:svncommit -m “add test file for my test“ test.php

简写:svnci

  1. 加锁/解锁

svnlock -m “LockMessage“ [--force] PATH

例如:svnlock -m “lock test file“ test.php

svnunlock PATH

  1. 更新到某个版本

svnupdate -r m path

例如:

svnupdate如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。

svnupdate -r 200 test.php(将版本库中的文件test.php还原到版本200)

svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svnresolved,最后再提交commit)

简写:svnup

  1. 查看文件或者目录状态

    1. svnstatus path(目录下的文件和子目录的状态,正常状态不显示)

?:不在svn的控制中;M:内容被修改C:发生冲突;A:预定加入到版本库;K:被锁定】

    1. svnstatus -v path(显示文件和子目录状态)

第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。

注:svnstatussvndiffsvnrevert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。

简写:svnst

  1. 删除文件

svndelete path -m “delete test fle“

例如:svndelete svn://192.168.1.1/pro/domain/test.php -m “delete test file”

或者直接svndelete test.php然后再svnci -m ‘delete test file‘,推荐使用这种

简写:svn(del, remove, rm)

  1. 查看日志

svnlog path

例如:svnlog test.php显示这个文件的所有修改记录,及其版本号的变化

  1. 查看文件详细信息

svninfo path

例如:svninfo test.php

  1. 比较差异

svndiff path(将修改的文件与基础版本比较)

例如:svndiff test.php

svndiff -r m:n path(对版本m和版本n比较差异)

例如:svndiff -r 200:201 test.php

简写:svndi

  1. 将两个版本之间的差异合并到当前文件

svnmerge -r m:n path

例如:svnmerge -r 200:205 test.php(将版本200205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

  1. SVN帮助

  • svnhelp [SUBCOMMAND...]

当手边没有这本书时,这是你使用Subversion最好的朋友!

  • 别名

?,h

  • 使用-?-h--help选项与使用help子命令效果相同。

  • 是否访问版本库否

  • 选项--config-dirDIR


名称

svnmerge —应用两组源文件的差别到工作拷贝路径。


概要

svnmerge [-c M | -r N:M] SOURCE[@REV] [WCPATH]

svnmerge sourceURL1[@N] sourceURL2[@M] [WCPATH]

svnmerge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]

描述

第一种和第二种形式里,源路径(第一种是URL,第二种是工作拷贝路径)用修订版本号NM指定,这是要比较的两组源文件,如果省略修订版本号,缺省是HEAD


-cM选项与-rN:M等价,其中N= M-1,使用-c-M则相反:-rM:N,其中N= M-1


第三种形式,SOURCE可以是URL或者工作拷贝项目,与之对应的URL会被使用。在修订版本号NMURL定义了要比较的两组源。


WCPATH是接收变化的工作拷贝路径,如果省略WCPATH,会假定缺省值“.”,除非源有相同基本名称与“.”中的某一文件名字匹配:在这种情况下,区别会应用到那个文件。


不像svndiff,合并操作在执行时会考虑文件的祖先,当你从一个分支合并到另一个分支,而这两个分支有各自重命名的文件时,这一点会非常重要。


别名


改变

工作拷贝2


是否访问版本库

只有在对URL操作时会


选项

--revision(-r) REV

--change(-c) REV

--non-recursive(-N)

--quiet(-q)

--force

--dry-run

--diff3-cmdCMD

--extensions(-x) ARG

--ignore-ancestry

--usernameUSER

--passwordPASS

--no-auth-cache

--non-interactive

--config-dirDIR


例子

将一个分支合并回主干(假定你有一份主干的工作拷贝,分支在修订版本250创建):


$svn merge -r 250:HEADhttp://svn.red-bean.com/repos/branches/my-branch

U myproj/tiny.txt

U myproj/thhgttg.txt

U myproj/win.txt

U myproj/flo.txt


如果你的分支在修订版本23,你希望将主干的修改合并到分支,你可以在你的工作拷贝的分支上这样做:


$svn merge -r 23:30 file:///tmp/repos/trunk/vendors

U myproj/thhgttg.txt


合并一个单独文件的修改:


$cd myproj

$svn merge -r 30:31 thhgttg.txt

U thhgttg.txt






在同一个版本库进行回滚

韩捷对SystemUI的修改分别在4647版本,现在要将其回滚到未修改之前的状态,则可以这样来做。

进入到SystemUI目录,然后运行:

svnmerge -r 46:45svn://localhost/MG701/alps/frameworks/base/packages/SystemUI

svnmerge -r 47:45svn://localhost/MG701/alps/frameworks/base/packages/SystemUI









  1. 版本库下的文件和目录列表

svnlist path

显示path目录下的所有属于版本库的文件和目录

简写:svnls

  1. 创建纳入版本控制下的新目录

svnmkdir:创建纳入版本控制下的新目录。

用法:

  1. mkdirPATH…

  2. mkdirURL…

创建版本控制的目录。

  1. 每一个以工作副本PATH指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。

  2. 每个以URL指定的目录,都会透过立即提交于仓库中创建。

在这两个情况下,所有的中间目录都必须事先存在。

  1. 恢复本地修改

svnrevert:恢复原始未改变的工作副本文件(恢复大部份的本地修改)

revert:

用法:revert PATH…

注意:本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复

被删除的目录

  1. 代码库URL变更

svnswitch (sw):更新工作副本至不同的URL

用法:

  1. switchURL [PATH]

  2. switch-–relocate FROM TO [PATH...]

  1. 更新你的工作副本,映射到一个新的URL,其行为跟“svnupdate”很像,也会将

服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的

方法。

  1. 改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动

(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命

令更新工作副本与仓库的对应关系。

  1. 解决冲突

svnresolved:移除工作副本的目录或文件的“冲突”状态。

用法:resolved PATH…

注意:本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的

相关文件,然后让PATH可以再次提交。


svnresolved

上一页svn子命令 下一页


--------------------------------------------------------------------------------


名称

svnresolved —删除工作拷贝文件或目录的“冲突”状态。


概要

svnresolved PATH...

描述

删除工作拷贝文件或目录的“conflicted”状态。这个程序不是语义上的改变冲突标志,它只是删除冲突相关的人造文件,从而重新允许PATH提交;也就是说,它告诉Subversion冲突已经“解决了”。关于解决冲突更深入的考虑可以查看“解决冲突(合并别人的修改)”一节。


别名


改变

工作拷贝2


是否访问版本库


选项

--targetsFILENAME

--recursive(-R)

--quiet(-q)

--config-dirDIR


例子

如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件:


$svn update

C foo.c

Updatedto revision 31.

$ls

foo.c

foo.c.mine

foo.c.r30

foo.c.r31


当你解决了foo.c的冲突,并且准备提交,运行svnresolved让你的工作拷贝知道你已经完成了所有事情。


警告

你可以仅仅删除冲突的文件并且提交,但是svnresolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。




















  1. 输出指定文件或URL的内容。

svncat目标[@版本]…如果指定了版本,将从指定的版本开始查找。

svncat -r PREV filename > filename (PREV是上一版本,也可以写具体版本号,这样输出结果是可以提交的)

  1. 创建版本库

svnadmincreate /mnt/MG701_NEW_DRIVE1/MG701

注意:各个子版本库的上层目录需要自己手动创建。比如:

建立/mnt/MG701_NEW_DRIVE1/的一个子版本库MG701可以这样操作:

先建立/mnt/MG701_NEW_DRIVE1/MG701目录(注意修改权限,让其读写可执行)

svnadmincreate /mnt/MG701_NEW_DRIVE1/MG701

要建立另外一个子版本库得先在/mnt/MG701_NEW_DRIVE1/目录下建立一个目录,比如/MG702(注意修改权限,让其读写可执行)。然后svnadmincreate /mnt/MG701_NEW_DRIVE1/MG702


  1. 开启版本库

svnserve-d -r /mnt/MG701_NEW_DRIVE1

注意:开启的时候有个技巧,如果要多个子版本库都开启,那么必须这样做:

svnserve-d -r /mnt/MG701_NEW_DRIVE1

这样一来,MG701MG702都开启了。


  1. svnimport —递归提交一个路径的拷贝到版本库。

Import整个目录svnimport files PATH -m “LogMessage“

例如:svnimport alps svn://192.168.4.210/MG701/alps-m “add test file for my test“ test.php

主意:这里红色标记的alps目录最好写出来(因为写出来之后,alps将会成为上传所有文件的顶层目录),否则上传到svn服务器上的将会是散的文件,而没有顶层目录。

  • 递归提交一个路径PATH的拷贝到URL。如果省略PATH,默认是“.”。版本库中对应的父目录必须已经创建。

  • 是否访问版本库:是

  • 选项

--message(-m) TEXT

--file(-F) FILE

--quiet(-q)

--non-recursive(-N)

--usernameUSER

--passwordPASS

--no-auth-cache

--non-interactive

--force-log

--editor-cmdEDITOR

--encodingENC

--config-dirDIR

--auto-props

--no-auto-props

--ignore-externals

  • 例子

这将本地目录myproj导入到版本库的trunk/misctrunk/misc目录在导入之前不需要存在—svnimport会递归的为你创建目录。

$svn import -m "New import" myprojhttp://svn.red-bean.com/repos/trunk/misc

Adding myproj/sample.txt

Transmittingfile data .........

Committedrevision 16.

需要知道这样不会在版本库创建目录myproj,如果你希望这样,请在URL后添加myproj


$svn import -m "New import" myprojhttp://svn.red-bean.com/repos/trunk/misc/myproj

Adding myproj/sample.txt

Transmittingfile data .........

Committedrevision 16.

在导入数据之后,你会发现原先的目录树并没有纳入版本控制,为了开始工作,你还是要运行svncheckout得到一个干净的目录树工作拷贝(为了避免这么麻烦,可以选择自己搜集和总结出来的方法)。

附加说明:

  • svnimport [PATH] URL——将未版本化文件导入版本库的最快方法,会根据需要创建中介目录

eg:svn import -m 'note' mytreefile:///var/svn/newrepos/some/project/mytree

  • svn客户端是可以配置忽略哪些些文件,比如说我们不想提交*.o之类的文件。那么可以通过设置svn:ignore或者global-ignore来进行过滤相关的文件。

有时基于某种需要,或者是导入一个别人之前维护的工程,里面有些*.so*.a文件必须保留,那么如果在第一次import的时候全部导入呢?

单个的可以使用svnadd后再提交这个文件,对于这样的文件较多且分散,可以使用--no-ignore选项。

eg:svn import [source] [repository] --no-ignoresvnadd [source] --no-ignore

会自动将source目录下所有的内容全部import或者add


22svnexport — 导出一个干净的目录树

  • svnexport [-r REV] URL[@PEGREV] [PATH]

从版本库导出干净工作目录树:指定URL,如果指定了修订版本REV,会导出相应的版本,如果没有指定修订版本,则会导出HEAD,导出到PATH。如果省略PATHURL的最后一部分会作为本地目录的名字。

  • svnexport [-r REV] PATH1[@PEGREV] [PATH2]

从工作拷贝导出干净目录树:是指定PATH1PATH2,所有的本地修改将会保留,但是不再版本控制下的文件不会拷贝。

  • 是否访问版本库:只有当从URL导出时会访问

  • 选项

--revision(-r) REV

--quiet(-q)

--force

--usernameUSER

--passwordPASS

--no-auth-cache

--non-interactive

--non-recursive(-N)

--config-dirDIR

--native-eolEOL

--ignore-externals

  • 例子

从你的工作拷贝导出(不会打印每一个文件和目录):

$svn export a-wc my-export

Exportcomplete.

  • 从版本库导出目录(打印所有的文件和目录):

$svn export file:///tmp/repos my-export

A my-export/test

A my-export/quiz

...

Exportedrevision 15.

当使用操作系统特定的分发版本,使用特定的EOL字符作为行结束符号导出一棵树会非常有用。--native-eol选项会这样做,但是如果影响的文件拥有svn:eol-style= native属性,举个例子,导出一棵使用CRLF作为行结束的树(可能是为了做一个Windows.zip文件分发版本):

$svn export file:///tmp/repos my-export --native-eol CRLF

A my-export/test

A my-export/quiz

...

Exportedrevision 15.

你可以为--native-eol选项指定LRCRCRLF作为行结束符。

23svnmove — 移动一个文件或目录。

svnmove SRC DST

描述

这个命令移动文件或目录到你的工作拷贝或者是版本库。


提示

这个命令同svncopy加一个svndelete等同。


注意

Subversion不支持在工作拷贝和URL之间拷贝,此外,你只可以一个版本库内移动文件—Subversion不支持跨版本库的移动。


WC-> WC

移动和预订一个文件或目录将要添加(包含历史)。


URL-> URL

完全服务器端的重命名。


别名

mv,rename, ren


改变

如果是对URL操作则会影响版本库,否则是工作拷贝


是否访问版本库

只有在对URl操作时会


选项

--message(-m) TEXT

--file(-F) FILE

--revision(-r) REV (废弃的)

--quiet(-q)

--force

--usernameUSER

--passwordPASS

--no-auth-cache

--non-interactive

--editor-cmdEDITOR

--encodingENC

--force-log

--config-dirDIR


例子

移动工作拷bede一个文件:


$svn move foo.c bar.c

A bar.c

D foo.c


移动版本库中的一个文件(一个立即提交,所以需要提交信息):


$svn move -m "Move a file"http://svn.red-bean.com/repos/foo.c \

http://svn.red-bean.com/repos/bar.c


Committedrevision 27.






因为你可以使用版本库的URL作为唯一参数取出一个工作拷贝,你也可以在版本库URL之后指定一个目录,这样会将你的工作目录放到你的新目录,举个例子:


$ svn checkout http://svn.collab.net/repos/svn/trunk subv

A subv/Makefile.in

A subv/ac-helpers

A subv/ac-helpers/install.sh

A subv/ac-helpers/install-sh

A subv/build.conf

Checkedout revision 8810.


这样将把你的工作拷贝放到subv而不是和前面那样放到trunk,如果subv不存在,将会自动创建。




附录一svn选项

Subversion命令行客户端:svn

为了使用命令行客户端,只需要输入svn和它的子命令以及相关的选项或操作的对象——输入的子命令和选项没有特定的顺序,下面使用svnstatus的方式都是合法的:

$svn -v status

$svn status -v

$svn status -v myfile

虽然Subversion的子命令有一些不同的选项,但有的选项是全局的—也就是说,每个选项保证是表示同样的事情,而不管是哪个子命令使用的。举个例子,--verbose-v)一直意味着“冗长输出”,而不管使用它的命令是什么。


--auto-props

开启auto-props,覆盖config文件中的enable-auto-props指示。


--change(-c) ARG

作为引用特定“修改”(也叫做修订版本)的方法,这个选项是“-rARG-1:ARG”语法上的甜头。


--config-dirDIR

指导Subversion从指定目录而不是默认位置(用户主目录的.subversion)读取配置信息。


--diff-cmdCMD

指定用来表示文件区别的外部程序,当svndiff调用时,会使用Subversion的内置区别引擎,默认会提供统一区别输出,如果你希望使用一个外置区别程序,使用--diff-cmd。你可以通过--extensions(本小节后面有更多介绍)把选项传递到区别程序。


--diff3-cmdCMD

指定一个外置程序用来合并文件。


--dry-run

检验运行一个命令的效果,但没有实际的修改—可以用在磁盘和版本库。


--editor-cmdCMD

指定一个外部程序来编辑日志信息或是属性值。如何设定缺省编辑器见“配置”一节的editor-cmd小节。


--encodingENC

告诉Subversion你的提交日志信息是通过提供的字符集编码的,缺省时是你的操作系统的本地编码,如果你的提交信息使用其它编码,你一定要指定这个值。


--extensions(-x) ARGS

指定一个或多个Subversion传递给提供文件区别的外部区别程序的参数,如果你要传递多个参数,你一定能够要用引号(例如,svndiff --diff-cmd /usr/bin/diff -x "-b-E")括起所有的参数。这个选项只有在使用--diff-cmd选项时使用。


--file(-F) FILENAME

为特定子命令使用命名文件的的内容,尽管不同的子命令对这些内容做不同的事情。例如,svncommit使用内容作为提交日志,而svnpropset使用它作为属性值。


--force

强制一个特定的命令或操作运行。Subversion有一些操作防止你做普通的使用,但是你可以传递force选项告诉Subversion“我知道我做的事情,也知道这样的结果,所以让我做吧”。这个选项在程序上等同于在打开电源的情况下做你自己的电子工作—如果你不知道你在做什么,你很有可能会得到一个威胁的警告。


--force-log

将传递给--message-m)或者--file-F)的可疑参数指定为有效可接受。缺省情况下,如果选项的参数看起来会成为子命令的目标,Subversion会提出一个错误,例如,你传递一个版本化的文件路径给--file-F)选项,Subversion会认为出了点错误,认为你将目标对象当成了参数,而你并没有提供其它的—未版本化的文件作为日志信息的文件。为了确认你的意图并且不考虑这类错误,传递--force-log选项给命令来接受它作为日志信息。


--help(-h-?)

如果同一个或多个子命令一起使用,会显示每个子命令内置的帮助文本,如果单独使用,它会显示常规的客户端帮助文本。


--ignore-ancestry

告诉Subversion在计算区别(只依赖于路径内容)时忽略祖先。


--ignore-externals

告诉Subversion忽略外部定义和外部定义管理的工作拷贝。


--incremental

打印适合串联的输出格式。


--limitNUM

只显示第一个NUM日志信息。


--message(-m) MESSAGE

表示你会在命令行中指定日志信息,紧跟这个开关,例如:


$svn commit -m "They don't make Sunday."


--newARG

使用ARG作为新的目标(结合svndiff使用)。


--no-auth-cache

阻止在Subversion管理区缓存认证信息(如用户名密码)。


--no-auto-props

关闭auto-props,覆盖config文件中的enable-auto-props指示。


--no-diff-added

防止Subversion打印添加文件的区别。缺省的行为方式是,当添加一个文件时,svndiff打印的信息和比较一个空白文件相同。


--no-diff-deleted

防止Subversion打印删除文件的区别信息,缺省的行为方式是当你删除了一个文件后运行svndiff打印的区别与删除文件所有的内容得到的结果一样。


--no-ignore

在状态列表中显示global-ignores配置选项或者是svn:ignore属性忽略的文件。见“配置”一节和“忽略未版本控制的条目”一节查看详情。


--no-unlock

不自动解锁文件(缺省的提交行为是解锁提交列出的所有文件),更多信息见“锁定”一节。


--non-interactive

如果认证失败,或者是不充分的凭证时,防止出现要求凭证的提示(例如用户名和密码)。这在运行自动脚本时非常有用,只是让Subversion失败而不是提示更多的信息。


--non-recursive(-N)

防止子命令迭代到子目录,大多数子命令缺省是迭代的,但是一些子命令—通常是那些潜在的删除或者是取消本地修改的命令—不是。


--notice-ancestry

在计算区别时关注祖先。


--oldARG

使用ARG作为旧的目标(结合svndiff使用)。


--passwordPASS

指出在命令行中提供你的密码—另外,如果它是需要的,Subversion会提示你输入。


--quiet(-q)

请求客户端在执行操作时只显示重要信息。


--recursive(-R)

让子命令迭代到子目录,大多数子命令缺省是迭代的。


--relocate目的路径[PATH...]

svnswitch子命令中使用,用来修改你的工作拷贝所引用的版本库位置。当版本库的位置修改了,而你有一个工作拷贝,希望继续使用时非常有用。见svnswitch的例子。


--revision(-r) REV

指出你将为特定操作提供一个修订版本(或修订版本的范围),你可以提供修订版本号,修订版本关键字或日期(在华括号中)作为修订版本开关的参数。如果你希望提供一个修订版本范围,你可以提供用冒号隔开的两个修订版本,举个例子:


$svn log -r 1729

$svn log -r 1729:HEAD

$svn log -r 1729:1744

$svn log -r {2001-12-04}:{2002-02-17}

$svn log -r 1729:{2002-02-17}


见“修订版本关键字”一节查看更多信息。


--revprop

操作针对修订版本属性,而不是Subversion文件或目录的属性。这个选项需要你传递--revision-r)参数。


--show-updates(-u)

导致客户端显示本地拷贝哪些文件已经过期,这不会实际更新你的任何文件—只是显示了如果你运行svnupdate时更新的文件。


--stop-on-copy

导致Subversion子命令在传递历史时会在版本化资源拷贝时停止收集历史信息—也就是历史中资源从另一个位置拷贝过来时。


--strict

导致Subversion使用严格的语法,就是明确使用特定而不是含糊的子命令(也就是,svnpropget)。


--targetsFILENAME

告诉Subversion从你提供的文件中得到希望操作的文件列表,而不是在命令行列出所有的文件。


--usernameNAME

表示你要在命令行提供认证的用户名—否则如果需要,Subversion会提示你这一点。


--verbose(-v)

请求客户端在运行子命令打印尽量多的信息,会导致Subversion打印额外的字段,每个文件的细节信息或者是关于动作的附加信息。


--version

打印客户端版本信息,这个信息不仅仅包括客户端的版本号,也有所有客户端可以用来访问Subversion版本库的版本库访问模块列表。


--xml

使用XML格式打印输出。


原创粉丝点击