This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.

名称

svn diff (di) — 显示两个版本号或路径之间的差异.

大纲

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

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

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

描述

显示两个路径之间的差异, 用户可以按照如下方式使用 svn diff:

  • 直接执行 svn diff 来查看工作副本的 本地修改.

  • 显示限定版本号为 REV 时, TARGET 在两个版本号之间的变化. TARGET 可以全是工作副本路径或 URL. 如果 TARGET 是工作副本路径, 则 N 默认是 BASE, M 默认是工作副本. 如果 TARGETURL, 则用户必须指定 N, 而 M 默认 是 HEAD. 选项 -c M 等价于 -r N:M, 其中 N = M-1; 而 -c -M 正好相反, 它等价于 -r M:N, 其中 N = M-1.

  • 显示限定版本号为 OLDREVOLD-TGT 和限定版本号 NEWREVNEW-TGT 之间的差异. 如果指定了相对于 OLD-TGTNEW-TGTPATH, 那么输出的就是这些路径的差异. OLD-TGTNEW-TGT 可以是工作副本路径或 URL[@REV]. 如果没有指定 NEW-TGT, 那么它默认就是 OLD-TGT. -r N 使得 OLDREV 默认是 N; -r N:M 使得 OLDREV 默认是 N, NEWREV 默认是 M.

svn diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]svn diff --old=OLD-URL[@OLDREV] --new=NEW-URL[@NEWREV] 的缩写形式.

svn diff -r N:M URLsvn diff -r N:M --old=URL --new=URL 的缩写形式.

svn diff [-r N[:M]] URL1[@N] URL2[@M]svn diff [-r N[:M]] --old=URL1 --new=URL2 的缩写形式.

如果 TARGET 是一个 URL, 那么 NM 可以 用选项 --revision (-r) 指定, 或者用以前介绍过的 @ 记号.

如果 TARGET 是一个工作副本路径, 那么 命令的默认行为 (没有指定选项 --revision (-r)) 就是显示 TARGETBASE 与工作副本之间的差异. 如果指定了选项 --revision (-r), 这意味着:

--revision N:M

服务器将比较 TARGET@NTARGET@M.

--revision N

客户端将比较 TARGET@N 和工作 副本.

如果使用了替代语法, 服务器将比较分别处于版本号 NM 下 的 URL1URL2. 如果没有指定 NM, 将默认使用 HEAD.

默认情况下, svn diff 会忽略文件的祖先, 而只 比较文件的内容. 如果使用了选项 --notice-ancestry, 那么在比较版本号时就是考虑相关路径的祖先 (也就是说,如果你用 svn diff 比较了两个内容相同, 但祖先不同的文件, 你 将会看到文件的整个内容曾经被删除, 然后又被添加).

选项

示例

比较 BASE 与工作副本 (svn diff 最常见的用途之一):

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

查看 COMMITTERS 在版本号 9115 发生了哪些 变化:

$ svn diff -c 9115 COMMITTERS 
Index: COMMITTERS
===================================================================
--- COMMITTERS	(revision 3900)
+++ COMMITTERS	(working copy)
…

比较工作副本和更老的版本号:

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

使用 @ 语法比较版本号 3000 和 3500:

$ 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)
…

使用范围记号比较 trunk 内的所有文件在 版本号 3000 到 3500 之间的变化:

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

使用范围记号比较 trunk 内的三个文件在版本 号 3000 到 3500 之间的变化:

$ 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-cmd CMD --extensions (-x) 向外部差异比较 工具传递参数:

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

最后, 可以同时使用选项 --xml--summarize 查看修改的 XML 描述, 修改的具体内容不 会显示出来:

$ svn diff --summarize --xml http://svn.red-bean.com/repos/test@r2 \
           http://svn.red-bean.com/repos/test
<?xml version="1.0"?>
<diff>
<paths>
<path
   props="none"
   kind="file"
   item="modified">http://svn.red-bean.com/repos/test/sandwich.txt</path>
<path
   props="none"
   kind="file"
   item="deleted">http://svn.red-bean.com/repos/test/burrito.txt</path>
<path
   props="none"
   kind="dir"
   item="added">http://svn.red-bean.com/repos/test/snacks</path>
</paths>
</diff>