SVN 第5章 svn SVN 第5章 svn

2021-06-10

①、svn add

A、描述

svn add PATH...

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

B、选项

  • --targets FILENAME

  • --non-recursive (-N)

  • --quiet (-q)

  • --config-dir DIR

  • --auto-props

  • --no-auto-props

  • --force

C、例子

添加一个文件到工作拷贝

svn add foo.c

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

svn add testdir

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

svn add --non-recursive otherdir

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

svn add * --force

②、svn blame

A、描述

svn blame TARGET...

显示特定文件和URL内嵌的作者和修订版本信息。每一行文本在开头都放了最后修改的作者(用户名)和修订版本号。

B、别名

praise、annotate、ann

C、选项

  • --revision (-r) REV

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

  • --verbose

D、例子

如果你希望在测试版本库看到blame标记的readme.txt源代码

svn blame http://svn.red-bean.com/repos/test/readme.txt

③、svn cat

A、描述

svn cat TARGET[@REV]...

输出特定文件或URL的内容。列出目录的内容可以使用svn list。

B、选项

  • --revision (-r) REV

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

C、例子

如果你希望不检出而察看版本库的readme.txt的内容

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
This is a README file.
You should read this.

如果你的工作拷贝已经过期(或者你有本地修改),并且希望察看工作拷贝的HEAD修订版本的一个文件,如果你给定一个路径,svn cat会自动取得HEAD的修订版本

$ cat foo.c
This file is in my local working copy 
and has changes that I've made.

$ svn cat foo.c
Latest revision fresh from the repository!

④、svn checkout

A、描述

svn checkout URL[@REV]... [PATH]

从版本库取出一个工作拷贝,如果省略*PATH*,URL的基名称会作为目标,如果给定多个URL,每一个都会检出到PATH的子目录,使用URL基名称的子目录名称。

B、别名

co

C、选项

  • --revision (-r) REV

  • --quiet (-q)

  • --non-recursive (-N)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

D、例子

取出一个工作拷贝到mine

$ svn checkout file:///tmp/repos/test mine
A  mine/a
A  mine/b
Checked out revision 2.
$ ls
mine

检出两个目录到两个单独的工作拷贝

$ svn checkout file:///tmp/repos/test  file:///tmp/repos/quiz
A  test/a
A  test/b
Checked out revision 2.
A  quiz/l
A  quiz/m
Checked out revision 2.
$ ls
quiz  test

检出两个目录到两个单独的工作拷贝,但是将两个目录都放到working-copies:

$ svn checkout file:///tmp/repos/test  file:///tmp/repos/quiz working-copies
A  working-copies/test/a
A  working-copies/test/b
Checked out revision 2.
A  working-copies/quiz/l
A  working-copies/quiz/m
Checked out revision 2.
$ ls
working-copies

如果你打断一个检出(或其它打断检出的事情,如连接失败。),你可以使用同样的命令重新开始或者是更新不完整的工作拷贝:

$ svn checkout file:///tmp/repos/test test
A  test/a
A  test/b
^C
svn: The operation was interrupted
svn: caught SIGINT

$ svn checkout file:///tmp/repos/test test
A  test/c
A  test/d
^C
svn: The operation was interrupted
svn: caught SIGINT

$ cd test
$ svn update
A  test/e
A  test/f
Updated to revision 3.

⑤、svn cleanup

A、描述

svn cleanup [PATH...]

递归清理工作拷贝,删除未完成的操作锁定。如果你得到一个“工作拷贝已锁定”的错误,运行这个命令可以删除无效的锁定,让你的工作拷贝再次回到可用的状态。

B、选项

  • --diff3-cmd CMD

  • --config-dir DIR

C、例子

svn cleanup没有输出,没有太多的例子,如果你没有传递路径,会使用“.”。

$ svn cleanup

$ svn cleanup /path/to/working-copy

⑥、svn commit

A、描述

svn commit [PATH...]

将修改从工作拷贝发送到版本库。如果你没有使用--file或--message提供一个提交日志信息,svn会启动你的编辑器来编写一个提交信息。

B、别名

ci(“check in”的缩写;不是“checkout”的缩写“co”。)

C、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --non-recursive (-N)

  • --targets FILENAME

  • --force-log

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --encoding ENC

  • --config-dir DI

D、例子

使用命令行提交一个包含日志信息的文件修改,当前目录(“.”)是没有说明的目标路径:

$ svn commit -m "added howto section."
Sending        a
Transmitting file data .
Committed revision 3.

