天天看點

版本控制一(序言)

什麼是版本控制?

版本控制(Revision Control)是維護工程藍圖的标準做法,能追蹤工程藍圖從誕生一直到定案的過程.是一種記錄若幹檔案内容變化,以便将來查閱特定版本修訂情況的系統.

因為版本控制并不是從軟體行業發展而來的,最初是運用在各種工程管理上,後來有了軟體工程,也引入了版本控制.

版本控制能夠解決什麼問題?

隻要參與過2個人以上的軟體項目開發,不管是在工作中,還是在大學的項目中,就應該遇到過問題.比如大家先是劃分好各自的工作,也許有一些約定,但是一些公共的方法或類可能就被成員寫了很多次,而且每個都不一樣,這樣在代碼上就會有沖突,容易引發BUG.而且想恢複到之前的版本隻能copy、paste,不友善,而且還要經常這麼做.釋出項目時也困難重重:

版本控制一(序言)

是以總結之後,沒有版本控制的項目有如下難處:

代碼管理混亂

備份多個版本,占用磁盤空間大

解決代碼沖突困難

容易引發BUG

難于追溯問題代碼的修改人和修改時間

難于恢複至以前正确版本

無法進行權限控制

項目版本釋出困難

SVN

SVN(Subversion)是一種開放源碼的全新版本控制系統,是新一代的版本控制工具,由于其優于CVS的一些特點,得到了越來越多人的關注和使用,支援可在本地通路或通過網絡通路的資料庫和檔案系統存儲庫.不但提供了常見的比較、修補、标記、送出、恢複和分支等功能,而且Subversion 還增加了追蹤移動和删除的能力.此外,它支援非ASCII 文本和二進制資料,所有這一切都使Subversion不僅對傳統的程式設計任務非常有用,同時也适于Web開發、圖書創作和其他在傳統方式下未采納版本控制功能的領域.Subversion是近年來崛起的版本管理工具,在目前的開源項目裡(JavaEE),幾乎95%以上的項目都用到了SVN.Subversion項目的初衷是為了替換當年開源社群最為流行的版本控制軟體CVS,在CVS的功能的基礎上有很多的提升,同時也能較好的解決CVS系統的一些不足.

工作流程圖:

版本控制一(序言)

從該圖可以看出SVN分為三部分:用戶端、伺服器和資料倉庫.用戶端又分為指令行和圖形使用者界面兩種,SVN安裝完預設隻有指令行.GUI隻是對指令行功能的一種封裝;伺服器的通路方式有三種,主要是兩種:mod_dav_svn和svnserve.mod_dav_svn是借助Apache的方式進行通路,svnserve是SVN内置的獨立伺服器;SVN支援兩種資料倉庫:資料庫和檔案系統.使用檔案系統是推薦方式.以下是SVN對工程的管理方式:

版本控制一(序言)

這種方案被稱為拷貝-修改-合并,是Subversion、CVS和一些版本控制系統共同使用的模型,在這種模型裡,每一個客戶聯系項目版本庫建立一個個人工作拷貝和到版本庫中檔案和目錄的本地映射.使用者并行工作,修改各自的工作拷貝,最終各個私有的拷貝合并在一起,成為最終的版本,這種系統通常可以輔助合并操作,但是最終要靠人工去确定正誤.拷貝-修改-合并模型感覺有一點混亂,但在實踐中,通常運作的很平穩,使用者可以并行的工作,不必等待别人,當工作在同一個檔案上時,也很少會有交疊發生,沖突并不頻繁,處理沖突的時間遠比等待解鎖花費的時間少.最後,一切都要歸結到一條重要的因素:使用者交流.當使用者交流貧乏,文法和語義的沖突就會增加,沒有系統可以強制使用者完美的交流,沒有系統可以檢測語義上的沖突,是以沒有任何證據能夠承諾鎖定系統可以防止沖突,實踐中,鎖定除了限制了生産力,并沒有做什麼事.拷貝-修改-合并有一個很緻命的缺點,就是對那些無法合并的二進制檔案管理起來困難,是以,Subversion也提供了鎖定-修改-解鎖的方案,用來更好的管理二進制檔案.是以,我們采取混合版本控制方案,即,對源代碼的純文字文檔實行拷貝-修改-合并的方案,對二進制檔案,如dll、圖書等采用鎖定-修改-解鎖的方案.也就是通過autoprops.reg中的資訊,來告訴Subversion怎麼去管理這些檔案.

以下是采用鎖定-修改-解鎖方案的vss工作流程:

版本控制一(序言)

可以看出這種模型的效率并不高,在一個時間段裡版本庫的一個檔案隻允許被一個人修改.但是它也有優點:能非常好的保證版本庫中所有檔案的一緻性,能避免大部分的沖突.但鎖定-修改-解鎖模型有一點問題就是限制太多,經常會成為使用者的障礙,比如:

鎖定可能導緻管理問題

鎖定可能導緻不必要的線性化開發

鎖定可能導緻錯誤的安全狀态

如果萬一被某個人鎖住,然後離開,半天不回來,那項目組的其他人就可以放假了.當然這種情況基本上不會發生.

SVN需要與人互動,來擷取伺服器的最新檔案,或者更新伺服器版本庫的檔案,流程圖如下:

版本控制一(序言)

上圖也基本列出了必然使用的方法,SVN工作的基本思路是這樣的:在一台伺服器上建立一個倉庫,倉庫裡可以存放許多不同項目的源程式.由倉庫管理者統一管理這些源程式,這樣,就好像一個人在修改檔案一樣.避免了沖突,每個使用者在使用倉庫之前,首先要把倉庫的項目檔案下載下傳到本地.使用者做的任何修改首先都是在本地進行,然後用SVN指令進行送出,由SVN倉庫管理者統一修改,這樣就可以做到跟蹤檔案變化、沖突控制等等.

如果本文有任何問題,請及時指出,以免對後來者産生不必要的困擾,不勝感激!