SVN的子命令SVN diff功能介绍
2010-05-24 14:16 佚名 字号:T | T
本文向大家介绍一下SVN的子命令SVN diff,它的主要用法师比较两条路径的区别,在这里和大家分享一下,希望大家共同学习。
AD:WOT2014:用户标签系统与用户数据化运营培训专场
本节和大家讨论一下版本控制工具SVN的子命令SVN diff使用情况,包括子命令SVN diff概念的基本介绍,以及关于子命令SVN diff的一个实例介绍,下面我们就为大家一一讲解。
名称
svn diff — 比较两条路径的区别。
概要
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是工作拷贝;如果是URL,则必须指定N,而M缺省是HEAD。“-c M”选项与“-r N:M”等价,其中N = M-1。使用“-c -M”则相反:“-r M:N”的意思是N = M-1。
显示在OLDREV的OLD-TGT和NEWREV的NEW- TGT之间的区别。如果提供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=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或“@”符号来指定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比较两个内容相同,但祖先历史不同的对象会看到所有的内容被删除又再次添加)时就会考虑路径的祖先。这是子命令SVN diff的描述。
选项
--revision (-r) ARG
--change (-c) ARG
--old ARG
--new ARG
--non-recursive (-N)
--diff-cmd CMD
--extensions (-x) "ARGS"
--no-diff-deleted
--notice-ancestry
--summarize
--force
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
例子:
我们来看一下SVN子命令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和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 diff讲解在这里就告一段落了,请关注本节的其他相关报道。
使用vimdiff作为svn diff的查看代码工具
1. vimdiff file1 file2打开两个文件的对比,会对不同的地方做高亮指示。
2. ]c跳到下一个不同行,[c 跳到上一个
3. 在一行不同处,do将另一个buffer的改动应用于当前buffer
dp 将当前buffer的该行内容应用于另一个buffer
4. 因为两个buffer横向对比,而屏幕宽度有限,所以每次要到两个buffer分别:set wrap来使其折行,
为了省事,写一个键盘影射来做这个事。
func Wrap()
:set wrap
endfunc
map
imap
http://www.cnblogs.com/zhouej/archive/2012/02/09/2343756.html
在linux下,直接使用svn diff命令查看代码的修改是很吃力的,于是在网上搜索到了一个比较好的解决方案,就是让vimdiff作为svn diff的查看代码工具,尤其对于习惯用vim的人来说真的是很方便。
当使用svn diff命令比较某个文件的修改前后时,例如执行以下命令:
$ svn diff -r4420 ngx_http_limit_req_module.c
那么实际会向默认的diff程序发送如下命令:
-u -L ngx_http_limit_req_module.c (revision 4420) -L ngx_http_limit_req_module.c (working copy) .svn/tmp/tempfile.tmp ngx_http_limit_req_module.c
svn官方FAQ中对于svn diff的解释(中文、英文):
当 使用一个外部的diff命令时,Subversion会生成一个非常复杂的命令行。第一个参数就是具体的--diff-cmd,然后就是具体的 --extensions (尽管使用空白的 --符号时会忽略扩展),或者如果没有指定--extensions或者--extensions为空的话,就加上‘-u’参数。第三和第四个参 数,Subversion会传递一个“-L”还有第一个文件的标签(例如,“"project_issues.html (revision 11209)”)。第五个和第六个就是另一个“-L”和第二个文件的标签。第七和第八个参数分别是第一个和第二个文件的名称(例 如,“.svn/text-base/project_issues.html.svn-base”和“.svn/tmp /project_issues.html.tmp”)。
了解了diff的内部调用命令,那么实现用vimdiff作为diff程序就比较简单了。
vimdiff在比较2个文件时,只要知道这2个文件的路径及文件名就可以了,也就是上述diff内部命令中的第7个和第8个2个参数;
同时也说明了由于diff内部命令的参数过多导致用--diff-cmd直接调用vimdiff是行不通的(命令如下)。
$ svn diff --diff-cmd vimdiff -r4420 ngx_http_limit_req_module.c
所以,我们需要自己另外写一个脚本,让这个脚本作为diff程序,获得diff的内部命令,然后只取其中的第7个和第8个参数,再传给vimdiff,这样就能解决参数多的问题了。
脚本(diffwrap.sh)如下:
shift 5
vimdiff
或者是 vim -d o "$@" 再或者是下面也是一样的
#!/bin/sh
# 配置你喜欢的diff程序路径
DIFF="vimdiff"
# SVN diff命令会传入两个文件的参数
LEFT=${6}
RIGHT=${7}
# 拼接成diff命令所需要的命令格式
$DIFF $LEFT $RIGHT
另外,svn还提供了在配置文件中修改diff默认程序的功能,这样就不用每次使用svn diff时再指定--diff-cmd了。
修改~/.subversion/config,找到如下配置行:
# diff-cmd = diff_program (diff, gdiff, etc.)
将上面那个脚本的路径添加进去就行,例如修改为
diff-cmd = /usr/local/bin/diffwrap.sh
以后,使用svn diff命令就会默认打开vimdiff比较2个文件了。
效果图: