SVN 簡介
Subversion(SVN) 是一個開源的版本控制系統, 也就是說 Subversion 管理著隨時間改變的數據。 這些數據放置在一個中央資料檔案庫(repository) 中。 這個檔案庫很像一個普通的檔伺服器, 不過它會記住每一次檔的變動。 這樣你就可以把檔案恢復到舊的版本, 或是流覽檔的變動歷史。
SVN 的一些概念
- repository(源代碼庫):源代碼統一存放的地方
- Checkout(提取):當你手上沒有源代碼的時候,你需要從repository checkout一份
- Commit(提交):當你已經修改了代碼,你就需要Commit到repository
- Update (更新):當你已經Checkout了一份源代碼, Update一下你就可以和Repository上的源代碼同步,你手上的代碼就會有最新的變更
日常開發過程其實就是這樣的(假設你已經Checkout並且已經工作了幾天):Update(獲得最新的代碼) -->作出自己的修改並調試成功 --> Commit(大家就可以看到你的修改了) 。
如果兩個程式員同時修改了同一個檔呢, SVN 可以合併這兩個程式員的改動,實際上SVN管理源代碼是以行為單位的,就是說兩個程式員只要不是修改了同一行程序,SVN都會自動合併兩種修改。如果是同一行,SVN 會提示檔 Conflict, 衝突,需要手動確認。
SVN 的主要功能
- (1)目錄版本控制
CVS 只能跟蹤單個檔的歷史, 不過 Subversion 實作了一個 "虛擬" 的版本控管檔系統, 能夠依時間跟蹤整個目錄的變動。 目錄和文件都能進行版本控制。
- (2)真實的版本歷史
自從CVS限制了檔的版本記錄,CVS並不支持那些可能發生在檔上,但會影響所在目錄內容的操作,如同複製和重命名。除此之外,在CVS裏你不能用擁有同樣名字但是沒有繼承老版本歷史或者根本沒有關係的檔替換一個已經納入系統的檔。在Subversion中,你可以增加(add)、刪除(delete)、複製(copy)和重命名(rename),無論是檔還是目錄。所有的新加的檔都從一個新的、乾淨的版本開始。
- (3)自動提交
一個提交動作,不是全部更新到了檔案庫中,就是不完全更新。這允許開發人員以邏輯區間建立並提交變動,以防止當部分提交成功時出現的問題。
- (4)納入版本控管的元數據
每一個檔與目錄都附有一組屬性關鍵字並和屬性值相關聯。你可以創建, 並儲存任何你想要的Key/Value對。 屬性是隨著時間來作版本控管的,就像檔內容一樣。
- (5)選擇不同的網路層
Subversion 有抽象的檔案庫存取概念, 可以讓人很容易地實作新的網路機制。 Subversion 可以作為一個擴展模組嵌入到Apache HTTP 伺服器中。這個為Subversion提供了非常先進的穩定性和協同工作能力,除此之外還提供了許多重要功能: 舉例來說, 有身份認證, 授權, 線上壓縮, 以及檔庫流覽等等。還有一個羽量級的獨立Subversion伺服器, 使用的是自定義的通信協議, 可以很容易地通過 ssh 以 tunnel 方式使用。
- (6)一致的數據處理方式
Subversion 使用二進位差異演算法來異表示檔的差異, 它對文字(人類可理解的)與二進位檔(人類無法理解的) 兩類的檔都一視同仁。 這兩類的檔都同樣地以壓縮形式儲存在檔案庫中, 而且檔差異是以兩個方向在網路上傳輸的。
- (7)有效的分支(branch)與標籤(tag)
在分支與標籤上的消耗並不必一定要與專案大小成正比。 Subversion 建立分支與標籤的方法, 就只是複製該專案, 使用的方法就類似於硬連接(hard-link)。 所以這些操作只會花費很小, 而且是固定的時間。
- (8)Hackability
Subversion沒有任何的歷史包袱; 它主要是一群共用的 C 程式庫, 具有定義完善的API。這使得 Subversion 便於維護, 並且可被其他應用程式與程式語言使用。
優於CVS之處
1、原子提交。一次提交不管是單個還是多個檔,都是作為一個整體提交的。在這當中發生的意外例如傳輸中斷,不會引起資料庫的不完整和數據損壞。
2、重命名、複製、刪除檔等動作都保存在版本歷史記錄當中。
3、對於二進位檔,使用了節省空間的保存方法。(簡單的理解,就是只保存和上一版本不同之處)
4、目錄也有版本歷史。整個目錄樹可以被移動或者複製,操作很簡單,而且能夠保留全部版本記錄。
5、分支的開銷非常小。
6、優化過的資料庫訪問,使得一些操作不必訪問資料庫就可以做到。這樣減少了很多不必要的和數據庫主機之間的網路流量。