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. .NET程序员提高效率的70多个开发工具

    工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节, ...

  2. MP1593 RT8272 ACT4070 制作的DC-DC稳压电源

    http://www.ideyi.org/article/11-05/2575971305526398.html?sort=2068_2073_2092_0 MP1593制作的DC-DC稳压电源,这款 ...

  3. Hex-Rays Decompiler

    https://www.hex-rays.com/products/decompiler/ We are pleased to present our flagship product, the He ...

  4. LoadRunner的简单使用《第一篇》

    LoadRunner是一个用压力测试的软件.这东西比较难上手,光安装就非常麻烦.好不容易一步步跟着安装说明安装好之后,还是用不了. 记录一个问题如下: 导入脚本的时候报错fail to create ...

  5. MVC批量更新,可验证并解决集合元素不连续控制器接收不完全的问题

    在"MVC批量添加,增加一条记录的同时添加N条集合属性所对应的个体"中,有2个问题待解决: 1.由jquery动态生成了表单元素,但不能实施验证. 2.一旦集合元素不连续,控制器就 ...

  6. MVC二级联动使用$.ajax方法获取后端返回的字符串

    在"MVC二级联动使用$.getJSON方法"中使用$.getJSON()获取后端返回的JSon. 本篇使用jQuery的$.ajax()获取后端返回的字符串,实现二级联动.   ...

  7. INDY10 IDHTTPSERVER返回中文不乱码

    INDY10 IDHTTPSERVER返回中文不乱码 procedure TynHttpServer.CommandGet(AContext: TIdContext; ARequestInfo: TI ...

  8. Selenium2+Python自动化-处理浏览器弹窗(转载)

    本篇转自博客:上海-小T 原文地址:http://blog.csdn.net/real_tino/article/details/59068827 我们在浏览网页时经常会碰到各种花样的弹窗,在做UI自 ...

  9. Juce源代码分析(一)Juce的优势

    为什么学习Juce JUCE (Jules' Utility Class Extensions)是由Raw MaterialSoftware公布的一套基于c++的跨平台应用程序框架类库(Windows ...

  10. UML九种图 之 用例图和类图

    前言     近期写UML文档,看视频的时候感觉掌握的还能够,当真正写文档的时候才发现不是一件easy的事.写文档自己又翻开自己的笔记看了一遍又一遍. 以下就给大家介绍一下我画的几张图: 用例图   ...