SVN diff命令在实际中经常使用,在此记录使用点滴。

#对比工作文件与缓存在.svn的“原始”拷贝:
svn diff
#显示工作文件和服务器版本2的不同:
svn diff -r 2
#显示分支br1的版本2和版本3的不同:
svn diff /home/wwl/svn_test/branches/br1/ -r 2:3
 
#显示10.java文件在2版本和6版本的区别
svn diff -r 2:6 10.java
#对比分支br1和trunk区别(2个url)
svn diff file:///home/wwl/svn_repos/branches/br1 file:///home/wwl/svn_repos/trunk 
 
#直接使用svn diff 显示的不是很清晰,如果本机装了其他的图形diff工具(例如meld)命令行调用:
svn diff --diff-cmd meld ...
#svn在1.7版本支持了git方式显示diff
svn diff --git ...
 
diff输出详解:
 如图所示:
Index:wwl.test 表示对比的是wwl.test文件
=========我是分割线======================

---     wwl.test (revision 15)    ---表示对比old版本     
+++  wwl.test (revision 16)        +++表示对比new版本

@@ -7,7 +7,7 @@        -:表示old版本;+:表示new版本;7,7:表示从第七行开始的后七行(即7-13行)old和new的对比;如果行数比较多系统会自动分行;只会显示增删改行和相近行数,其他不会显示。

-:表示old版本有new没有

+:表示new版本有old没有

没有标识的表示old和new版本此行一致

下图为删除5,6两行后的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命令不支持这些参数的话,你可能需要创建一个简单的封装脚本来忽略这些参数,然后将最后的你需要的文件的路径参数传递给diff命令。

警告:Subversion并不希望外部的diff工具会改变它接收到的文件,否则可能会破坏当前工作拷贝。

http://subversion.apache.org/faq.zh.html#diff-cmd

因此比较2个文件时,只要知道这2个文件的路径及文件名就可以了,也就是上述diff内部命令中的第7个和第8个2个参数。


#如果不想命令行每次都加上--diff-cmd参数,可以修改subversion目录下面的conf文件定义默认的diff-cmd。
#推荐使用meld工具
meld——————
#meld默认在Ubuntu官方源中
#安装:
sudo apt-get install meld
#在目录 ~/.subversion中新建脚本文件Mydiff_meld.sh,windows下面写.bat文件。
touch Mydiff_meld.sh
#其中脚本名称和路径可自行选择
vi Mydiff_meld.sh
1 #!/bin/sh
2 #Configure your diff program here
3 #DIFF="usr/bin/meld"
4 DIFF="meld"
5 OLD=${6}
6 NEW=${7}
7 $DIFF $OLD $NEW
#增加Mydiff_meld.sh脚本的执行权限:
chmod a+x Mydiff_meld.sh
#在~/.subversion修改config文件,如果是windows7系统C:\Users\${username}\AppData\Roaming\Subversion
#在# diff-cmd = diff_program (diff, gdiff, etc.) 下面增加:
diff-cmd=/home/wwl/.subversion/Mydiff_meld.sh
#如果脚本目录和名称不同自行使用绝对路径
 
#调试命令:
svn diff /home/wwl/svn_test/branches/br1/ -r 2:4
 #如果是修改的文件
 
#如果是新增加的文件:
#如果是删除的文件:
#文件比较将会是一个一个进行的,关掉第一个文件比较的 窗口,才会显示第二个文件的比较窗口。
 
 

公司目前使用kdiff3作为diff工具
#安装:
sudo apt-get install kdiff3
#在目录 ~/.subversion中新建脚本文件Mydiff_kdiff3.sh,windows下面写.bat文件。
touch Mydiff_kdiff3.sh
#其中脚本名称和路径可自行选择
vi Mydiff_kdiff3.sh
1 #!/bin/sh
2 #Configure your diff program here
3 #DIFF="usr/bin/kdiff3"
4 DIFF="kdiff3"
5 OLD=${6}
6 NEW=${7}
7 YOUR=${8}
8 $DIFF $OLD $NEW $YOUR
#增加Mydiff_kdiff3.sh脚本的执行权限:
chmod a+x Mydiff_kdiff3.sh
#在~/.subversion修改config文件,如果是windows7系统C:\Users\${username}\AppData\Roaming\Subversion
#在# diff-cmd = diff_program (diff, gdiff, etc.) 下面增加:
diff-cmd=/home/wwl/.subversion/Mydiff_kdiff3.sh
#在# diff3-cmd = diff3_program (diff3, gdiff3, etc.)下面增加:
diff3-cmd=/home/wwl/.subversion/Mydiff_kdiff3.sh
#如果脚本目录和名称不同自行使用绝对路径
 