提交一个修改到foo.c(在命令行明确指明),并且msg文件中保存了提交信息:

$ svn commit -F msg foo.c
Sending        foo.c
Transmitting file data .
Committed revision 5.

如果你希望使用在--file选项中使用在版本控制之下的文件作为参数,你需要使用--force-log选项:

$ svn commit --file file_under_vc.txt foo.c
svn: The log message file is under version control
svn: Log message file is a versioned file; use '--force-log' to override

$ svn commit --force-log --file file_under_vc.txt foo.c
Sending        foo.c
Transmitting file data .
Committed revision 6.

提交一个已经预定要删除的文件:

$ svn commit -m "removed file 'c'."
Deleting       c

Committed revision 7.

⑦、svn copy

A、描述

svn copy SRC DST

拷贝工作拷贝的一个文件或目录到版本库。*SRC和DST*既可以是工作拷贝(WC)路径也可以是URL:

  • WC -> WC:拷贝并且预定一个添加的项目(包含历史)。

  • WC -> URL:将WC或URL的拷贝立即提交。

  • URL -> WC:检出URL到WC,并且加入到添加计划。

  • URL -> URL:完全的服务器端拷贝,通常用在分支和标签。

B、别名

cp

C、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --revision (-r) REV

  • --quiet (-q)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --force-log

  • --editor-cmd EDITOR

  • --encoding ENC

  • --config-dir DIR

D、例子

拷贝工作拷贝的一个项目(只是预定要拷贝―在提交之前不会影响版本库):

$ svn copy foo.txt bar.txt
A         bar.txt
$ svn status
A  +   bar.txt

拷贝你的工作拷贝的一个项目到版本库的URL(直接的提交,所以需要提供一个提交信息):

$ svn copy near.txt file:///tmp/repos/test/far-away.txt -m "Remote copy."

Committed revision 8.

拷贝版本库的一个项目到你的工作拷贝(只是预定要拷贝——在提交之前不会影响版本库):

这是恢复死掉文件的推荐方式!

$ svn copy file:///tmp/repos/test/far-away near-here
A         near-here

最后,是在URL之间拷贝:

$ svn copy file:///tmp/repos/test/far-away file:///tmp/repos/test/over-there -m "remote copy."

Committed revision 9.

这是在版本库里作“标签”最简单的方法―svn copy那个修订版本(通常是HEAD)到你的tags目录。

$ svn copy file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "tag tree"

Committed revision 12.

不要担心忘记作标签―你可以在以后任何时候给一个旧版本作标签:

$ svn copy -r 11 file:///tmp/repos/test/trunk file:///tmp/repos/test/tags/0.6.32-prerelease -m "Forgot to tag at rev 11"

Committed revision 13.

⑧、svn delete

A、描述

svn delete PATH...

svn delete URL...

*PATH*指定的项目会在下次提交删除,文件(和没有提交的目录)会立即从版本库删除,这个命令不会删除任何未版本化或已经修改的项目;使用--force选项可以覆盖这种行为方式。

URL指定的项目会在直接提交中从版本库删除,多个URL的提交是原子操作。

B、别名

del, remove, rm

C、选项

  • --force

  • --force-log

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --targets FILENAME

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --editor-cmd EDITOR

  • --encoding ENC

  • --config-dir DIR

D、例子

使用svn从工作拷贝删除文件只是预定要删除,当你提交,文件才会从版本库删除。

$ svn delete myfile
D         myfile

$ svn commit -m "Deleted file 'myfile'."
Deleting       myfile
Transmitting file data .
Committed revision 14.

然而直接删除一个URL,你需要提供一个日志信息:

$ svn delete -m "Deleting file 'yourfile'" file:///tmp/repos/test/yourfile

Committed revision 15.

如下是强制删除本地已修改文件的例子:

$ svn delete over-there 
svn: Attempting restricted operation for modified resource
svn: Use --force to override this restriction
svn: 'over-there' has local modifications

$ svn delete --force over-there 
D         over-there

⑨、svn diff

A、描述

diff [-r N[:M]] [TARGET[@REV]...]

diff [-r N[:M]] --old OLD-TGT[@OLDREV] [--new NEW-TGT[@NEWREV]] [PATH...]

diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]

显示两条路径的区别,svn diff有三种使用方式:

