本手册旨在描述 Subversion 1.6.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
默认值为 BASE
,而 M
默认值为工作副本;如果 TARGET
是 URL
,则必须指定 N
,而 M
默认值为 HEAD
。选项 -c M
等效于 -r N:M
,其中 N = M-1
。使用 -c -M
进行相反的操作:-r M:N
,其中 N = M-1
。
显示 OLD-TGT
在 OLDREV
中看到的差异,以及 NEW-TGT
在 NEWREV
中看到的差异。如果给出 PATH
,则它们相对于 OLD-TGT
和 NEW-TGT
,并将输出限制为这些路径的差异。 OLD-TGT
和 NEW-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 URL
是 svn 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,则可以使用 --revision
(-r
) 选项或使用前面描述的 “@” 符号来指定版本 N
和 M
。
如果 TARGET
是工作副本路径,则默认行为(当未提供 --revision
(-r
) 选项时)是显示 TARGET
的基本版本和工作副本之间的差异。但是,如果在这种情况下指定了 --revision
(-r
) 选项,则意味着
--revision N:M
服务器比较 TARGET@N
和 TARGET@M
。
--revision N
客户端将 TARGET@N
与工作副本进行比较。
如果使用备用语法,服务器将分别在版本 N
和 M
处比较 URL1
和 URL2
。如果省略 N
或 M
,则假定其值为 HEAD
。
默认情况下,svn diff 忽略文件的祖先,仅比较正在比较的两个文件的内容。如果您使用 --notice-ancestry
,则在比较版本时会考虑相关路径的祖先(即,如果您对两个内容相同但祖先不同的文件运行 svn diff,您将看到整个文件的内容已被删除并重新添加)。
--change (-c) ARG --changelist ARG --depth ARG --diff-cmd CMD --extensions (-x) ARG --force --new ARG --no-diff-deleted --notice-ancestry --old ARG --revision (-r) ARG --summarize --xml
比较 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>