#windows下面的脚本如下Mydiff_kdiff3.bat:
@ECHO OFF

REM Configure your favorite kdiff3/merge program here.
SET DIFF3="D:\Software\KDiff3\kdiff3.exe" REM 有效使用的只有OLD和NEW,YOURS只是凑数的
SET OLD=%6
SET NEW=%7
SET YOURS=%8 REM %DIFF3% %OLD% %NEW% %YOURS%
%DIFF3% %OLD% %NEW% %YOURS%
 

附录:
svn help diff:
diff (di): 显示两个版本或路径的差异。
用法: 1. diff [-c M | -r N[:M]] [TARGET[@REV]...]
      2. diff [-r N[:M]] --old=OLD-TGT[@OLDREV] [--new=NEW-TGT[@NEWREV]] \
               [PATH...]
       3. diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]
 
  1、显示版本 REV 中 TARGET 在两个不同的版本之间的差异。TARGET 要么全是
     工作副本路径,要么全是 URL。如果 TARGET 是工作副本路径,N 默认为
     BASE,M 默认为工作副本;如果 TARGET 是 URL,N 必须指定, M 默认为 HEAD。
    “-c M” 等价于 “-r M-1:M”,“-c -M” 等价于 “-r M:M-1”。
 
  2、显示新旧版本中对应目标的差异。PATH 是相对于新旧目标的相对路径,
     它限制只输出这些路径上的差异。新旧目标可以是工作副本路径或地址 URL[@REV]。
     新目标默认与旧目标相同,OLDREV 默认为 N,NEWREV 默认为 M。
 
  3、“svn diff --old=OLD-URL[@OLDREV] --new=NEW-URL[@NEWREV]” 的简写。
 
     使用不加参数的 “svn diff” 显示工作副本中的本地修改。
 
有效选项:
  -r [--revision] ARG : ARG (一些命令也接受ARG1:ARG2范围)
                             版本参数可以是如下之一:
                                NUMBER 版本号
                                '{' DATE '}' 在指定时间以后的版本
                                'HEAD' 版本库中的最新版本
                                'BASE' 工作副本的基线版本
                                'COMMITTED' 最后提交或基线之前
                                'PREV' COMMITTED的前一版本
  -c [--change] ARG : 在ARG版本(如同 -r ARG-1:ARG)作的修改
                             如果ARG为负数则等价于 -r ARG:ARG-1
  --old ARG : 使用 ARG 作为旧目标
  --new ARG : 使用 ARG 作为新目标
  -N [--non-recursive] : 过时;尝试 --depth=files 或 --depth=immediates
  --depth ARG : 限制操作深度是 ARG ('empty', 'files',
                             'immediates', 或 'infinity')
  --diff-cmd ARG : 使用 ARG 作为比较命令
  --internal-diff : 覆盖配置文件中指定的 diff-cmd
  -x [--extensions] ARG : 缺省: “-u”。当 Subversion 调用外部比较程序时,ARG 直接传给它。但是当
                             Subversion 使用缺省的内置比较实现,或者正
                             显示追溯时, ARG 可以是:
                                -u (--unified):
                                   输出三行统一上下文。
                                -b (--ignore-space-change):
                                   忽略空白数量的修改。
                                -w (--ignore-all-space):
                                   忽略所有的空白。
                                --ignore-eol-style:
                                   忽略行尾样式的改变。 -p (--show-c-function):
                                   在比较输出中显示 C 函数名称。
  --no-diff-deleted : 不要输出删除文件造成的差异
  --show-copies-as-adds : 请不要将复制或移动的文件与其源文件比较
  --notice-ancestry : 比较差异时提示原始信息
  --summarize : 显示结果的概要
  --changelist [--cl] ARG : 只能对修改列表 ARG 的成员操作
  --force : 强制操作运行
  --xml : 输出为 XML
  --git : 使用 git 的扩展差异格式
 
全局选项:
  --username ARG : 指定用户名称 ARG
  --password ARG : 指定密码 ARG
  --no-auth-cache : 不要缓存用户认证令牌
  --non-interactive : 不要交互提示
  --trust-server-cert : 不提示的接受未知的证书颁发机构发行的 SSL 服务器证书(只用于选项 “--non-interactive”)
  --config-dir ARG : 从目录 ARG 读取用户配置文件
  --config-option ARG : 以下属格式设置用户配置选项:
                                 FILE:SECTION:OPTION=[VALUE]
                             例如:
                                 servers:global:http-library=serf

