SVN diff 筆記

SVN diff命令在實際中常常使用,在此記錄使用點滴。html

#對比 工做文件與緩存在.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版本java

@@ -7,7 +7,7 @@        -:表示old版本;+:表示new版本;7,7:表示從第七行開始的後七行(即7-13行)old和new的對比;若是行數比較多系統會自動分行;只會顯示增刪改行和相近行數,其餘不會顯示。git

-:表示old版本有new沒有apache

+:表示new版本有old沒有windows

沒有標識的表示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」)。svn

若是你指定的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]
 
  一、顯示版本 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」。
 
  二、顯示新舊版本中對應目標的差別。PATH 是相對於新舊目標的相對路徑,
     它限制只輸出這些路徑上的差別。新舊目標能夠是工做副本路徑或地址 URL[@REV]。
     新目標默認與舊目標相同,OLDREV 默認爲 N,NEWREV 默認爲 M。
 
  三、「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
相關文章
相關標籤/搜索