Elliotte Rusty Harold 介紹了 Subversion —— 一種開(kāi)放源碼、多用戶版本控制系統(tǒng),支持非 ASCII 文本和二進(jìn)制數(shù)據(jù)。通過(guò) Elliotte 的介紹,您可看到如何在 Eclipse 中配置 Subversion 支持(通過(guò) Subclipse 插件)、檢出一個(gè)項(xiàng)目、與您的存儲(chǔ)庫(kù)同步,隨后執(zhí)行一些常用的操作,如合并、修補(bǔ)、比較和刪除。
版本控制之于程序員,好比安全網(wǎng)之于高空秋千表演者。知道安全網(wǎng)在那里,萬(wàn)一自己摔落它能夠提供保護(hù),高空秋千表演者才能放心大膽地在空中飛躍。同樣,版本控制使您有能力去冒以往想都不敢想的風(fēng)險(xiǎn)。如果哪兒出了錯(cuò),您總是可以使自己的代碼回復(fù)到一個(gè)已知的、工作正常的版本。您可以在不觸及主干的分支中進(jìn)行試驗(yàn),而不會(huì)影響到其他小組成員。在已經(jīng)發(fā)布的產(chǎn)品的較老版本中發(fā)現(xiàn) bug 時(shí),您可以輕松檢出特定版本,以確認(rèn)、修訂,并生成該 bug 的修補(bǔ)程序。如果沒(méi)有版本控制,您必須極為慎之又慎,緩慢地推進(jìn),總而言之,生產(chǎn)力會(huì)更低。
Subversion 是一種開(kāi)放源碼的全新版本控制系統(tǒng),支持可在本地訪問(wèn)或通過(guò)網(wǎng)絡(luò)訪問(wèn)的數(shù)據(jù)庫(kù)和文件系統(tǒng)存儲(chǔ)庫(kù)。不但提供了常見(jiàn)的比較、修補(bǔ)、標(biāo)記、提交、回復(fù)和分支功能性,Subversion 還增加了追蹤移動(dòng)和刪除的能力。此外,它支持非 ASCII 文本和二進(jìn)制數(shù)據(jù),所有這一切都使 Subversion 不僅對(duì)傳統(tǒng)的編程任務(wù)非常有用,同時(shí)也適于 Web 開(kāi)發(fā)、圖書創(chuàng)作和其他在傳統(tǒng)方式下未采納版本控制功能的領(lǐng)域。
本文介紹了使用 Subversion 追蹤項(xiàng)目的基礎(chǔ)知識(shí),以使您在編寫代碼時(shí)能夠承受更多的風(fēng)險(xiǎn)、享受更多的樂(lè)趣。
版本控制簡(jiǎn)史
當(dāng)我還是一名剛剛畢業(yè)的學(xué)生時(shí),我第一次在太陽(yáng)觀察站(National SSolar Observatory)接觸到了如今版本控制系統(tǒng)的鼻祖 —— SCCS。,已經(jīng)出現(xiàn)了數(shù)不勝數(shù)的版本控制系統(tǒng),而 SCCS 也早已被更強(qiáng)大的產(chǎn)品所取代,如 Visual SourceSafe、BitKeeper、Perforce 和開(kāi)源 CVS(參見(jiàn) 參考資料 部分)。
在開(kāi)放源碼程序員間,CVS 已成為一種事實(shí)上的 標(biāo)準(zhǔn)。Codehaus、Sourceforge、Savannah 和 Java™ 社區(qū)的 java.net 等站點(diǎn)中駐留的免費(fèi) CVS 使得為開(kāi)源項(xiàng)目建設(shè)存儲(chǔ)庫(kù)更為簡(jiǎn)單。以 CVS 為中心,已發(fā)展起一個(gè)大型的附件市場(chǎng),包括 TortoiseCVS、ViewCVS 和 Fisheye 等工具。
與其他版本控制系統(tǒng)相比,CVS 令人稱道的地方是其非鎖定 存儲(chǔ)庫(kù),這使多個(gè)開(kāi)發(fā)人員能夠同時(shí)檢出同一個(gè)文件。CVS 在提交時(shí)解決沖突問(wèn)題,這避免了沖突成為發(fā)展的瓶頸。CVS 第二個(gè)出色的特性是它是一種網(wǎng)絡(luò)存儲(chǔ)庫(kù)。處于許多不同系統(tǒng)上的程序員可以通過(guò)公共的 Internet 訪問(wèn)相同的存儲(chǔ)庫(kù)。
逐漸失去優(yōu)勢(shì)的 CVS
CVS 在過(guò)去的十年中,為社區(qū)提供了優(yōu)質(zhì)的服務(wù),但它陳舊的劣勢(shì)開(kāi)始體現(xiàn)出來(lái)。首先,它實(shí)際上僅能處理 ASCII 文件。Unicode 文件會(huì)令 CVS 嚴(yán)重混亂。此外,CVS 存儲(chǔ)庫(kù)更改起來(lái)極為困難。CVS 沒(méi)有任何關(guān)于 “移動(dòng)” 操作的概念。它只能注意到,一個(gè)文件在一處被刪除了,而在一個(gè)新位置創(chuàng)建了另外一個(gè)文件。由于它不會(huì)連接兩個(gè)操作,因此也很容易使文件歷史軌跡丟失。設(shè)置 CVS 存儲(chǔ)庫(kù)時(shí),您必須非常謹(jǐn)慎地為每個(gè)文件選擇準(zhǔn)確的位置,因?yàn)樵谠O(shè)置之后,您幾乎要一直使用這個(gè)位置了。
CVS 已經(jīng)不再適合現(xiàn)代開(kāi)發(fā),這一點(diǎn)越來(lái)越明顯。特別是 CVS 只能滿足老式 C 程序員的 ASCII 需求,而對(duì) Web 開(kāi)發(fā)人員和其他非傳統(tǒng)用戶來(lái)說(shuō),CVS 實(shí)際上根本不起作用。在您開(kāi)始考慮存儲(chǔ)整個(gè) Web 站點(diǎn)時(shí),在 CVS 中,將文件從一個(gè)目錄移動(dòng)到另外一個(gè)目錄是關(guān)鍵考慮事項(xiàng)。因此,在幾年前,許多核心 CVS 開(kāi)發(fā)人員認(rèn)為,已經(jīng)到了利用他們多年來(lái)使用 CVS 時(shí)學(xué)到的經(jīng)驗(yàn)和教訓(xùn)、從頭開(kāi)始創(chuàng)建新一代開(kāi)放源碼存儲(chǔ)庫(kù)的時(shí)機(jī)。在 2004 年年初,他們的努力結(jié)出了豐碩的果實(shí),那是 Subversion 1.0。
Subversion 的支持與采納
程序員(特別是那些依賴版本控制的程序員)是一個(gè)非常謹(jǐn)慎的群體,Subversion 著實(shí)用了很長(zhǎng)一段時(shí)間,才得到他們的廣泛接受。很少有程序員愿意沖在易于流血的前沿,即便是他們已經(jīng)因?yàn)?CVS 受了傷。甚至是在 Subersion 變得可靠之后,仍然用了好幾年的時(shí)間,所有第三方編輯器、IDE 和文檔規(guī)范才相繼跟進(jìn)。而 Subversion 依然在不斷改進(jìn),BBEdit 和 Eclipse 等第三方工具現(xiàn)在已經(jīng)有了足夠好的 Subversion 支持。逐漸地,新項(xiàng)目也紛紛選擇 Subversion 滿足其版本控制需求,而老項(xiàng)目正在向 Subversion 移植。近,Apache Software Foundation 已移植到 Subversion。已實(shí)現(xiàn)移植的項(xiàng)目包括 Xerces XML 解析器、Apache HTTP Server 和 Spamassassin。
通過(guò) IDE 使用 Subversion
您可通過(guò)命令行使用 Subversion,但若將其與您的 IDE 集成更為便捷。IntelliJ IDEA 5.0 及后續(xù)版本均包含對(duì) Subversion 的內(nèi)置支持。NetBeans 還不支持 Subversion,但相關(guān)工作已經(jīng)在開(kāi)展,未來(lái)版本中將提供支持。對(duì)于 Eclipse,您需要安裝 Subclipse 插件。本文使用 Eclipse 作為 IDE。
Subclipse 的安裝與其他 Eclipse 插件類似:
在 Eclipse 中,選擇 Help Software Updates | Find and Install...。
在向?qū)У牡谝粋(gè)面板中,單擊 Search for new features to install 單選按鈕,并單擊 Next。
在向?qū)У牡诙䝼(gè)面板中,單擊 New Remote Site。輸入 Subclipse 作為名稱,輸入 http://subclipse.tigris.org/update_1.0.x 作為 URL。然后單擊 Finish。
這將啟動(dòng)另外一個(gè)小的向?qū)。下一個(gè)對(duì)話框應(yīng)為您提供一個(gè)可安裝的特性 —— Subclipse。選中它并單擊 Next。
接受許可協(xié)議,完成安裝。
程序包目前未經(jīng)過(guò)數(shù)字簽名,但只要您是按照第三步的 URL 下載的,是安全的。