天天看點

svn指令行使用技巧

1.撤銷全部操作

如果你希望恢複一整個目錄的檔案,可以使用--depth=infinity選項:

$ Svn revert --depth=infinity .

Reverted newdir/afile

Reverted foo.c

Reverted bar.txt

最後,你可以取消預定的操作:

$ svn add mistake.txt whoops

A         mistake.txt

A         whoops

A         whoops/oopsie.c

$ Svn revert mistake.txt whoops

Reverted mistake.txt

Reverted whoops

$ svn status

?      mistake.txt

?      whoops。SVN的子指令Svn revert的一些相關問題就介紹到這裡,請你關注本節的其他文章介紹。

2.删除svn資訊

删除這些目錄是很簡單的,指令如下 

find . -type d -name ".svn"|xargs rm -rf 

3.退回到某一版本

一直在找svn復原的方法,這個還是很實用的,屢試不爽阿

經常由于坑爹的需求,功能要切回到之前的某一個版本。有兩種方法可以實作: 方法1: 用svn merge   1) 先 svn up,保證更新到最新的版本,如20;   2) 然後用 svn log ,檢視曆史修改,找出要恢複的版本,如10 。如果想要更詳細的了解情況,可以使用svn diff -r 10:20 [檔案或目錄];   3) 復原到版本号10:svn merge -r 20:10 [檔案或目錄],注意版本号之間的順序,這個叫反向合并;   4) 檢視目前工作版本中的檔案,如test.cpp和版本号10中檔案的差别:svn diff -r 10 test.cpp, 有差别則手動改之;   5) 若無差别,則送出:svn ci -m“back to r 10,xxxxx” [檔案或目錄]。這時svn庫中會生成新的版本,如21。 方法2: 用svn up   前2步如方法1,然後直接 svn up -r 10。目前的工作版本就是版本10了。但是注意,這時svn庫中會并不會生成新的版本,下次在本地svn up之後,還是會回到之前的版本。

4.SVN如何檢視修改的檔案記錄

主要是有四個指令,svn log用來展示svn 的版本作者、日期、路徑等等;svn diff,用來顯示特定修改的行級詳細資訊;svn cat,取得在特定版本的某檔案顯示在目前螢幕;svn  list,顯示一個目錄或某一版本存在的檔案。

比較常用的是svn diff指令。它可以比較不同版本之間、svn版本和本地版本庫之間,以及檢查本地修改的作用。

svn diff; #什麼都不加,會堅持本地代碼和緩存在本地.svn目錄下的資訊的不同;

svn diff -r 3;  #比較你的本地代碼和版本号為3的所有檔案的不同;

svn diff -r 3 text.c;  #比較你的本地代碼和版本号為3的text.c檔案的不同;

svn diff -r 5:6;  #比較版本5和版本6之間所有檔案的不同;

svn diff -r 5:6 text.c;  #比較版本5和版本6之間的text.c檔案的變化。

檢視修改的資訊使用 log 指令,如下:

svn log;  #什麼都不加會顯示所有版本commit的日志資訊;

svn log -r 4:5;  #隻看版本4和版本5的日志資訊;

svn log test.c;  #檢視檔案test.c的日志修改資訊;

svn log -v dir;  #檢視目錄的日志修改資訊,需要加v;

檢視某個版本的某個檔案内容,使用cat指令,如下:

svn cat -r 4 test.c;  #檢視版本4中的檔案test.c的内容,不進行比較;

不用下載下傳到本地檢視檔案的各種資訊,使用 list 指令,如下:

svn list http://svn.test.com/svn  #檢視目錄中的檔案;

svn list -v http://svn.test.com/svn  #檢視詳細的目錄的資訊(修訂人,版本号,檔案大小等);

5.checkout出單個檔案

1、檢出目錄images

svn co --depth=empty http://www.iusesvn.com/project1/images images_work_dir       

這樣就在本地形成了一個工作拷貝目錄images_work_dir

2、進入images_work_dir目錄,單獨更新logo.jpg

svn up logo.jpg       

這樣,我們就單獨檢出了logo.jpg,後面就可以對這個檔案進行修改、送出等操作。

