svn diff和vimdiff的使用

SVN的子命令SVN diff功能介紹

2010-05-24 14:16  佚名   字號:T | Thtml

一鍵收藏,隨時查看,分享好友!

本文向你們介紹一下SVN的子命令SVN diff,它的主要用法師比較兩條路徑的區別,在這裏和你們分享一下,但願你們共同窗習。linux

AD:WOT2014:用戶標籤系統與用戶數據化運營培訓專場apache

本節和你們討論一下版本控制工具SVN的子命令SVN diff使用狀況,包括子命令SVN diff概念的基本介紹,以及關於子命令SVN diff的一個實例介紹,下面咱們就爲你們一一講解。vim

名稱
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

描述
顯示兩條路徑的區別,子命令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 DIRspa

例子:
咱們來看一下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講解在這裏就告一段落了,請關注本節的其餘相關報道。.net




使用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個文件了。

效果圖:

相關文章
相關標籤/搜索