SVN diff 筆記


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM