Subversion

**Apache Subversion**（簡稱 **SVN**，svn），一個開放原始碼的版本控制系統，相較於 RCS、CVS，它採用了分支管理系統，它的設計目標就是取代 CVS。網際網路上很多版本控制服務已從 CVS 轉移到 Subversion。

## 歷史

CollabNet 於 2000 年建立 SVN 專案，意在寫出一款近似 CVS 操作方式的版本控制系統。只不過，此款產品針對 CVS 的 bug 和一些缺失的功能，進行了修正和補充。

2000 年 2 月，他們聯絡了 Open Source Development with CVS（Coriolis, 1999）的作者 Karl Fogel，問他是否願意為這個新專案工作。巧的是這時 Karl 已經在和他的朋友 Jim Blandy 討論一個新的版本控制系統的設計。在 1995 年，兩人開了一家提供 CVS 技術支援的公司，叫作 Cyclic Software。雖然公司已經賣掉了，他們仍然在日常工作中使用 CVS。在使用 CVS 時受到的束縛已經讓 Jim 開始仔細思考管理版本化資料的更好的路子。他不僅已經起好了名字「Subversion」，而且有了 Subvesion 資料庫的基本設計。當 CollabNet 打來電話時，Karl 立刻同意為這個專案工作。Jim 徵得他的老闆 RedHat Software 的同意，讓他投入這個專案，而且沒有時間限制。CollabNet 雇用了 Karl 和 Ben Collins-Sussman，從 5 月份開始詳細設計。由於 Greg Stein 和 CollabNet 的 Brian Behlendorf 和 Jason Robbins 作了恰當的推動，Subversion 很快吸引了一個活躍的開發人員社群。這說明了許多人有相同的受制於 CVS 的經驗，他們對終於有機會對它做點什麼表示歡迎。

最初的設計團隊設定了幾個簡單的目標。他們並不想在版本控制方法論上有新突破。他們只想修補 CVS。他們決定 Subversion 應該與 CVS 相似，保留相同的開發模型，但不複製 CVS 最明顯的缺點。雖然它不一定是 CVS 的完全的替代品，但它應該和 CVS 相似，從而任何 CVS 使用者可以不費什麼力氣的轉換過來。

經過 14 個月的編碼，在 2001 年 8 月 31 號，Subversion 可以「自我寄生」了。就是說，Subversion 開發人員停止使用 CVS 管理 Subversion 的原始碼，開始使用 Subversion 代替。

雖然 CollabNet 發起了這個專案，而且仍然資助一大部分的工作（它為一些專職的 Subversion 開發人員發薪水）。但是 Subversion 像大部分開放原始碼的專案一樣運作，由一個鬆散透明，鼓勵能者多勞的規則管理。CollabNet 的著作權授權條款和 Debian FSG 完全相容。換句話說，任何人可以免費下載，修改，按自己的意願重新分發 Subversion，而不必得到來自 CollabNet 或其他任何人的授權。

2009 年 11 月，Subversion 被 Apache Incubator 專案所接收。

2010 年 1 月，正式成為 Apache 軟體基金會的一個頂級專案。

## 特性

* 統一的版本號。CVS 是對每個檔案順序編排版本號，在某一時間各檔案的版本號各不相同。而 Subversion 下，任何一次提交都會對所有檔案增加到同一個新版本號，即使是提交並不涉及的檔案。所以，各檔案在某任意時間的版本號是相同的。版本號相同的檔案構成軟體的一個版本。
* 原子提交。一次提交不管是單個還是多個檔案，都是作為一個整體提交的。在這當中發生的意外例如傳輸中斷，不會引起資料庫的不完整和數據損壞。
* 重新命名、複製、刪除檔案等動作都儲存在版本歷史記錄當中。
* 對於二進制檔案，使用了節省空間的儲存方法（簡單的理解，就是只儲存和上一版本不同之處）。
* 目錄也有版本歷史。整個目錄樹可以被移動或者複製，操作很簡單，而且能夠保留全部版本記錄。
* 分支的開銷非常小。
* 最佳化過的資料庫存取，使得一些操作不必存取資料庫就可以做到。這樣減少了很多不必要的和資料庫主機之間的網路流量。
* 支援元資料（Metadata）管理。每個目錄或檔案都可以定義屬性（Property），它是一些隱藏的鍵值對，使用者可以自訂屬性內容，而且屬性和檔案內容一樣在版本控制範圍內。
* 支援 FSFS 和 Berkeley DB 兩種資料庫格式。

