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 開頭的資訊提示你,這個檔案有點麻煩,你在本地的修改和版本庫中的版本修改的地方重疊了,也就是說,你修改了某一行,你的同僚也修改了同一行。這個就需要你自己手工去解決了。當沖突發生時,要注意到有三件事情可以幫助你解決問題。