**svn diff [-r N[:M]] [--old OLD-TGT] [--new NEW-TGT] [PATH...]*会显示OLD-TGT和NEW-TGT的区别。如果给定路径PATH,它会被看作OLD-TGT和NEW-TGT的相对路径,输出也会限制在这些路径的区别上。OLD-TGT和NEW-TGT可以是工作拷贝路径或者是URL[@REV]。OLD-TGT缺省是当前工作目录,而NEW-TGT缺省是OLD-TGT。N缺省是BASE,M缺省时当前目录的版本,但如果NEW-TGT是一个URL,则默认是HEAD。svn diff -r N设置OLD-TGT的修订版本为N,svn diff -r N:M设置NEW-TGT的修订版本是M*。

svn diff [-r N[:M]] URL1[@N] URL2[@M]是svn diff [-r N[:M]] --old=URL1 --new=URL2的缩写。

*TARGET*是一个URL,然后可以使用前面提到的--revision或“@”符号来指定N和M。

如果*TARGET*是工作拷贝路径,则--revision选项的含义是:

--revision N:M

服务器比较 TARGET@N和TARGET@M。

--revision N

客户端比较*TARGET@N*和工作拷贝。

(无--revision)

客户端比较base和 TARGET的TARGET。

如果使用其他语法,服务器会比较*URL1和URL2各自的N和M。如果省掉N或M*,会假定为HEAD。

缺省情况下,svn diff忽略文件的祖先,只会比较两个文件的内容。如果你使用--notice-ancestry,比较修订版本(也就是,当你运行svn diff比较两个内容相同,但祖先历史不同的对象会看到所有的内容被删除又再次添加)时就会考虑路径的祖先。

B、别名

di

C、选项

  • --revision (-r) REV

  • --old OLD-TARGET

  • --new NEW-TARGET

  • --extensions (-x) "ARGS"

  • --non-recursive (-N)

  • --diff-cmd CMD

  • --notice-ancestry

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --no-diff-deleted

  • --config-dir DI

D、例子

比较BASE和你的工作拷贝(svn diff最经常的用法):

$ svn diff COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS    (revision 4404)
+++ COMMITTERS    (working copy)

察看你的工作拷贝对旧的修订版本的修改:

$ svn diff -r 3900 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS    (revision 3900)
+++ COMMITTERS    (working copy)

使用“@”语法与修订版本3000和35000比较:

$ svn diff http://svn.collab.net/repos/svn/trunk/COMMITTERS@3000 \
http://svn.collab.net/repos/svn/trunk/COMMITTERS@3500
Index: COMMITTERS
===================================================================
--- COMMITTERS    (revision 3000)
+++ COMMITTERS    (revision 3500)

使用范围符号来比较修订版本3000和3500(在这种情况下只能传递一个URL):

$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk/COMMITTERS
Index: COMMITTERS
===================================================================
--- COMMITTERS    (revision 3000)
+++ COMMITTERS    (revision 3500)

使用范围符号比较修订版本3000和3500trunk中的所有文件:

$ svn diff -r 3000:3500 http://svn.collab.net/repos/svn/trunk

使用范围符号比较修订版本3000和3500trunk中的三个文件:

$ svn diff -r 3000:3500 --old http://svn.collab.net/repos/svn/trunk COMMITTERS README HACKING

如果你有工作拷贝,你不必输入这么长的URL:

$ svn diff -r 3000:3500 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS    (revision 3000)
+++ COMMITTERS    (revision 3500)

使用--diff-cmdCMD-x来指定外部区别程序

$ svn diff --diff-cmd /usr/bin/diff -x "-i -b" COMMITTERS 
Index: COMMITTERS
===================================================================
0a1,2
> This is a test
>

⑩、svn export

A、描述

svn export [-r REV] URL[@PEGREV] [PATH]

svn export PATH1[@PEGREV] PATH2

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

从工作拷贝导出干净目录树的第二种形式是指定*PATH1到PATH2*,所有的本地修改将会保留,但是不再版本控制下的文件不会拷贝。

B、选项

  • --revision (-r) REV

  • --quiet (-q)

  • --force

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

  • --native-eol EO

C、例子

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

$ svn export a-wc my-export
Export complete.

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

$ svn export file:///tmp/repos my-export
A  my-export/test
A  my-export/quiz

Exported revision 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

Exported revision 15.

⑪、svn help

A、描述

svn help [SUBCOMMAND...]

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

B、别名

h

C、选项

  • --version

  • --quiet (-q)

⑫、svn import

A、描述

svn import [PATH] URL

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

