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 <F10>       :call Wrap() <CR><C-W><C-W> :call Wrap() <CR> <C-W><C-W>
imap <F10>      <Esc>:call Wrap() <C-W><C-W> :call Wrap() <C-W><C-W>

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个文件了。

效果图:

转载于:https://my.oschina.net/alphajay/blog/286903

svn diff和vimdiff的使用相关推荐

  1. svn diff 使用 vimdiff 作为比较差异工具

    转载自<http://www.coreymaynard.com/blog/improving-svn-diff-with-the-power-of-vim/> One of vim's n ...

  2. 如何使用 vimdiff 来 git diff /svn diff

    #git 如何实现vimdiffgit config --global diff.tool vimdiff git config --global difftool.prompt false git ...

  3. 将svn diff改成用vimdiff命令进行可视化差异显示

    本文对原文稍作修改. svn的其他命令可在我的 各种平台常用命令和快捷键_莫能长老的博客-CSDN博客 SVN介绍.安装及常用命令总结_莫能长老的博客-CSDN博客 这两篇文章中找到. 基本原理是通过 ...

  4. 使用svn diff的-r参数的来比较任意两个版本的差异

    来源:http://blog.csdn.net/feliciafay/article/details/8962515 1 svn diff的用法 1.1 对比当前本地的工作拷贝文件(working c ...

  5. 提交代码前没有用svn st命令(只用了svn diff), 差点踩坑!

    我还是建议大家在Windows上通过对比工具来提交程序, Windows上一切可见, 一目了然啊. 文件状态用颜色区分得一清二楚. 当然, 有的时候, 我们也可以在linux下提交程序. 最近我直接在 ...

  6. 3.14-19 wc、iconv、dos2unix、diff、vimdiff、rev

    3.14 wc:统计文件的行数.单词数或字节数 wc命令用于统计文件的行数.单词数或字节数. -c 统计字节数 -w 统计单词数 -l 统计行数     -L 打印最长行的长度 -m 统计字符数 查看 ...

  7. L24.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- diff和vimdiff命令

    3.17 diff:比较两个文件的不同 3.17.1 命令详解 ​ [命令星级] ★★★★☆ ​ [功能说明] ​ diff命令可以逐行比较纯文本文件的内容,并输出文件的差异. ​ [语法格式] di ...

  8. SVN使用log,list,cat,diff命令查看特定文件版本信息

    来源:http://blog.csdn.net/wn_hello/article/details/47295259 svn log          展示给你主要信息:每个版本附加在版本上的作者与日期 ...

  9. 如何使用 vimdiff 来 git diff

    git config --global diff.tool vimdiff git config --global difftool.prompt false git config --global ...

  10. LINUX下SVN命令大全

    1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:s ...

最新文章

  1. JavaScript中判断为整数的多种方式
  2. 人人都能做游戏!3D次世代CE云端引擎发布
  3. java 的toString()函数
  4. linux 编译git 客户端源码然后安装
  5. java的几种对象(PO,VO,DAO,BO,POJO)解释
  6. 转换流/序列化/反序列化
  7. 软件项目管理 1.3.敏捷项目管理概念
  8. 微信能转发邮件吗?邮件怎么用微信发送?微信邮件怎么发?
  9. bash pitfall
  10. 艺术字生成工具 | Mixlab创意编程
  11. SAP 汇率处理总结
  12. mac怎么切换输入法(在外接键盘下)
  13. linux系统安全与日志分析
  14. 微信小程序低功耗蓝牙(BLE)开发总结
  15. web开发常见问题和解决方法
  16. 【OGG】extract不抓取日志--running状态--不能stop和kill--自动abended
  17. 视图实现圆角效果的三种方法及比较
  18. 个人开公司的流程是怎么样的?
  19. 【Linux】进程间通信
  20. 我觉得好听的曲子-持续更新中

热门文章

  1. POJ-3621 Sightseeing Cows 01分数(参数搜索)规划问题-最优比率环
  2. JDK笔记-IO流读写
  3. mysql用utf-8_切记:永远不要在MySQL中使用UTF-8
  4. controller层没反应_打过蜡的石材再做结晶没效果怎么办?
  5. pandas读取csv文件数据并对指定字段分类使用matplotlib在一张图里画四张折线图子图
  6. eclipse python java_如何使用Eclipse使用Python导入Java类?
  7. net core获取网站运行目录
  8. Git图形化操作:Revert(恢复)本地的修改到上一个版本
  9. Golang sha256 加密,PHP hash_hmac(‘sha256‘, $string, $key)加密,Js CryptoJS.HmacSHA256(string, key) 加密
  10. 几万字的博文,你自己会看吗