SVN diff 笔记的更多相关文章

  1. Mac、Linux更换命令行svn diff为P4Merge、vimdiff

    2015-01-21 21:25:52 这里先把那个程序员大神的博客地址贴一下(PS:大神,我不是为了抄袭哦,真是怕自己忘记了),http://www.ccvita.com/445.html,里面还有 ...

  2. svn diff 详解

    UI版: 如果多人编辑同一段代码,常常容易出现冲突的情况: 如果出现冲突,我们如何解决他呢? 1 可以选择使用自己的文件mime file,也可以使用 他们的文件 their file 2 解决冲突, ...

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

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

  4. CentOS(Linux) - SVN使用笔记(一) - 安装SVN过程及开启和关闭svn服务指令

    1.安装: yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql yum remove subversion 删除旧版 ...

  5. CentOS(Linux) - SVN使用笔记(二) - 创建SVN仓库及下载仓库到本地

    1.安装: 参考文章 CentOS(Linux) - SVN使用笔记(一) -  安装SVN过程及开启和关闭svn服务指令 2.创建仓库 #创建项目目录 mkdir /usr/svn#进入目录cd / ...

  6. svn小技巧——重定向svn diff

    svn diff的默认输出模式比较冗长,如果遇到修改比较多的情况,有时会较难看清diff.svn本身提供了自定义diff输出的选项,可能的修改方法如下: 建立一个脚本文件(如svndiff.sh),调 ...

  7. [转]svn diff 替代工具

    svn diff 替代工具 http://blog.csdn.net/fudesign2008/article/details/8168811 一. 使用vimdiff替换svn diff: 对于多数 ...

  8. SVN mime-type 笔记

    背景: 1.最近使用执行svn diff的时候发现有些文本文件无法显示: 2.浏览器会通过判断获取文件的 MIME 类型, 调用不同的客户端程序或使用不同的方式来执行.如果文件的 MIME 缺失或者有 ...

  9. svn log笔记

    背景: svn,版本 1.7.8 以下所有命令直接和svn服务器进行交互并没有checkout代码到本地 1.查询分支从拉出来到现在的变更: svn log branche_url --stop-on ...

随机推荐

  1. elasticsearch ik中文分词器安装

    特殊说明:灰色文字用来辅助理解的. 安装IK中文分词器 我在百度上搜索了下,大多介绍的都是用maven打包下载下来的源码,这种方法也行,但是不够方便,为什么这么说? 首先需要安装maven吧?其次需要 ...

  2. oracle 锁系列

    http://www.cnblogs.com/lhrbest/p/6091277.html

  3. leetcode第一刷_Restore IP Addresses

    字符串的问题真是难.一般递归比較好写代码,一般地归还会超时,并且測试用例特别多.. 这道题刚拿到手时直接慌了,这情况也太多了.后来冷静下来想想,事实上还是比較单纯的. 一个ip地址,肯定是四个整数加三 ...

  4. 为 UITextField 增加键盘偏移的模板化写法

    .h代码 #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDelega ...

  5. Accepting PayPal in games(完整的Paypal在Unity的支付)

      Hello and welcome back to my blog! In this article I’m going to talk about the process of acceptin ...

  6. Google Ads原理

    Google AdSense广告会根据访问者的地理IP,显示不同的广告,因为adwords里面有相应的设置,有些广告商只想把广告显示给某一地理区域的客户.另一方面就是同一个网站,你在日本和美国会看到日 ...

  7. 在Ubuntu 12.04 桌面上设置启动器(快捷方式)

    在Ubuntu 12.04 桌面上设置启动器(快捷方式)过程讲解: 如下图所示,Eclipse 和 SQLDeveloper 都可以直接双击打开,这些应用程序的启动器都在 /usr/share/app ...

  8. 使用DBCA工具创建自己的数据库

    ylbtech-Oracle:使用DBCA工具创建自己的数据库  DBCA创建数据库 默认安装的Oracle数据库一般不能满足实际应用的需求,例如数据库名称.数据库块的大小等都需要修改,那么我们应该自 ...

  9. Objective-C:内存管理的小结

    内存管理: 1.OC的对象都是分配在堆里的      Perosn *person  = [[Person alloc]init];      Person *person       //指针类型的 ...

  10. Hibernate 不同数据库的连接及SQL方言

    <!--MySql 驱动程序 eg. mysql-connector-java-5.0.4-bin.jar-->  <property name="dialect" ...