B、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --non-recursive (-N)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --force-log

  • --editor-cmd EDITOR

  • --encoding ENC

  • --config-dir DIR

  • --auto-props

  • --no-auto-props

C、例子

这会导入本地目录myproj到版本库的 根目录:

$ svn import -m "New import" myproj http://svn.red-bean.com/repos/test
Adding         myproj/sample.txt

Transmitting file data .........
Committed revision 16.

这将本地目录myproj导入到版本库的trunk/misc,trunk/misc在导入之前不需要存在―svn import会递归的为你创建目录:

$ svn import -m "New import" myproj \
    http://svn.red-bean.com/repos/test/trunk/misc/myproj
Adding         myproj/sample.txt

Transmitting file data .........
Committed revision 19.

在导入数据之后,你会发现原先的目录树并没有纳入版本控制,为了开始工作,你还是要运行svn checkout得到一个干净的目录树工作拷贝。

⑬、svn info

A、描述

svn info [PATH...]

打印PATH的信息

B、选项

  • --targets FILENAME

  • --recursive (-R)

  • --config-dir DIR

C、例子

svn info会展示所有项目的所有有用信息,它会显示文件的信息:

$ svn info foo.c
Path: foo.c
Name: foo.c
URL: http://svn.red-bean.com/repos/test/foo.c
Revision: 4417
Node Kind: file
Schedule: normal
Last Changed Author: sally
Last Changed Rev: 20
Last Changed Date: 2003-01-13 16:43:13 -0600 (Mon, 13 Jan 2003)
Text Last Updated: 2003-01-16 21:18:16 -0600 (Thu, 16 Jan 2003)
Properties Last Updated: 2003-01-13 21:50:19 -0600 (Mon, 13 Jan 2003)
Checksum: /3L38YwzhT93BWvgpdF6Zw==

它也会展示目录的信息:

$ svn info vendors
Path: trunk
URL: http://svn.red-bean.com/repos/test/vendors
Revision: 19
Node Kind: directory
Schedule: normal
Last Changed Author: harry
Last Changed Rev: 19
Last Changed Date: 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003)

⑭、svn list

A、描述

svn list [TARGET[@REV]...]

列出每一个*TARGET文件和TARGET目录的内容,如果TARGET*是工作拷贝路径,会使用对应的版本库URL。缺省的*TARGET*是“.”,意味着当前工作拷贝的版本库URL。

B、别名

ls

C、选项

  • --revision (-r) REV

  • --verbose (-v)

  • --recursive (-R)

  • --incremental

  • --xml

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DI

D、例子

如果你希望在没有下载工作拷贝时察看版本库有哪些文件,svn list会非常有用:

$ svn list http://svn.red-bean.com/repos/test/support
README.txt
INSTALL
examples/

你也可以传递--verbose选项来得到额外信息,非常类似UNIX的ls -l命令:

$ svn list --verbose file:///tmp/repos
     16 sally         28361 Jan 16 23:18 README.txt
     27 sally             0 Jan 18 15:27 INSTALL
     24 harry               Jan 18 11:27 examples/

⑮、svn log

A、描述

svn log [PATH]

svn log URL [PATH...]

显示提交日志信息:

缺省目标是你的当前目录的路径,如果没有提供参数,svn log会显示当前目录下的所有文件和目录的日志信息,你可以通过指定路径来精炼结果,一个或多个修订版本,或者是任何两个的组合。对于本地路径的缺省修订版本范围BASE:1。

如果你只是指定一个URL,就会打印这个URL上所有的日志信息,如果添加部分路径,只有这条路径下的URL信息会被打印,URL缺省的修订版本范围是HEAD:1。

svn log使用--verbose选项也会打印所有影响路径的日志信息,使用--quiet选项不会打印日志信息正文本身(这与--verbose协调一致)。

每个日志信息只会打印一次,即使是那些明确请求不止一次的路径,日志会跟随在拷贝过程中,使用--stop-on-copy可以关闭这个特性,可以用来监测分支点。

B、选项

  • --revision (-r) REV

  • --quiet (-q)

  • --verbose (-v)

  • --targets FILENAME

  • --stop-on-copy

  • --incremental

  • --xml

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

C、例子

你可以在顶级目录运行svn log看到工作拷贝中所有修改的路径的日志信息:

$ svn log
------------------------------------------------------------------------
r20 | harry | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line
Tweak.
------------------------------------------------------------------------
r17 | sally | 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003) | 2 lines

检验一个特定文件所有的日志信息:

