linux環境下SVN使用方法

1 簡介
Subversion(SVN) 是一個開源的版本控制系統,管理隨時間改變的數據。 這些數據放置在一箇中央資料檔案庫(repository) 中。 這個檔案庫很像一個普通的文件服務器, 不過它會記住每一次文件的變動。 這樣你就可以把檔案恢復到舊的版本, 或是瀏覽文件的變動歷史。
 官方網站:http://subversion.apache.org/
 官方手冊:http://svnbook.red-bean.com/old-versions.html (subversion 1.6)
 中文文檔:http://www.svn.org.cn/ http://www.svn.org.cn/category/cclient
 公司使用版本:subversion-1.6.11

2 主要特性
 目錄版本控制: SVN實現了一個 「虛擬」 的版本控管文件系統, 能夠依時間跟蹤整個目錄的變動。 目錄和文件都能進行版本控制。
 真實的歷史版本:你可以增加(add)、刪除(delete)、複製(copy)和重命名(rename),無論是文件還是目錄。所有的新加的文件都從一個新的、乾淨的版本開始。
 納入版本管控的原數據:每一個文件與目錄都附有一組屬性關鍵字並和屬性值相關聯。你可以創建, 並存儲任何你想要的Key/Value對。 屬性是隨着時間來作版本控管的,就像文件內容一樣。
 選擇不同的網絡層:–自定義的SVN協議訪問(svn://host/repository);–SVN作爲一個擴展模塊嵌入到Apache HTTP服務器中,可以通過(http://host/repository)訪問。
 一致的數據處理方式:使用二進制差異算法來表示文件的差異, 它對文字(人類可理解的)與二進制文件(人類無法理解的) 兩類的文件都一視同仁。 這兩類的文件都同樣地以壓縮形式儲存在檔案庫中, 而且文件差異是以兩個方向在網絡上傳輸的。
 有效的分支(branch)與標籤(tag):在分支與標籤上的消耗並不必一定要與項目大小成正比。SVN建立分支與標籤的方法, 就只是複製該項目, 使用的方法就類似於硬連接(hard-link)。所以這些操作只會花費很小,而且是固定的時間。

3 基本原理
3.1 SVN的基本概念
 示意圖
在這裏插入圖片描述
 配置庫(中央資料檔案庫repository)
–SVN的核心是配置庫,儲存所有的數據,配置庫按照文件樹形式儲存數據-包括文件和目錄,任意數量的客戶端可以連接到配置庫,讀寫這些文件。通過寫數據,別人可以看到這些信息;通過讀數據,可以看到別人的修改。
–SVN會記錄配置庫中的每一次更改,不僅針對文件也包括目錄本身,包括增加、刪除和重新組織文件和目錄。
在這裏插入圖片描述
 工作副本(Workspace)
與位於中央配置庫相對應的是每個人的工作空間,它是每個程序員工作的地方,程序員從配置庫拿到源代碼,放在本地作爲工作副本,在工作副本上進行查看、修改、編譯、運行、測試等操作,並把新版本的代碼從這裏提交回配置庫中。
在這裏插入圖片描述
3.2 SVN的基本流程
在這裏插入圖片描述
3.3 SVN的工作模式
 工作模式一:複製修改合併(SVN默認方案)
在這裏插入圖片描述
 工作模式二:鎖定修改解鎖
在這裏插入圖片描述

4 用戶常用操作命令
4.1 查看SVN版本號
 命令:svn –version
在這裏插入圖片描述
4.2 SVN幫助
 命令:svn help
在這裏插入圖片描述
4.3 查看版本庫下文件和目錄列表
 命令:svn list 【PATH】 簡寫:svn ls 【PATH】
在這裏插入圖片描述
4.4 查看文件日誌
 命令:svn log 【PATH】
在這裏插入圖片描述
4.5 檢出(checkout)到本地目錄
 checkout導出文件後,文件仍處在SVN版本控制中,與版本庫保持聯繫。export導出的版本文件脫離SVN版本控制,修改後無法update和commit操作;
 先在本地創建一個目錄(checkout的存放地點),命令:mkdir 【PATH】/filename;
 進入剛創建的目錄cd 【PATH】;
 檢出命令:svn checkout 【PATH】, 簡寫:svn co 【PATH】
在這裏插入圖片描述
4.6 添加(add)新的文件到版本庫
 進入已經checkout到本地的目錄下,在適當的目錄下建立文件;
 然後使用命令:svn add 【filename】or【Dir】;
 例如,添加一個文件:svn add test.c,添加test.c;
 例如,添加多個文件:svn add *.c,添加目錄下所有的c文件;
 注意:add只是將本地目錄下的文件與SVN版本庫進行了關聯,只有提交(commit)後纔會在版本庫中創建成功。
 如下圖所示,添加vcs.log文件到版本庫:
在這裏插入圖片描述
 如下圖所示,添加文件夾「64」內含文件到版本庫:
在這裏插入圖片描述

4.7 更新(update)文件或目錄到本地目錄
 更新SVN版本庫到本地目錄,顯示更新的文件和次數;
 命令:svn update –r m 【PATH】, 簡寫:svn up –r m 【PATH】;
 如果svn update後沒有目錄,默認更新當前目錄下的所有文件和子目錄到最新版本;
 例:svn update –r 200 test.c,將版本200的test.c文件更新到工作副本(本地目錄);
 如果提交(commit)文件或目錄提示過期,是因爲衝突,,需先update,再修改,然後提交。
 如下圖,將新添加的vcs.log文件和文件夾64在工作副本中刪除,可以通過update將版本庫中的文件拷貝到本地的工作副本中。
在這裏插入圖片描述

4.8 提交(commit)文件到版本庫
 將本地副本中修改或添加後的文件提交到版本庫;
 命令:svn commit –m 「message」 [-N] [–no-unlock]【PATH】(如果選擇了保持鎖,就使用-no-unlock開關);
 簡寫:svn ci –m 「message」 [-N] [–no-unlock]【PATH】;
 如果後面沒有目錄,默認將當前目錄下所有修改的文件提交到版本庫;
 例:svn commit –m 「add test file to the SVN」 test.c,參數-m後寫明具體說明,便於後期回顧查找。
 如下圖,」?」是不在SVN版本庫控制中,因此commit只上傳修改」M」後的文件到SVN版本庫。
在這裏插入圖片描述

4.9 加鎖(lock)和解鎖(unlock)
 鎖定版本庫的拷貝路徑,使其他用戶不能提交修改的文件;
 鎖定命令:svn lock –m 「message」 [–force]【PATH】;
 解鎖名利:svn unlock 【PATH】;
 鎖定示例:svn lock –m 「lock test file」 test.c;
 使用–force可以打破其它用戶或工作拷貝的鎖定,例如,鎖定被其它用戶鎖定的文件:
svn lock tree.jpg
svn: warning: Path '/tree.jpg is already locked by user 'sally in filesystem ‘/svn/repos/db’
svn lock --force tree.jpg
svn: ‘tree.jpg’ locked by user ‘harry’
 解鎖示例:svn unlock test.c。
 所示示例:
在這裏插入圖片描述
 解鎖示例:
在這裏插入圖片描述

4.10 刪除(delete)
 刪除版本庫中的一個項目;
 命令:svn delete 【path】 -m 「message」;
 簡寫:svn del或svn remove或svn rm;
 如果svn delete【URL】,URL指定的項目會直接從版本庫中刪除,例如:
svn delete svn://svnserver/domain/test.c –m 「delete test file」;
 文件在本地副本中刪除後,需提交纔會從版本庫中刪除,例如:
svn delete test.c
svn commit –m 「delete test file」
 刪除文件示例:
在這裏插入圖片描述
 刪除一個目錄及其包含的文件示例:
在這裏插入圖片描述

4.11 比較差異(diff)
 命令:svn diff 【PATH】,簡寫:svn di 【PATH】;
 修改的文件與基礎版本比較,svn diff 【PATH】,例如:
svn diff test.c
 對比版本m與版本n的差異,svn diff –r m:n 【PATH】,例如:
svn diff –r 200:201 test.c
在這裏插入圖片描述

4.12 pwd查看文件或者目錄狀態(status)
 svn status、svn diff和svn revert在沒有網絡的情況下也可以執行(不訪問版本庫),原因是svn在本地.svn中保留了本地版本的原始拷貝,使用-show-updates選項纔會訪問版本庫;
 svn status 【PATH】,目錄下的文件和子目錄的狀態,正常狀態不顯示,
 ?:不在svn的控制中;
 M:內容被修改;
 C:發生衝突;
 A:預定加入到版本庫;
 K:被鎖定;
 svn status –v 【PATH】,顯示每個項目的完全修訂版本信息。
在這裏插入圖片描述

4.13 恢復本地修改(revert)
 恢復所有對文件和目錄的修改;
 不僅恢復本地目錄中一個項目的內容,也包括對屬性的恢復;
 本子命令不會存取網絡,並且會解決衝突的狀況,但不會恢復被刪除的目錄;
 命令:svn revert 【PATH】
 如下圖所示,結合svn diff的例子,0x800080000改爲0x800020000。現在使用revert命令恢復BinLiteConfig.h的修改。即恢復爲0x800080000,恢復後,採用diff命令查看無差異,表示恢復成功。
在這裏插入圖片描述

4.14 查看文件詳細信息(info)
 命令:svn info 【PATH】;
 顯示工作拷貝路徑和URL的詳細信息,包括:
 路經
 名稱
 URL
 版本庫的根
 版本庫的UUID
 Revision
 節點類型
 最後修改的作者
 最後修改的修訂版本
 最後修改的日期
 鎖定令牌
 鎖定擁有者
 鎖定創建時間
 鎖定失效時間 (date)
在這裏插入圖片描述

4.15 輸出指定文件或URL的內容(cat)
 命令:svn cat 【PATH】;
 如果希望不檢出而查看版本庫的readme.txt的內容,如,
svn cat svn://svnserver/test/readme.txt
在這裏插入圖片描述

4.16 將兩個版本之間的差異合併到當前文件(merge)
 命令svn merge –r m:n【PATH】;
 將一個分支合併回主幹(假定你有一份主幹的工作拷貝,分支在修訂版本250創建:
$ svn merge -r 250:HEAD svn://svn.red-bean.com/repos/branches/mybranch
U myproj/tiny.txt
U myproj/flo.txt
 如果你的分支在修訂版本23,你希望將主幹的修改合併到分支,你可以在你的工作拷貝的分支上這樣做:
$ svn merge -r 23:30 file:///tmp/repos/trunk/vendors
U myproj/thhgttg.txt …
 合併一個單獨文件的修改:
$ cd myproj
$ svn merge -r 30:31 thhgttg.txt
U thhgttg.txt

4.17 解決衝突(resolved)
 移除工作副本的目錄或文件的「衝突」狀態;
 本子命令不會依語法來解決衝突或是移除衝突標記;它只是移除衝突的相關文件,然後讓 PATH 可以再次提交;
 命令:svn resolved 【PATH】

4.18 直接將本地目錄導入版本庫(import)
 直接將不受版本庫控制到本地文件或目錄導入到版本庫;
 導入後,本地文件沒有納入版本控制,需要update後,將文件導入到本地的工作副本,此時的文件受版本控制;
 命令:svn import –m 「message」 【PATH】
 如下圖示例:
在這裏插入圖片描述

4.19 直接版本庫文件導出到本地(export)  直接將版本庫中到文件導出到本地;  導出後,本地文件不受版本控制,導出到文件夾下沒有.svn的隱藏文件夾,即沒有版本的元數據信息。  命令:svn export –r 【version number】 【SVN PATH】 【LOCAL PATH】