雖然現在有很多的svn用戶端來對svn進行可視化的管理,例如windows下的小烏龜等都是非常優秀的。但總感覺使用起來不是特別方便或者說不是非常的便捷。
而在linux或mac下,svn與linux的命令列搭配使用,可以發揮非常強大的作用,高效,快速。
1. 很多時候我們從網上使用svn checkout一個目錄放到我們自己的項目當中,或者將其他項目中的一個目錄(該目錄已由svn管理)複製到現有的目錄中。
在進行(svn add)/(svn ci)的過程中,會提示衝突。其原因是在每個由svn管理的目錄中都包含一個.svn的目錄來管理該目錄中的檔案,其中有一個entries檔案,
其中包含相應的目錄檔案資訊,版本號碼以及svn伺服器位址資訊等。當我們不知道目前的目錄檔案是從哪個svn伺服器上check下來的,就可以去查看這個檔案。
上面提示衝突,是因為在外層提交更新的過程中,.svn目錄指示目前的目錄中的檔案不是當前工程中的,所以必定會衝突。解決辦法就是刪除該目錄中的.svn目錄。
rm -rf .svn 即可。如果由多個目錄的話,推薦使用 find . -name .svn | xargs rm -rf 刪除目前的目錄之下的所有目錄中的.svn檔案夾。如果由許可權問題,
可以使用sudo find . -name .svn | xargs rm -rf 擷取超級使用者權限將其刪除。然後再次使用svn add 即可正常提交更新。
2. 添加一個檔案或目錄到svn版本控制中
mkdir TestSvnsvn add TestSvnsvn ci TestSvn . -m "add TestSvn" ####必須添加-m ""注釋,否則提交失敗(Linux)
添加檔案/目錄,最後必須要commit(svn ci)才真正的提交到伺服器上。svn add會讓檔案置於一個中間狀態,在XCode或Qt Creator等工具中可以清晰的看到此時檔案前面有個"A",當svn ci 之後就已經成功添加到svn版本控制中
3. svn cleanup
很多時候,在我們使用svn update 時,可能網速較慢,svn update未執行完成,使用ctrl+c發送訊號對其進行強制終止,那麼當再次使用svn update時,則提示檔案夾被鎖定,這種程度的鎖定,可以使用svn cleanup來進行解決。然後在svn update就不會有什麼問題了。
4. 查看目前的目錄的更新log
svn log . ###查看目前的目錄的更新logsvn log file ####查看file檔案的更新log
通過這種方式,可以很清晰的看到某個檔案被更新的曆史,以及更新的簡要說明。從而對檔案的變化能夠有個大致的瞭解。
不過當使用svn ci . -m "this is a test commit"來提交檔案之後,立刻使用svn log 來查看目前的目錄的log時看不到的,需要使用svn update更新之後才可以看到。
5. 解決衝突
正常情況下,每天編程之前,都最好使用svn update來保證自己的代碼是最新的,每完成一個小功能,經過測試之後,都需要及時的將代碼commit到伺服器上。以此來減少衝突。不過多人開發的項目中,衝突是不可避免的。在進行提交檔案之前,都需要svn update來更新當前的檔案,當提示衝突時,可以採用合并的方式或是採用他人的代碼或是自己的代碼來解決衝突(衝突發生時,終端都會提示接下來該如何操作)。當然針對單個衝突的檔案也可以使用svn diff filename >/tmp/1來查看檔案與伺服器上的不同之處,修改好之後在進行提交。
同時推薦一個 vi -d file1 file2 命令,這條命令可以同時開啟兩個檔案,左右個一個,同時有高亮顯示,可以很方便的看到兩個檔案的不同點。對於檢查衝突非常有協助。
6. 忽略檔案的修改/還原檔案到svn上指定的版本
svn revert filename ###丟棄當前檔案的修改
svn update -r 500 ###還原到reversion為500時的狀態,後面加檔案名稱的話,即還原某個檔案到制定的reversion狀態
7. 刪除一個檔案或目錄
svn rm filename ###後面可以跟多個檔案或目錄
svn ci . -m "remove filename" ###跟svn add一樣,刪除之後需要進行commit.進行commit時,需要添加註釋(-m "***"), 或者linux時不允許提交的 ###, 這樣的限制也方便保持良好的習慣
其他:
關於svn倉庫的搭建以及許可權的管理不是本文討論的內容,網上也有很多相關的資料.其中可能涉及到類似apache等的配置,許可權管理等
svn的命令非常多,但是常用的並不多,我在網上看到一篇文章,講的挺清晰,排版也較好,連結為:http://www.php-oa.com/2008/03/12/svnminglingzailinuxxiadeshiyong.html 其中對一些常見的命令以及其使用都有說明。有興趣的可以去看看。
網上有一個svn的pdf,很容易找到,上面詳細的講述了svn的方方面面,但是很多都是用不到的,需要深入瞭解的,可以去查閱下。
最後分享一個vim的profile配置,我一直都在使用的這個,挺好用的,不過個人有個人的習慣,也可以自己去定製個適合自己的。
" yytong 編輯 set nu "show numbersyntax on "syntax highlightset cursorline "have cursorlineset cindent "set smartindent "set autoindent "set hlsearch "highlight search wordset shiftwidth=4 "set tabstop=4 "tab = 4map <silent> <F10> :TlistToggle<cr> "use <Fn> to open/close Tlist"let Tlist_Auto_Open=1 "每次自動開啟Tlistlet Tlist_Show_One_File = 1 "不同時顯示多個檔案的tag,只顯示當前檔案的let Tlist_Exit_OnlyWindow = 1 "如果taglist視窗是最後一個視窗,則退出vim"let Tlist_Use_Right_Window = 1 "在右側視窗中顯示taglist視窗set showmatch "設定自動檢測括弧是否匹配set incsearchset rulerset laststatus=2 "顯示當前檔案名稱autocmd BufReadPost * \ if line("'\"") > 0 && line("'\"") <= line("$") | \ exe "normal g`\"" | \ endif "自動跳轉到上次檔案開啟的位置"set fdm=syntax"for qtset nocpfiletype plugin onset tags+=/home/yytong/work/idong/qt-src/qt-everywhere-opensource-src-4.6.3/include/tagsset tags+=/home/yytong/work/idong/qt-src/qt-everywhere-opensource-src-4.6.3/src/tags"for qt end
最后里面幾行配置了ctags相關的東西,可以在vi中使用代碼的自動補全功能。其中也配置了文法高亮等,非常實用。
只需要編輯~/.vimrc,將上述內容copy過去,或者使用部分代碼。由於放在目前使用者$HOME工作目錄中,
不需要重啟,登出即可生效,真是個好東西。隨便說一下,vim+ctags可以實作類別似IDE的功能,但是mac的ctags不是標準的ctags。
另外可以在vi的命令模式中使用上面的一條或多條語句來進行暫時的控制。例如使用 :set nu 就是開啟行號 :set nonu就是關閉行號
screen命令也是非常好用的,可以在一個終端視窗開啟多個標籤頁,不過不是這篇文章該討論的內容,有時間再去整理個工具 + 生產力的文檔吧!
by yytong 2011-11-25 20:48:02