簡介
SVN全名Subversion,即版本控制系統。是近年來崛起的版本管理軟體系統,是cvs的接班人。目前,絕大多數開源軟體都使用svn作為代碼版本管理軟體。Subversion是一個版本控制系統,相對於的RCS、CVS,採用了分支管理系統,它的設計目標就是取代CVS。網際網路上免費的版本控制服務多基於Subversion。
Subversion的版本庫可以通過網路訪問,從而使用戶可以在不同的電腦上進行操作。從某種程度上來說,允許用戶在各自的空間裡修改和管理同一組數據可以促進團隊協作。因為修改不再是單線進行(單線進行也就是必須一個一個進行),開發進度會進展迅速。此外,由於所有的工作都已版本化,也就不必擔心由於錯誤的更改而影響軟體質量—如果出現不正確的更改,只要撤銷那一次更改操作即可。某些版本控制系統本身也是軟體配置管理系統(SCM),這種系統經過精巧的設計,專門用來管理原始碼樹,並且具備許多與軟體開發有關的特性—比如,對程式語言的支持,或者提供程式構建工具。不過Subversion並不是這樣的系統。它是一個通用系統,可以管理任何類型的檔案集。
運行方式
svn伺服器有2種運行方式:獨立伺服器和藉助apache運行。兩種方式各有利弊,用戶可以自行選擇。數據存儲
svn存儲版本數據也有2種方式:BDB(一種事務安全型表類型)和FSFS(一種不需要資料庫的存儲系統)。因為BDB方式在伺服器中斷時,有可能鎖住數據,所以還是FSFS方式更安全一點。工作流程
集中式管理的工作流程如下圖:集中式代碼管理的核心是伺服器,所有開發者在開始新一天的工作之前必須從伺服器獲取代碼,然後開發,最後解決衝突,提交。所有的版本信息都放在伺服器上。如果脫離了伺服器,開發者基本上可以說是無法工作的。下面舉例說明:
開始新一天的工作:
1、從伺服器下載項目組最新代碼。
2、進入自己的分支,進行工作,每隔一個小時向伺服器自己的分支提交一次代碼(很多人都有這個習慣。因為有時候自己對代碼改來改去,最後又想還原到前一個小時的版本,或者看看前一個小時自己修改了哪些代碼,就需要這樣做了)。
3、下班時間快到了,把自己的分支合併到伺服器主分支上,一天的工作完成,並反映給伺服器。
這就是經典的svn工作流程,從流程上看,有不少缺點,但也有優點。
優缺點
所有的文檔都顯示SVN可以取代CVS,同時SVN的問題和缺點都被隱藏了。不幸的是,我們並不認為SVN是CVS的替代品,儘管很多缺陷都被修改了。更有甚者,它甚至讓人重回CVS。CVS和SVN的比較類似於比較C++和Java。很明顯CVS和SVN都遠比SourceSafe強大的多,如同C++和Java比Basic強大的多。CVS代表了幾乎代碼控制系統的所有功能項,儘管有時他的實現並不很方便。SVN修正並添加了一些CVS並不擁有功能。例如,創建標誌和分支dubious,你在編輯檔案時其他人不會有任何通知。SVN並不是CVS的替代品,只是個不同的系統,類似於CVS。它有些特有的功能,足以作為採用它的理由。這些功能使他更適合於開發環境,例如對PowerBuilder。下面你可以找到兩者的相對優勢、劣勢。1.存儲類型格式
CVS是個基於RCS檔案的版本控制系統。每個CVS檔案都不過是普通的檔案,加上一些額外信息。這些檔案會簡單的重複本地檔案的樹結構。因此,不必擔心有什麼數據損失,如果必要的話可以手工修改RCS檔案。
SVN是基於關係資料庫的(BerkleyDB)或一系列二進制檔案的(FS_FS)。一方面這解決了許多問題(例如,並行讀寫已分享檔案)以及添加了許多新功能(例如運行時的事務特性。)。然而另一方面,數據存儲由此變得不透明。
2.速度
CVS比較慢。
整體而言,由於架構實現的不同,SVN的確比CVS快很多。在網路上它只傳輸很少的信息並支持更多的離線模式的功能。但這也是有代價的。速度的代價就是巨大的存儲(完全備份所有的工作檔案)。
3.標誌&分支
SVN把採用標誌和分支而拋棄了其他三件東西,實際上這意味著他們把這個概念替換為在檔案庫內部複製檔案或目錄以便保存日誌。這樣一來,無論標誌創建還是分支創建都只是倉庫內部的檔案複製了。對分支而言:分支不過是在倉庫內部的一個單獨的目錄而已了,不像早期還有些什麼交錯。對標誌而言:已經不能對代碼加標誌了。在某種程度上說,SVN全檔案編號補足了這個缺陷,SVN里整個倉庫都有版本號,但不是針對單個檔案。
4.元數據
CVS只允許存儲檔案。
SVN允許一個檔案有任意多的可命名屬性,功能十分完全。
5.檔案類型
CVS最初是為文本檔案存儲而設計的。因此其他檔案類型(二進制,統一碼)檔案的支持幾乎沒有,如需要的話則要有其他信息,並且客戶端伺服器端都要調整。
SVN會關心所有的檔案類型,不需要你來手工操作。
6.回滾
CVS允許任意的回滾,在任意一個已遞交的版本上,儘管這要花些時間(所有的檔案都要分別處理)。
SVN不允許遞交後回滾。建議把版本庫里好的狀態版本加到末尾,覆蓋掉損壞的版本。而損壞的版本無論如何也是會存在資料庫里的。(SVN的滾回操作實際上是merge操作)
7.事務
CVS中的“零或一”事務原則根本沒有實現。如果檢入幾個檔案的話(加到伺服器上),很有可能部分檔案完成了,而另幾個沒有。作為一個潛規則,手工糾正這些並且對餘下的檔案(而不是所有檔案)一一重複檢入。這樣這些檔案將在兩階段中被檢入。SVN的確支持“零或一”事務原則,這是SVN的一大優勢。
與Vss
1.支持重命名,這對Java開發來說非常重要為了得到更好的代碼,開發中需要經常進行重構,重構就經常涉及到檔案的重構名,而重命名VSS中是不被支持的。
2.開發的時候不一定要鎖定。
一方面導致重構不方便,另一方面,不能離線開發,使用SVN就不同,可以帶回家繼續開發,回來後,提交就行了。
3.多平台。
可以支持多個平台下的操作
4.更好的客戶端支持。
Eclipse中的VSSPlugin不如它的SVNPlugin好用。一個在Windows下用的SVN客戶端TortoiseSVN也比VSS的客戶端好用(VSS只有微軟提供的一個GUI客戶端)。
5.更好地與外圍工具集成。
各種各樣的外圍工具(主要是伺服器端),滿足多種需要。如果有需要,也可以自己寫外掛程式或管理腳本,開放的架構,允許我們這樣做。
6.方便。
一個例子:部署套用的時候,以前的做法是找出一個項目中修改過的檔案,更新到伺服器上去,可以在伺服器上執行svnexport命令,把代碼庫中的最新版本導出,完成部署(也可以替換回老版本)。
7.速度與穩定性看起來都不錯。
學習它的管理、它的工作方式,是值得的。而VSS是一個已經被逐漸拋棄的軟體。如果時間不是多得沒處用,那么就把時間花在最值得花的東西上面。
缺點
1、伺服器壓力太大,資料庫容量暴增。
2、如果不能連線到伺服器上,基本上不可以工作,看上面第二步,如果伺服器不能連線上,就不能提交,還原,對比等等。
3、不適合開源開發(開發人數非常非常多,但是Googleappengine就是用svn的)。但是一般集中式管理的有非常明確的許可權管理機制(例如分支訪問限制),可以實現分層管理,從而很好的解決開發人數眾多的問題。
優點
1、管理方便,邏輯明確,符合一般人思維習慣。
2、易於管理,集中式伺服器更能保證安全性。
3、代碼一致性非常高。
4、適合開發人數不多的項目開發。
5、大部分軟體配置管理的大學教材都是使用svn和vss。
安全性
SVN站在更高層次上對安全產品,從系統和控制的角度進行了"有機"和"無隙"的整合。SVN是一個安全虛擬網路系統,它將系統整體的信息安全功能均衡合理地分布在不同的子系統中,使各子系統的功能得到最大限度的發揮,子系統之間互相補充,系統整體性能大於各子系統功能之和,用均衡互補的原則解決了"木桶原理"的問題。
SVN能在跨接Internet,Intranet,Extranet間的網路所有端點實現全面的安全,而且還能提供基於企業策略的信息管理機制以充分有效地利用有限的頻寬。SVN可以滿足各種企業VPN的要求,通過為公司內部網路、遠程和移動用戶、分支機構和合作夥伴提供基於Internet的安全連線。所以,我們可以將SVN看成是VPN、防火牆、基於企業策略的信息管理軟體集成在一起的Internet安全的綜合解決方案。在這樣一個網路系統中,所有網際網路伺服器端和客戶端都是安全的,並有一個信息管理機制以不斷地通過這個外部網路環境動態地分析及滿足客戶的特定頻寬需求。SVN提供了基於網路實現的eBusiness套用的安全服務,它包含:
對多種套用進行全面的安全認證;
支持多種認證及PKI;
功能強大並對用戶透明的通訊加密;
面向用戶的集中安全策略管理;
統一跨接Internet、Intranet、Extranet的通訊。
體系結構
帶有防火牆的VPN網關,它是一個將防火牆和VPN技術緊密結合的網關產品;SVN安全遠程客戶端軟體包,一個功能強大的VPN客戶端軟體,支持台式機用戶、遠程用戶和移動用戶,具有集中化管理的個人防火牆功能和VPN用戶的安全認證功能;
SVN證書管理模組,一個用於SVN的完整PKI解決方案,它將完善的CA和LDAP目錄伺服器技術集成在一起;
SVN硬體加密卡,可以通過硬體技術實現功能強大的各種算法以提高VPN的速度和性能;
SVN智慧型頻寬管理模組,一個基於企業策略的頻寬管理解決方案,可以智慧型地管理有限的頻寬資源,以確保用於企業重要套用的VPN性能可靠;
SVN冗餘管理模組,通過冗餘網關集群和防火牆VPN內的SVN冗餘模組,對執行重要任務的VPN和防火牆套用在出現故障時實現無縫切換。
自動地址轉換模組,一個自動管理IP位址和命名的解決方案,通過提供IP位址服務的跟蹤和集中化管理,確保可靠地控制地址分配和提高TCP/IP管理效率;
SVN安全伺服器軟體包,專門保護單個套用伺服器安全的VPN網關軟體,它可以保護進行敏感操作的伺服器免受攻擊和未授權的訪問,使客戶端建立與伺服器間的安全認證和支持交換加密數據的連線;
SVN安全客戶端軟體包,它將基於狀態檢測的防火牆和基於IPSec的VPN客戶端軟體集成在客戶端機器上,通過提供集中管理的個人防火牆和對所有企業VPN用戶的安全認證,增強客戶端機器的安全性。它與 SVN安全遠程客戶端軟體功能相比,增強了客戶端的安全功能,如訪問控制和安全初始化控制等。
發展歷史
在2000年初,開發人員要寫一個CVS的自由軟體代替品,它保留CVS的基本思想,但沒有它的錯誤和局限,保留CVS的基本特性但去除CVS的bug和不好的特性。在2000年2月,他們聯繫《使用CVS開發開源項目》(OpenSourceDevelopmentwithCVS)(Coriolis,1999)的作者KarlFogel,並徵求了他是否願意在這個新的項目中擔任一個角色。巧合的是,當時Karl已經和他的朋友JimBlandy討論了一個關於新的版本控制系統的設計。在1995年,這兩人就成立了CyclicSoftware,一個提供CVS的商業支持的軟體公司。雖然他們經營商業服務,但是仍然在每天都在工作中使用CVS。使用CVS的挫折感使得Jim認真思考更好的方法來管理數據,不但確定名字為“Subversion”,而且完成了Subversion檔案庫的基礎設計。
當CollabNet的電話到來時,Karl立即答應了加入項目中,而且Jim讓他的僱主RedHatSoftware同意讓他在這個項目中不定期工作。CollabNet雇用了Karl和BenCollins-Sussman,並在5月開始了詳細設計工作。在得到了來自CollabNet的BrianBehlendorf、JasonRobbins和GregStein(當時是一名活躍在WebDAV/DeltaV規範過程的自由程式設計師)很多創意的幫助下,Subversion很快地引起了一個活躍開發者社區的注意。它找出並歡迎很多同樣在CVS上受到挫折的社員能來為這個項目做點什麼。
Subversion最初的設計Team定下了幾個簡單的目標。它必須在功能上可取代CVS,也就是說,所有CVS可做到的事,它都要能夠作到。在修正最明顯的瑕疵的同時,還要保留相同的開發模式。還有,Subversion應該要和CVS很相像,任何CVS使用者只要花費少許的力氣,就可以很快地上手。
經過十四個月的編碼後,Subversion於2001年8月31日開始實現“自行管理”。也就是說,開發人員不再使用CVS來管理Subversion的代碼,而以Subversion自己來管理。
2009年11月,Subversion被ApacheIncubator專案所接收。
2010年1月,正式成為Apache軟體基金會的一個頂級專案,所以為ApacheSubversion.
目前ApacheSubversion的主席為GregStein,項目領導者Releasemanager為Wandisco公司。
遠程改密
由於SVN沒有自己的遠程管理工具,只能上伺服器上用命令行操作,故操作起來比較複雜。為此,svn俱樂部開發出svn管家對svn進行遠程管理,svn管家推出了windows版本和linux版本,部署很方便,不用安裝額外的環境如mysql、PHP或JAVA。svn管家不僅可以方便的遠程修改用戶密碼,更可以對svn進行遠程管理,極大地方便了SVN的用戶。其他
啟動這個項目,CollabNet提供了啟動資金(它付出幾位全職Subversion開發人員的薪水),但這是個開源項目,由一組鬆散透明的規則所約定,2010年1月,正式成為Apache軟體基金會的一個頂級項目,並遵守Apachelicense,目前Wandisco是貢獻最多的全職Subversion開發者並擔任releasemanager.實例研究
MartinFowler使用SVN一兩年前,我工作生涯的一個重要方面發生了變化,那之前我一直只在一台電腦上工作(更確切地說是只用一塊硬碟),所有工作檔案都保存在我的筆記本硬碟里。如果我要用另外一台桌面電腦,就通過檔案共享操縱那些檔案。
自從去年我買了PowerBook事情就變了,現在我經常轉戰於三台機器:MacPowerBook、Windows筆記本、Ubuntu桌面。
這就意味著我得保持多台機器上的東西都是最新的——至少我的工作檔案都要保持最新。有了多台桌面電腦,我主要的email服務從POP轉到了IMAP,這給我帶來巨大的便利——儘管它有時“打打隔”,但我敢說IMAP在我的多台機器上跑得很好(我用Thunderbird做客戶端)。
我大部分工作檔案都被Subversion管理起來了,每當切換機器時我就提交(commit)工作目錄,再到新機器上更新(update)。一切都同步得好好的,還全面享受了版本管理服務。
不過,也有一些東西同步起來沒我想要的那么方便。地址簿就很難直接同步,Thunderbird總固執地把它們放到一個特定的地方,Subversion檢查不到。更倒霉的是地址簿是二進制檔案,難以合併(merge),這很煩人,但Thunderbird用文本檔案來處理email,這一點兒挺招人喜歡的,當IMAP打嗝時我也不難處理。另外,與PDA同步也很難纏,最後我還是找到個不賴的辦法把所有聯繫人和日程表信息在三台機器上都同步好了。再者就是news聚合工具,它們之間可以通過OPML共享feeds(至少理論上如此),但不能記錄下哪些我讀過了哪些還沒讀。
檔案儘量採用文本格式,這樣做好處很多。我所有寫作都是用XML,要同步寫的東西只需要一個文本編輯器。但圖表就成問題了,我還沒找到一個在所有平台上都能用的東西,不過,搭起多台桌面的一個好處是所有專用於一個系統的軟體我也能用了。
版本發布
2012年02月21日,SubversionAccesscontrol4.1引入更為敏捷靈活的授權方式。2012年03月09日,ApacheSubversion1.7.4發布。
2012年05月19日,ApacheSubversion1.7.5發布。
2012年08月16日,ApacheSubversion1.7.6發布。
2012年10月09日,ApacheSubversion1.7.7發布。