1.定義
版本控制(Revision control)是一種軟體工程技巧,籍以在開發的過程中,確保由不同人所編輯的同一檔案都得到更新。
2.原理
版本控制透過文檔控制(documentation control)記錄程序各個模組的改動,並為每次改動編上序號。這種方法是工程圖(engineering drawings)維護(maintenance)的標准做法, 它伴隨着工程圖從圖的誕生一直到圖的定型。 一種簡單的版本控制形式,例如,賦給圖的初版一個版本等級“A”。當做了第一次改變后,版本等級改為“B”,以此類推等等。
3.特征
1.軟件系統的版本控制是指可以自行運行的各子系統的版本控制。
2.軟件系統的版本號由評測小組的人員確定,由評測小組進行版本控制工作。
3.軟件系統的版本號由3部分構成,即主版本號+次版本號+修改號。主版本號1位,只有當系統在結構和功能上有重大突破改進后才發生變化;次版本號有2位;修改號8位,采用提交時的日期,當系統進行任何修改后,包括數據庫結構發生變化,修改號都要隨之改變。例如:Ver3.31.19990317
4.各子系統的版本號獨立。
5.各軟件系統應該有顯示詳細版本號的功能。例如help菜單下的about功能。系統提交存檔時,評測服務部要進行版本號檢查。
6.新系統開發完成、或已存檔的系統進行修改,修改完成后,進行提交存檔時,由評測評測小組系統分析工程師確定新版本號、或更改版本號。
7.軟件系統,產生新的版本后,老版本的軟件系統是否繼續保存,取決於以下條件:
a.老版本的系統如果有客戶還在使用,在客戶升級以前,必須繼續保存。
b.老版本的系統已經沒有客戶使用了,並且新版本的系統已經把老系統的文檔完整地升級過來,這樣可以刪除或覆蓋老版本的系統資源。
c.對於要刪除或覆蓋的老版本系統,可以統一備份起來。
4.常用的版本控制優缺點
VSS
Visual SourceSafe:微軟的版本控制工具,僅支持Windows操作系統。雖然簡單好用,但是僅適用於團隊級開發,不能勝任企業級的開發工作。
VSS優點:安裝、配置、使用均較簡單,很容易上手使用;操作簡單,容易掌握;權限划分可到文件夾級,有Read、Check-Out & Check-In、Add/Rename/Delete、Destroy四種權限級別。
缺點:權限管理基於文件共享形式,只能從文件夾共享的權限設定對整個庫文件夾的權限,而且必須要有可寫權限;版本管理和分支管理只能靠人為的手工設置;版本發行時,只能手工挑選對應的版本文件進行發布;安全性不高,基於文件系統共享實現對服務器的訪問,需要共享存儲目錄,這樣用戶可以對VSS的文件夾執行刪除操作。
CVS
CVS是一個典型的服務器/客戶端軟件,有Unix版本的CVS 、Linux版本的CVS和Windows版本的CVS。CVS支持遠程管理,項目組分布開發時一般都采用CVS。安裝、配置較復雜,但使用比較簡單,只需對配置管理做簡單培訓即可。安全性高,CVS服務器有自己專用的數據庫,文件存儲並不采用 “共享目錄”方式,所以不受限於局域網。CVS可以跨平台,支持並發版本控制,而且免費。CVS不支持文件改名,只針對文件控制版本而沒有針對目錄的管理,並且缺少相應的技術支持,許多問題的解決需要自已尋找資料,甚至是研究源代碼。但也可以根據自己的需要進行編程。
相對功能單一、簡陋,適用於幾個人的小型團隊,在數據量不大的情況下,性能可以接受。
SVN
SVN(Subversion) 是一種版本管理系統,其前身是CVS。SVN是根據CVS 的功能為基礎來設計的,它除包括了CVS 的大多數特點外,還有一些新的功能,如:文件目錄可以方便的改名、基於數據庫的版本庫、操作速度提升、權限管理更完善等。
CVS與SVN比較
比較項目 |
CVS |
SVN |
|
權限控制 |
是否依賴系統帳號 |
依賴 |
不依賴 |
可否對分支授權 |
否 |
是 |
|
是否支持LDAP認證 |
否 |
是 |
|
圖形化帳號管理 |
否 |
是(集中管理平台) |
|
用戶可否獲取忘記口令,修改口令 |
否 |
是(集中管理平台) |
|
目錄,文件名變更 |
否 |
是 |
|
分支
管理 |
創建分支時間 |
耗時* |
快 |
分支可見、查詢 |
難 |
易 |
|
二進制文件 |
二進制優化 |
否 |
是 |
二進制文件標識 |
手工 |
自動 |
|
二進制文件(圖形文件)被破壞 |
易破壞 |
不易破壞 |
|
事物
處理 |
原子提交 |
否 |
是 |
修改提交說明 |
單個文件 |
是 |
|
換行
符 |
可否指定換行符類型 |
否 |
是 |
檢查換行符設定,避免跨平台開發帶來的混亂 |
否 |
是 |
|
功能擴展 |
CVSROOT |
hooks 腳本 |
|
網絡
帶寬 |
網絡帶寬占用 |
高 |
低 |
脫機命令 |
否 |
部分 |
ClearCase(閉源集中式)
ClearCase提供了全面的配置管理——包括版本控制、工作空間管理、建立管理和過程控制,而且無須軟件開發者改變他們現有的環境、工具和工作方式。
ClearCase包括兩套:ClearCase LT和ClearCase (MultiSite)。前者可以用於在同一個局域網的開發小組,適合於中小型開發組織;ClearCase (MultiSite)則適應於分布於不同地理位置、不同局域網的開發小組,適合於大型的開發組織。
優勢:
增加團隊效率――通過對並行開發的支持來實現,包括圖形比較和歸並、標簽、版本目錄結構。
增加個人效率 ――通過自動的工作空間管理來實現,如:直接的版本訪問、消除了在拷貝文件上的時間的浪費。
簡單的維護和提高對客戶的支持――通過快速准確的重建先前的版本來實現。
快速准確的產品發布 ――通過保證構造的准確性和對軟件的每一個元件進行版本控制來實現。
減少錯誤發生 ――通過事件發生以后對每一個元件的變更進行追蹤來實現。
硬件資源的優化 ――通過分布式構造、減少文件拷貝、可用對象的共享等功能來實現。
提高項目協調和編制 ――通過文件注釋和開發周期階段變更的自動關聯來實現。
提高產品質量 ――通過靈活的進程控制,和圖形接口定制,使得軟件開發在實際中保持一致。
更加有效的團隊擴展――通過減少系統管理和維護的負擔來實現。
支持分布式結構使得團隊成長――通過Client/Server結構進行多點復制和及時的對象版本的更新來實現。
使用配置管理工具而降低風險――由於它不干擾軟件程序員的工作,所以可以使用常用的工具和文件系統接口。
增加了軟件的安全性和保護性 ――通過使用分布式的存儲結構,所有的軟件資源會隨時更新、在硬盤或網絡出現錯誤時那些被ClearCase存儲的版本信息會立刻恢復。
減少培訓和實現成本 ――ClearCase通過采用透明結構以及和標准開發工具進行集成來實現。
強有力的開發和維護 ――通過和其它工具(如:缺陷追蹤)、系統、結構進行集成。
支持不同種類的開發 ――通過兼容不同平台的軟件配置管理系統,如:Windows NT、UNIX、和一些Client端的軟件,如:Windows 95、Windows NT、Windows 3.1和Windows for Workgroups。
缺點:ClearCase 太貴,易用性差,培訓費用很貴,沒有培訓,很難上手使用。
StarTeam(閉源集中式)
StarTeam屬於高端的工具,在易用性,功能和安全性等方面都很不錯。 StarTeam的用戶界面同VSS的類似,它的所有的操作都可通過圖形用戶界面來完成,同時,對於習慣使用命令方式的用戶,StarTeam也提供命令集進行支持。而且StarTeam的隨機文檔也非常詳細。 StarTeam還提供了流程定制的工具,用戶可跟據自己的需求靈活的定制流程。與VSS和CVS不同,VSS和CVS是基於文件系統的配置管理工具,而StarTeam是基於數據庫的。StarTeam的用戶可根據項目的規模,選取多種數據庫系統。StarTeam無需通過物理路徑的權限設置,而是通過自己的數據庫管理,實現了類似Windowsnt的域用戶管理和目錄文件ACL控制。StarTeam完全是域獨立的。這個優勢可以為用戶模型提供靈活性,而不會影響到現有的安全設置。StarTeam的訪問控制非常靈活並且系統。您可以對工程、視圖、文件夾一直向下到每一個小的item設置權限。對於高級別的視圖(view),訪問控制可以與用戶組、用戶、項目甚至視圖等鏈接起來。 StarTeam是按license來收費的,比起VSS,CVS來,企業在啟動StarTeam進行配置管理需要投入一定資金。
優點:權限設置功能強大方便。StarTeam的圖形化界面,能夠使初學者易於接收,而且其缺陷控制功能的功能(基於數據庫的Change Request),是相應工具中獨樹一幟的。
缺點:不支持並行開發,不能很好解決Merge的問題;不支持分支的自動合並,需要手動來處理;速度慢,一定程度上影響開發效率;故障恢復困難,需要有專職管理員維護;沒有中文版本;另外,StarTeam集成度較高,移植過程復雜,需要的管理負擔大,需要完善的備份計划。
GIT(開源分布式)
GIT 是一款免費的、開源的、分布式的版本控制系統。旨在快速高效地處理無論規模大小的任何軟件工程。與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必服務器端軟件支持,使源代碼的發布和交流極其方便。每一個GIT克隆都是一個完整的文件庫,含有全部歷史記錄和修訂追蹤能力。其最大特色就是“分支”及“合並”操作快速、簡便。支持離線工作,GIT是整個項目范圍的原子提交,而且GIT中的每個工作樹都包含一個具有完整項目歷史的倉庫。
GIT 本來是面向 Linux 操作系統開發的軟件。在 Linux 平台上使用GIT非常簡單,都是命令行模式。但對windows以及中文的支持不是很好。
Mercurial(開源分布式)
Mercurial 是一種輕量級分布式版本控制系統,采用 Python 語言實現,易於學習和使用,擴展性強。其是基於 GNU General Public License (GPL) 授權的開源項目。
相對於傳統的版本控制,具有如下優點:
更輕松的管理。傳統的版本控制系統使用集中式的repOSItory,一些和repository相關的管理就只能由管理員一個人進行。由於采用了分布式的模型,Mercurial 中就沒有這樣的困擾,每個用戶管理自己的repository,管理員只需協調同步這些repository。
更健壯的系統。分布式系統比集中式的單服務器系統更健壯,單服務器系統一旦服務器出現問題整個系統就不能運行了,分布式系統通常不會因為一兩個節點而受到影響。
對網絡的依賴性更低。由於同步可以放在任意時刻進行,Mercurial 甚至可以離線進行管理,只需在有網絡連接時同步。
簡單易學、易於使用;輕量級,運行快速;可擴展性,易於根據用戶需求自行定義、擴展。
Monotone(開源分布式)
Monotone是一個免費的分布式版本管理系統。提供了簡單的文件事務版本存儲,可離線操作,高效的點對點同步協議,支持歷史版本敏感的合並操作、輕量級分支處理以及集成代碼評審和第三方測試工具。使用加密的版本命令方式和客戶端 RSA 認證,很好的支持國際化,不依賴第三方工具,支持跨平台。 可運行在Linux,Solaris,Mac OSX,Windows和其他Unixes上,遵循GPL協議。
5.SVN和GIT的區別
(1)SVN
SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,相較於RCS、CVS,它采用了分支管理系統,它的設計目標就是取代CVS。互聯網上很多版本控制服務已從CVS遷移到Subversion。說得簡單一點SVN就是用於多個人共同開發同一個項目,共用資源的目的。
(2)GIT
git是一款免費、開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的項目。
Git是一個開源的分布式版本控制系統,可以有效、高速的處理從很小到非常大的項目版本管理。[2] Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。
(3) 區別
1.GIT是分布式的,SVN不是:
這是GIT和其它非分布式的版本控制系統,例如SVN,CVS等,最核心的區別。如果你能理解這個概念,那么你就已經上手一半了。需要做一點聲明,GIT並不是目前第一個或唯一的分布式版本控制系統。還有一些系統,例如Bitkeeper, Mercurial等,也是運行在分布式模式上的。但GIT在這方面做的更好,而且有更多強大的功能特征。
GIT跟SVN一樣有自己的集中式版本庫或服務器。但,GIT更傾向於被使用於分布式模式,也就是每個開發人員從中心版本庫/服務器上chect out代碼后會在自己的機器上克隆一個自己的版本庫。可以這樣說,如果你被困在一個不能連接網絡的地方時,就像在飛機上,地下室,電梯里等,你仍然能夠提交文件,查看歷史版本記錄,創建項目分支,等。對一些人來說,這好像沒多大用處,但當你突然遇到沒有網絡的環境時,這個將解決你的大麻煩。
同樣,這種分布式的操作模式對於開源軟件社區的開發來說也是個巨大的恩賜,你不必再像以前那樣做出補丁包,通過email方式發送出去,你只需要創建一個分支,向項目團隊發送一個推請求。這能讓你的代碼保持最新,而且不會在傳輸過程中丟失。GitHub.com就是一個這樣的優秀案例。
有些謠言傳出來說subversion將來的版本也會基於分布式模式。但至少目前還看不出來。
2.GIT把內容按元數據方式存儲,而SVN是按文件:
所有的資源控制系統都是把文件的元信息隱藏在一個類似.svn,.cvs等的文件夾里。如果你把.git目錄的體積大小跟.svn比較,你會發現它們差距很大。因為,.git目錄是處於你的機器上的一個克隆版的版本庫,它擁有中心版本庫上所有的東西,例如標簽,分支,版本記錄等。
3.GIT分支和SVN的分支不同:
分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。如果你想知道是否合並了一個分支,你需要手工運行像這樣的命令svn propget svn:mergeinfo,來確認代碼是否被合並。感謝Ben同學指出這個特征。所以,經常會發生有些分支被遺漏的情況。
然而,處理GIT的分支卻是相當的簡單和有趣。你可以從同一個工作目錄下快速的在幾個分支間切換。你很容易發現未被合並的分支,你能簡單而快捷的合並這些文件。
4.GIT沒有一個全局的版本號,而SVN有:
目前為止這是跟SVN相比GIT缺少的最大的一個特征。你也知道,SVN的版本號實際是任何一個相應時間的源代碼快照。我認為它是從CVS進化到SVN的最大的一個突破。因為GIT和SVN從概念上就不同,我不知道GIT里是什么特征與之對應。如果你有任何的線索,請在評論里奉獻出來與大家共享。
更新:有些讀者指出,我們可以使用GIT的SHA-1來唯一的標識一個代碼快照。這個並不能完全的代替SVN里容易閱讀的數字版本號。但,用途應該是相同的。
5.GIT的內容完整性要優於SVN:
GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。