## 企業級 subversion

### Subversion Multisite

對於企業級應用，subversion 還有其先天不足，比如對於多個地點的並列開發。Wandisco 公司為此開發了 subversion multisite，實現異地對等伺服器自動同步，支援並列開發以及異地備份。

### 基於 Subversion 的 ALM 平台 ——UberSVN

ALM（Application Lifecycle Management）是軟體組態管理的未來趨勢，各種軟體版本工具包括 subversion 都要整合到其中。目前 UberSVN 是唯一的以 Subversion 為基礎構建的 ALM 平台，並實現了協同開發以及社交化編碼。

## 不足

* 只能設定目錄的存取權限，無法設定單個檔案的存取權限（目前可以通過輔助模組比如 wandisco access control 實現單檔案存取）。
* 資料庫為二進位格式，無法方便的利用其它軟體讀取資料庫的內容。

## 使用情況

雖然在 2006 年 Subversion 的使用族群仍然遠少於傳統的 CVS，但已經有許多開放原碼團體決定將 CVS 轉換為 Subversion。已經轉換使用 Subversion 的包括了 FreeBSD、Apache Software Foundation、KDE、GNOME、GCC、Python、Samba、Mono 以及許多團體。許多開發團隊換用 Subversion 是因為 Trac、SourceForge、CollabNet、CodeBeamer 等專案協同作業軟體以及 Eclipse、NetBeans 等 IDE 提供 Subversion 的支援整合。除此之外，一些自由軟體開發的協作網如 SourceForge.net 除了提供 CVS 外，現在也提供專案開發者使用 Subversion 作為原始碼管理系統，JavaForge、Google Code 以及 BountySource 則以 Subversion 作為官方的原始碼管理系統。

2009 年，絕大多數 CVS 服務已經改用 SVN。此時 CVS 早已經停止維護。不過 CVS 也有了合適的替代品。

## SVN 客戶端圖形化軟體

### TortoiseSVN

在 windows 非常受到歡迎的一套客戶端軟體，它與檔案總管整合得相當不錯，可以透過檔案總管在檔案或目錄上用滑鼠右鍵的選單完成 SVN 的操作。
TortoiseSVN 官方網站（頁面存檔備份，存於網際網路檔案館）

### SnailSVN

Mac OS X 平台下類似 TortoiseSVN 的圖形化 SVN 客戶端，可自動標記檔案狀態，並通過右鍵選單提供各種常用 SVN 功能。
下載 SnailSVN (Mac App Store)（頁面存檔備份，存於網際網路檔案館）

### Ankhsvn

將 subversion 的操作整合進 Visual Studio 的 SVN 客戶端軟體。
Ankhsvn 官方網站（頁面存檔備份，存於網際網路檔案館）

### Subclipse

將 Subversion 的操作整合進 Eclipse 的 SVN 客戶端軟體。
Subclipse 官方網站（頁面存檔備份，存於網際網路檔案館）

### Subversive

和 Subclipse 相同。
Subversive 官方網站（頁面存檔備份，存於網際網路檔案館）

### SCPlugin

Mac OS 下類似 TortoiseSVN 的軟體。
SCPlugin 官方網站（頁面存檔備份，存於網際網路檔案館）

### SVNx

Mac OS X 下的一款客戶端軟體。
SVNx 官方網站（頁面存檔備份，存於網際網路檔案館）

### eSVN

Unix 下類似 TortoiseSVN 的軟體。
eSVN 官方網站（頁面存檔備份，存於網際網路檔案館）

### kdesvn

Linux 下使用 KDE 桌面管理下類似 TortoiseSVN 的軟體。
kdesvn 官方網站

### RabbitVCS

Linux 下使用 Gnome 桌面管理下類似 TortoiseSVN 的軟體。
RabbitVCS 官方網站（頁面存檔備份，存於網際網路檔案館）

### GTalkabout

Windows 下整合了討論功能的客戶端軟體。
GTalkabout 官方網站（頁面存檔備份，存於網際網路檔案館）

## 外部連結

* Subversion 官方網站（頁面存檔備份，存於網際網路檔案館）
  * Subversion 舊官方網站（頁面存檔備份，存於網際網路檔案館）