6.關于沖突解決

如果不小心送出了一些動态改變根本不需要的檔案到svn伺服器上,出現沖突如何解決? 基本思路是首先使用svn resolved filename 放棄對檔案的修改,然後就可以送出上去了。 然後svn rm test.log删除掉這個檔案。然後再次送出,如果其他人更新的也同樣處理。 

1.svn ci -m "update"  svn: Commit failed (details follow):  svn: Aborting commit: 'test.log' remains in conflict 

2.使用svn resolved test.log (該指令會删除沖突的mine等檔案,告訴svn沖突已解決,對test.log檔案沒影響)

3.svn ci -m "update"  這個時候應該可以送出了 

4.svn rm test.log  删除掉這個檔案 

5.svn ci -m "update"  再次送出 

這個時候伺服器上就沒有這個檔案了。  在其他的伺服器終端上如果遇到這個問題的時候重複這個操作。

工程師A修改了a.txt的第一行,送出了。

工程師B也修改了a.txt的第一行,然後執行svn up,這時SVN提示了:(以下,你開始扮演工程師B的角色了)

$ svn up

在 “a.txt” 中發現沖突。

選擇: (p) 推遲,(df) 顯示全部差異,(e) 編輯,

(mc) 我的版本, (tc) 他人的版本,

(s) 顯示全部選項:

我一般選擇p(推遲),即引入沖突到本地,不過不會影響到SVN伺服器端,可以放心。

OK,開始解決沖突了。

這時,會生成幾個檔案:

a.txt  a.txt.mine  a.txt.r6328  a.txt.r6336

其中a.txt中包含了工程師A、B的所有修改,以<<<<<<<、=======、>>>>>>>分隔。

a.txt.mine是工程師B的修改,也就是未update前的a.txt。

a.txt.r6328 是工程師A送出前的版本,即未導緻沖突的版本。

a.txt.r6336是工程師A送出後的版本,即導緻沖突的版本。

一般,檢視a.txt就可以看到沖突的詳情了:

[[email protected] svntest]$ cat a.txt

<<<<<<< .mine

i also modify ,agndagnagasdg;

=======

i modify this line;

>>>>>>> .r6336

以上,<<<<<<< .mine和=======之間是工程師B(目前的“你”)修改的内容,=======與>>>>>>> .r6336之間是工程師A修改的内容。這時,最好的辦法是,叫上工程師A,你們一起确定這些修改是否都需要,是否互相相容,然後留下需要的部分,删 除<<<<<<< .mine、=======和>>>>>>> .r6336。

然後,測試,測試!确定沒問題之後,就可以告訴SVN,你解決沖突了:

svn resolve –accept working a.txt (該指令會删除a.txt.mine  a.txt.r6328  a.txt.r6336)

svn ci -m ’some comment’ a.txt

這裡需要注意的是,a.txt.mine  a.txt.r6328  a.txt.r6336這幾個檔案的存在代表着有沖突産生。如果不解決沖突,就手工删除它們,SVN伺服器也會很傻的認為你解決了沖突,允許你繼續之後 的工作。但是,沖突依舊存在,你的a.txt中不但有别人的修改,還有那些讨厭的<=>符号。

在沖突未解決前,試圖送出代碼是肯定會失敗的:

$ svn ci -m ”

svn: 送出失敗(細節如下):

svn: 送出終止: “/path/to/svntest/a.txt” 處于沖突狀态

在使用svn update 的時候,會出現如下一些資訊:

$ svn update

U  INSTALL

G  README

C  bar.c

Updated to revision 46.

那麼,U 開頭的資訊提示你,這個檔案在你本地沒有修改過,檔案已經根據版本庫的新版本更新了。G 開頭的資訊提示你,這個檔案在你本地已經修改過,但是和版本庫中對應的版本并沒有沖突的地方,svn已經合并更新了。而C 開頭的資訊提示你,這個檔案有點麻煩,你在本地的修改和版本庫中的版本修改的地方重疊了,也就是說,你修改了某一行,你的同僚也修改了同一行。這個就需要你自己手工去解決了。當沖突發生時,要注意到有三件事情可以幫助你解決問題。