$ svn log foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines

如果你手边没有工作拷贝,你可以查看一个URL的日志:

$ svn log http://svn.red-bean.com/repos/test/foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines

如果你希望查看某个URL下面不同的多个路径,你可以使用URL [PATH...]语法。

$ svn log http://svn.red-bean.com/repos/test/ foo.c bar.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Added defines.
------------------------------------------------------------------------
r31 | harry | 2003-01-10 12:25:08 -0600 (Fri, 10 Jan 2003) | 1 line
Added new file bar.c
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines

当你想连接多个队日志命令的调用结果,你会希望使用--incremental选项。svn log通常会在日志信息的开头和每一小段间打印一行虚线,如果你对一段修订版本运行svn log,你会得到下面的结果:

$ svn log -r 14:15
------------------------------------------------------------------------
r14 | ... 
------------------------------------------------------------------------
r15 | ... 
------------------------------------------------------------------------

然而,如果你希望收集两个不连续的日志信息到一个文件,你会这样做:

$ svn log -r 14 > mylog
$ svn log -r 19 >> mylog
$ svn log -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | ... 
------------------------------------------------------------------------
------------------------------------------------------------------------
r19 | ... 
------------------------------------------------------------------------
------------------------------------------------------------------------
r27 | ... 
------------------------------------------------------------------------

你可以使用incremental选项来避免两行虚线带来的混乱:

$ svn log --incremental -r 14 > mylog
$ svn log --incremental -r 19 >> mylog
$ svn log --incremental -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | ... 
------------------------------------------------------------------------
r19 | ... 
------------------------------------------------------------------------
r27 | ...

--incremental选项为--xml提供了一个相似的输出控制。

提示

如果你在特定路径和修订版本运行svn log,输出结果为空

$ svn log -r 20 http://svn.red-bean.com/untouched.txt
------------------------------------------------------------------------

这只意味着这条路径在那个修订版本没有修改,如果从版本库的顶级目录运行这个命令,或者是你知道那个修订版本修改了那个文件,你可以明确的指定它:

$ svn log -r 20 touched.txt 
------------------------------------------------------------------------
r20 | sally | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line
Made a change.
------------------------------------------------------------------------

⑯、svn merge

A、描述

svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
svn merge -r N:M SOURCE[@REV] [WCPATH]

第一种形式,源URL用修订版本号*N和M*指定,这是要比较的两组源文件,如果省略修订版本号,缺省是HEAD。

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

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

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

B、选项

  • --revision (-r) REV

  • --non-recursive (-N)

  • --quiet (-q)

  • --force

  • --dry-run

  • --diff3-cmd CMD

  • --ignore-ancestry

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --config-dir DIR

C、例子

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

$ svn merge -r 250:HEAD http://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

17、svn mkdir

A、描述

svn mkdir PATH...
svn mkdir URL...

创建一个目录,名字是提供的*PATH或者URL的最后一部分,工作拷贝PATH*指定的目录会预定要添加,而通过URL指定的目录会作为一次立即提交在版本库建立。多个目录URL的提交是原子操作,在两种情况下,中介目录必须已经存在。

B、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --quiet (-q)

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --editor-cmd EDITOR

  • --encoding ENC

  • --force-log

  • --config-dir DIR

C、例子

在工作拷贝创建一个目录:

$ svn mkdir newdir
A         newdir

在版本库创建一个目录(立即提交,所以需要日志信息):

$ svn mkdir -m "Making a new dir." http://svn.red-bean.com/repos/newdir
Committed revision 26.

18、svn move

A、描述

svn move SRC DST

这个命令移动文件或目录到你的工作拷贝或者是版本库。这个命令同svn copy加一个svn delete等同。

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

WC -> WC

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

URL -> URL

完全服务器端的重命名。

B、别名

mv, rename, ren

C、选项

  • --message (-m) TEXT

  • --file (-F) FILE

  • --revision (-r) REV

  • --quiet (-q)

  • --force

  • --username USER

  • --password PASS

  • --no-auth-cache

  • --non-interactive

  • --editor-cmd EDITOR

  • --encoding ENC

  • --force-log

  • --config-dir DIR

D、例子

移动工作拷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
Committed revision 27.

19、svn propdel

A、描述

svn move SRC DST

删除一个项目的一个属性。这会删除文件、目录或修订版本的属性。第一种形式是在工作拷贝删除版本化属性,第二种是在一个版本库修订版本中删除未版本化的属性。

阅读 2470