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、優化過的資料庫訪問,使得一些操作不必訪問資料庫就可以做到。這樣減少了很多不必要的和資料庫主機之間的網路流量。