2006 年 11 月 06 日 版 本控制系統(tǒng)或資源管理系統(tǒng)是現(xiàn)代軟件開發(fā)的一個(gè)重要方面。不使用版本控制系統(tǒng)就如同超速駕駛一輛汽車:很刺激,也可能會(huì)更快抵達(dá)目的地,但事故卻在所難 免。本文概述了軟件配置管理(SCM)系統(tǒng)及其優(yōu)勢(shì),內(nèi)容涵蓋 CVS、Subversion、Arch 和 Git。本文還討論了最常見的 SCM 體系結(jié)構(gòu)。本文在最后給出了新出現(xiàn)的一些方法及這些方法與先前方法的區(qū)別。 在學(xué)校學(xué)習(xí)的重要工具中,通常不會(huì) 包含 SCM。軟件(或資源)控制,正如其名字所暗示的那樣,是一種工具和一種相關(guān)的過程,而這種過程被用于維護(hù)源代碼及其演進(jìn)。SCM 提供的主要功能如下:
所以,SCM 允許您控制存儲(chǔ)庫中的一組文件并跟蹤這些文件的修訂。其他開發(fā)人員更改了存儲(chǔ)庫中的這些文件后,SCM 會(huì)標(biāo)識(shí)出這些變更與您所做的變更之間存在的沖突,然后自動(dòng)將其合并或通知您存在沖突。這個(gè)功能非常重要,因?yàn)樗试S多個(gè)開發(fā)人員修改同一組文件。SCM 還能跟蹤出誰做了何種變更。SCM 還允許您將文件按邏輯劃分為相關(guān)的文件組,比如組成軟件圖像或可執(zhí)行文件的源文件。 在深入研究 SCM 體系結(jié)構(gòu)的類型和細(xì)節(jié)之前,先要熟悉一下術(shù)語的含義。存儲(chǔ)庫 是文件存儲(chǔ)和管理的中心位置(有時(shí)又被稱為樹)。從存儲(chǔ)庫中取出文件放到本地系統(tǒng)的工作文件夾的過程被稱作簽出。如果變更了本地文件而又想同步變更存儲(chǔ)庫,就需要執(zhí)行更新。如果要將變更后的文件簽入到存儲(chǔ)庫,就需執(zhí)行提交。如果所變更的文件先前已經(jīng)被變更并已由別人提交,則會(huì)發(fā)生合并,表明兩組變更集將會(huì)被合并在一起。若由于變更沖突的原因不能合并時(shí),則必已發(fā)生了沖突。在此情況下,提交被拒絕,并要求開發(fā)人員手工合并變更。當(dāng)提交了變更之后,就會(huì)創(chuàng)建此文件的一個(gè)新的修訂。 一個(gè)或多個(gè)開發(fā)人員可以對(duì)主樹(存儲(chǔ)庫的當(dāng)前頭)或位于主樹旁的單個(gè)的分支進(jìn)行操作。這就讓開發(fā)人員可以操作分支而不會(huì)影響到主樹。當(dāng)分支穩(wěn)定后,再將分支與主樹進(jìn)行合并。 要標(biāo)記源樹演進(jìn)過程中的重要階段,可以對(duì)一組文件修訂應(yīng)用標(biāo)簽。這會(huì)將這組文件組合成一個(gè)有用的集合(有時(shí)會(huì)用作針對(duì)于惟一構(gòu)建的文件的一個(gè)發(fā)布)。
各種 SCM 間有許多的差異,其中有兩種最基本的區(qū)別很值得研究:
現(xiàn)代 SCM 體系結(jié)構(gòu)的最為重要的差異之一是存儲(chǔ)庫是集中式的還是分布式(分散的)。當(dāng)前最為常見的體系結(jié)構(gòu)是集中式存儲(chǔ)庫。這個(gè)星型 體系結(jié)構(gòu)由中心的源存儲(chǔ)庫和工作于這個(gè)存儲(chǔ)庫的多個(gè)開發(fā)人員組成(參見圖 1)。開發(fā)人員從中心存儲(chǔ)庫簽出源代碼到本地的沙箱內(nèi),進(jìn)行變更后,將它提交回中心存儲(chǔ)庫。其他開發(fā)人員就可以再訪問這些變更。 圖 1. 在集中式體系結(jié)構(gòu)中,所有開發(fā)人員都通過同一個(gè)中心存儲(chǔ)庫進(jìn)行工作 ![]() 中心存儲(chǔ)庫也可以創(chuàng)建分支,允許多個(gè)開發(fā)人員協(xié)作于針對(duì)位于存儲(chǔ)庫(但必須在 mainline 或 tip 之外)的資源的一組變更。 分布式體系結(jié)構(gòu)則允許開發(fā)人員為其變更創(chuàng)建其自己本地的存儲(chǔ)庫。本地開發(fā)人員的存儲(chǔ)庫與原始的存儲(chǔ)庫(已被分布)很相似。主要的區(qū)別是:在集中化的 方式中,變更是在沙箱內(nèi)完成的,而在分布式方法中則允許開發(fā)人員工作于分離的存儲(chǔ)庫。開發(fā)人員進(jìn)行變更、提交變更到其本地的存儲(chǔ)庫,之后,在不影響主干的 前提下,與其他開發(fā)人員的變更合并。這樣,本地開發(fā)人員就使得變更集對(duì)上線(upline)開發(fā)人員可用(參見圖 2)。 圖 2. 在分散體系結(jié)構(gòu)中,開發(fā)人員通過其各自的存儲(chǔ)庫員同步工作 ![]() 分散體系結(jié)構(gòu)很有意思,因?yàn)樗试S不同的開發(fā)人員在對(duì)等網(wǎng)絡(luò)內(nèi)同步工作。當(dāng)工作準(zhǔn)備好(最好是穩(wěn)定)后,開發(fā)人員可以分發(fā)變更集(或修補(bǔ))以使他人也可以使用這些特性。這是當(dāng)今許多開源系統(tǒng)的模型,包括 Linux? 內(nèi)核。 早先的和現(xiàn)代的 SCM 的體系結(jié)構(gòu)的另一個(gè)有趣的區(qū)別是 delta 變更的存儲(chǔ)方式。它們理論上是相同的,且產(chǎn)生的結(jié)果也相同,但在修訂的存儲(chǔ)方式上二者卻大不相同。 在快照模型中,整個(gè)存儲(chǔ)庫的每個(gè)修訂(帶優(yōu)化以減少樹的大?。┑娜课募急淮鎯?chǔ)。而在變更集模型中,只有 delta 被存儲(chǔ)于修訂之間,這樣就創(chuàng)建了一個(gè)精簡的存儲(chǔ)庫(參見圖 3)。 圖 3. 快照模型和變更集模型各有所長 ![]() 從圖 3 可以看出,模型不同但結(jié)果卻相同。在快照模型中,可以快速獲得修訂,但需要更多的空間來存儲(chǔ)它們。而變更集模型需要的空間少,但需要更多時(shí)間來獲得某個(gè)修 訂,原因是 delta 必須應(yīng)用于基本修訂。在本文后面的部分將介紹如何建立優(yōu)化來最小化必須要應(yīng)用的 delta 的數(shù)量。
讓我們來看一下按體系結(jié)構(gòu)(集中或分布)劃分的一些 SCM。您很快就會(huì)看到,其中一些 SCM 支持兩種模型。 并發(fā)版本系統(tǒng)(Concurrent Versions System,CVS)是當(dāng)今最為常用的 SCM。它是一種集中式的解決方案,采用了快照模型,開發(fā)人員使用集中式的存儲(chǔ)庫來進(jìn)行軟件的協(xié)作開發(fā)。CVS 十分常見而且是 Linux 發(fā)布版的一部分。其簡單和方便的語法(對(duì)大多數(shù)人而言)使其迅速成為了多個(gè)或單個(gè)開發(fā)人員 SCM 的一種理想選擇。 清單 1 給出了一組 CVS 命令示例和簡短的相關(guān)描述。要獲得關(guān)于 CVS 的更多信息,請(qǐng)參閱 參考資料 部分。 清單 1. CVS 命令示例
對(duì)于喜歡用指向-單擊方式操作的用戶,CVS 提供了許多開源的圖形化前端以供使用,包括 WinCVS 和 TortoiseCVS(集成了 Microsoft? Windows Explorer)。 盡管 CVS 被廣泛采用,但它仍然有一些不足之處。CVS 不允許重命名文件,而且對(duì)一些特殊文件(如 symlink)的支持不是很好。變更可以按文件跟蹤,而非按變更本身,這點(diǎn)十分討厭。合并有時(shí)也會(huì)出現(xiàn)問題(CVS 內(nèi)部會(huì)為此使用 diff3)。 然而,CVS 總體而言還是很有用的,能夠?qū)崿F(xiàn)其需要實(shí)現(xiàn)的任務(wù),而且所有主流的平臺(tái)都支持 CVS。如果喜歡用 CVS 而又想回避其缺點(diǎn),則可以考慮使用 Subversion。 Subversion(SVN)是為了替代 CVS 而設(shè)計(jì)的,消除了 CVS 原有的問題和缺點(diǎn)。與 CVS 一樣,Subversion 也是一種集中化的解決方案,采用的是快照模型。它的命令也模仿了 CVS 的,但增加了一些對(duì)諸如刪除文件、重命名文件或恢復(fù)為原始文件等的處理功能。 Subversion 還允許遠(yuǎn)程訪問,可以采用很多協(xié)議,比如超文本傳輸協(xié)議 (HTTP)、安全 HTTP或定制的 SVN 協(xié)議,此協(xié)議還支持通過 Secure Shell (SSH)的隧道技術(shù)。 清單 2 給出了 Subversion 所支持的一些命令及 CVS 中所沒有的一些擴(kuò)展。要獲得關(guān)于 Subversion 的更多信息,請(qǐng)參閱 參考資料 部分。很明顯,Subversion 的命令集和 CVS 的很相似,這使它極受 CVS 用戶的歡迎。 清單 2. Subversion 的命令示例
與 CVS 一樣,Subversion 集成了一些圖形化的前端如 ViewCVS 和 TortoiseSVN。另外也有一些工具可以把 CVS 存儲(chǔ)庫轉(zhuǎn)化為 Subversion(例如 cvs2svn.py),但這些工具并不能處理復(fù)雜版本的分支和標(biāo)記。和許多開源項(xiàng)目一樣,隨著時(shí)間的推移,這種情況會(huì)有所改變。Subversion 還集成了 TortoiseMerge 作為一個(gè)單獨(dú)的查看器和修補(bǔ)程序。 Subversion 解決了許多讓 CVS 用戶困擾的問題,比如特殊文件的版本化和自動(dòng)的提交和簽出。如果您喜歡用 CVS 和集中式存儲(chǔ)庫的方式,那么 Subversion 就是您所需的 SCM。 現(xiàn)在讓我們先放下對(duì)集中方式的討論,看看被人們視為 SCM 未來的協(xié)作式分散存儲(chǔ)庫。 Arch 是分散 SCM 的規(guī)范,它提供許多不同的實(shí)現(xiàn),包括 ArX、Bazaar、GNU arch 和 Larch。Arch 不僅可以作為一種分散 SCM 運(yùn)作,如 圖 2 所示,還可使用變更集模型(參見 圖 3)。 Arch SCM 是開源開發(fā)的一種很流行的方法,因?yàn)殚_發(fā)人員可在單獨(dú)的存儲(chǔ)庫上進(jìn)行開發(fā),同時(shí)又能夠控制全部資源。這是因?yàn)榉植际酱鎯?chǔ)庫就是具有修訂控制的實(shí)際存儲(chǔ)庫。 可以在本地存儲(chǔ)庫利用變更創(chuàng)建一個(gè)修補(bǔ)來供上游的開發(fā)人員使用。這就是分散模型的真正的強(qiáng)勢(shì)所在。 與 Subversion 相似,Arch 解決了 CVS 中所存在的許多問題,包括元數(shù)據(jù)的變更,例如修訂文件許可、處理文件刪除和重命名以及自動(dòng)的簽入(將簽入組在一起而非作為單獨(dú)的文件)。 清單 3 中顯示了 Arch SCM 中的一些常見命令,還給出了 GNU arch,因?yàn)樗怯?Arch 的 設(shè)計(jì)者 Tom Lord 開發(fā)的。GNU arch 提供了 SCM 應(yīng)有的一些基本功能,包括 Subversion 中的一些新特性。 清單 3. GNU arch (tla) 的命令示例
Arch 還允許用 Arch 的優(yōu)勢(shì)之一是雖然它是為分散操作所設(shè)計(jì)的,但也可以用于集中存儲(chǔ)庫范例。
現(xiàn)在讓我們來看一下最后一個(gè)分散式的 SCM,它由 Linux 內(nèi)核的維護(hù)者 Linus Torvalds 本人編寫。 Git SCM 由 Linus Torvalds 開發(fā),用來替代 Bitkeeper SCM(參閱 參考資料 部分)。 它非常簡單,是一種分散式的基于變更集的 SCM 且用作 Linux 內(nèi)核的 SCM。它使用文件組模型而非跟蹤單個(gè)的文件。使用 SHA1 壓縮并混編變更集以驗(yàn)證其完整性(參見清單 4)。 清單 4. Git 的命令示例
Git SCM 在其自己的 Git 存儲(chǔ)庫內(nèi)是自托管的,這意味著您必須引導(dǎo) Git 來將其安裝到本機(jī)。Git 的命令集與您到目前為止看到的那些命令十分類似,而且相對(duì)簡單。 您可能會(huì)問:“為什么不使用現(xiàn)有的 SCM 中的一種呢?” 問得很好。 Git 非常有趣,吸引著許多 Linux 內(nèi)核黑客,所以它很可能成為下一個(gè)主流的 SCM。Linus 將 Git 描述為一個(gè)高速的目錄內(nèi)容管理器,雖然它所做的工作不多但完成得十分高效。
無論您使用何種 SCM,都會(huì)獲得一些普遍的收益。使用 SCM,可以跟蹤文件中的變更來判斷變更對(duì)軟件的影響程度。當(dāng)發(fā)生不正確的變更時(shí),可以發(fā)現(xiàn)這些變更并將它們恢復(fù)回原始資源中??梢越M合文件修訂集并標(biāo)記 它們來制作發(fā)布,而發(fā)布又可以在任何時(shí)間簽出以供重復(fù)構(gòu)建代碼的特定發(fā)布(SCM 的要求)。 不管使用集中式存儲(chǔ)庫還是分布式存儲(chǔ)庫,使用快照模型還是變更集模型,所帶來的收益都是相同的。因?yàn)槿魏维F(xiàn)代軟件開發(fā)項(xiàng)目都必須要有 SCM,所以越早越多地使用它們就會(huì)受益越多。
本文只討論了現(xiàn)在最為常用的 SCM 的一些最基礎(chǔ)的知識(shí)。還有許多其他的開源 SCM 可以使用,例如 Aegis、Bazaar-NG、DARCS 和 Monotone。當(dāng)然,SCM 也引起了一些爭論,而這些爭論通常很難有正確的答案。如果使用一種工具后效率極高,那就使用這種工具吧!SCM 大多時(shí)候都用在團(tuán)隊(duì)開發(fā)的情況下,而很少用于孤立的個(gè)人開發(fā)的環(huán)境中(除非您是個(gè)獨(dú)斷專行的老板,喜歡自己做所有決定)。所以,您盡可以嘗試所有的可能性 來熟悉一些不同的風(fēng)格。SCM 是軟件開發(fā)中的必需工具,也是您的開發(fā)工具箱中的必備部分。 學(xué)習(xí)
|
聯(lián)系客服