本文档旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您正在运行其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的文档。

名称

svn diff (di) — 显示两个修订版或路径之间的差异。

概要

diff [-c M | -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 来显示工作副本中的本地修改。

  • 显示对 TARGET 的更改,这些更改在两个修订版之间在 REV 中可见。 TARGET 可以是所有工作副本路径或所有 URL。如果 TARGET 是工作副本路径,则 N 默认值为 BASEM 为工作副本;如果 TARGETURL,则必须指定 NM 默认值为 HEAD-c M 选项等效于 -r N:M,其中 N = M-1。使用 -c -M 执行相反的操作:-r M:N,其中 N = M-1

  • 显示 OLD-TGTOLDREV 中可见时的差异,以及 NEW-TGTNEWREV 中可见时的差异。如果给出 PATH,则它们相对于 OLD-TGTNEW-TGT,并将输出限制为这些路径的差异。 OLD-TGTNEW-TGT 可以是工作副本路径或 URL[@REV]。如果未指定 NEW-TGT,则默认为 OLD-TGT-r N 使 OLDREV 默认值为 N-r N:M 使 OLDREV 默认值为 NNEWREV 默认值为 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) 选项时)是显示 TARGET 的基线和工作副本之间的差异。但是,如果在此场景中指定了 --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) 将参数直接传递给外部 diff 程序

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

最后,您可以使用 --xml 选项以及 --summarize 选项来查看描述修订之间发生的更改的 XML,但不包括 diff 本身的内容

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