必威电竞|足球世界杯竞猜平台

subversion
來源:互聯(lián)網(wǎng)

Subversion是一個(gè)自由開源的版本控制系統(tǒng)。在Subversion管理下,文件和目錄可以超越時(shí)空。Subversion將文件存放在中心版本庫里,這個(gè)版本庫很像一個(gè)普通的文件服務(wù)器,不同的是,它可以記錄每一次文件和目錄的修改情況,這樣就可以借此將FinalData到以前的版本,并可以查看數(shù)據(jù)的更改細(xì)節(jié)。正因?yàn)槿绱?,許多人將版本控制系統(tǒng)當(dāng)作一種神奇的“時(shí)間機(jī)器”。

簡介

Subversion(簡稱SVN)是近年來崛起的版本管理軟件系統(tǒng),是CVS的接班人。目前,絕大多數(shù)開源軟件都使用SVN作為代碼版本管理軟件。

Subversion是一個(gè)版本控制系統(tǒng),相對于的RCS、CVS,采用了分支管理系統(tǒng),它的設(shè)計(jì)目標(biāo)就是取代CVS?;ヂ?lián)網(wǎng)上免費(fèi)的版本控制服務(wù)多基于Subversion。

Subversion的版本庫可以通過網(wǎng)絡(luò)訪問,從而使用戶可以在不同的電腦上進(jìn)行操作。從某種程度上來說,允許用戶在各自的空間里修改和管理同一組數(shù)據(jù)可以促進(jìn)團(tuán)隊(duì)協(xié)作。因?yàn)樾薷牟辉偈菃尉€進(jìn)行(單線進(jìn)行也就是必須一個(gè)一個(gè)進(jìn)行),開發(fā)進(jìn)度會進(jìn)展迅速。此外,由于所有的工作都已版本化,也就不必?fù)?dān)心由于錯(cuò)誤的更改而影響軟件質(zhì)量—如果出現(xiàn)不正確的更改,只要撤銷那一次更改操作即可。某些版本控制系統(tǒng)本身也是軟件配置管理系統(tǒng)(scm),這種系統(tǒng)經(jīng)過精巧的設(shè)計(jì),專門用來管理源代碼樹,并且具備許多與軟件開發(fā)有關(guān)的特性——比如對編程語言的支持或者提供程序構(gòu)建工具。不過Subversion并不是這樣的系統(tǒng),它是一個(gè)通用系統(tǒng),可以管理任何類型的文件集。

歷史

早在2000年,CollabNet就開始尋找CVS替代產(chǎn)品的開發(fā)人員。CollabNet提供了一個(gè)名為CollabNet企業(yè)版(CEE)的協(xié)作軟件套件。這個(gè)軟件套件的一個(gè)組成部分就是版本控制系統(tǒng)。盡管CEE在最初采用了CVS作為其版本控制系統(tǒng),但是CVS的局限性從一開始就很明顯,CollabNet知道遲早要找到一個(gè)更好的替代品。遺憾的是,CVS已經(jīng)成為開源世界事實(shí)上的標(biāo)準(zhǔn),很大程度上是因?yàn)闆]有更好的替代品,至少是沒有可以自由使用的替代品,所以CollabNet決定從頭編寫一個(gè)新的版本控制系統(tǒng),這個(gè)系統(tǒng)保留CVS的基本思想,但是要修正其中錯(cuò)誤和不合理的特性。

2000年2月,他們聯(lián)系到OpenSource Development with CVS(Coriolis,1999)的作者Karl Fogel,并且詢問他是否希望為這個(gè)新項(xiàng)目工作。巧合的是,當(dāng)時(shí)Karl正在與朋友Jim Blandy討論設(shè)計(jì)一個(gè)新的版本控制系統(tǒng),1995年時(shí),他們兩人曾經(jīng)開辦了一個(gè)提供CVS支持的公司CyclicSoftware,盡管他們最終賣掉了公司,但還是天天使用CVS進(jìn)行日常工作。使用CVS時(shí)的挫折促使Jim認(rèn)真的思考如何管理版本化的數(shù)據(jù),并且他當(dāng)時(shí)不僅使用了“Subversion”這個(gè)名字,并且已經(jīng)完成了Subversion版本庫的最初設(shè)計(jì),所以當(dāng)CollabNet提出邀請的時(shí)候,Karl馬上同意為這個(gè)項(xiàng)目工作,同時(shí)Jim也找到了他的雇主(Red Hat軟件公司)允許他到這個(gè)項(xiàng)目工作,并且沒有限定最終的期限。CollabNet雇傭了Karl和BenCollinsSussman,詳細(xì)設(shè)計(jì)工作從三月開始,在Behlendorf、CollabNet、JasonRobbins和GregStein(當(dāng)時(shí)是一個(gè)獨(dú)立開發(fā)者,活躍在WebDAV/DeltaV系統(tǒng)規(guī)范制訂工作中)恰到好處的激勵(lì)下,Subversion很快吸引了許多活躍的開發(fā)者,結(jié)果是許多對CVS有過失望經(jīng)歷的人很樂于為這個(gè)項(xiàng)目做些事情。

最初的設(shè)計(jì)小組設(shè)定了簡單的開發(fā)目標(biāo)。他們不想在版本控制方法學(xué)中開墾處女地,他們只是希望修正CVS。他們決定Subversion應(yīng)符合CVS的特性,并保留相同的開發(fā)模型,但不再重復(fù)CVS的一些顯著缺陷。盡管Subversion并不需要成為CVS的完全替代品,但它應(yīng)該與CVS保持足夠的相似性,以使CVS用戶可以輕松的轉(zhuǎn)移到Subversion上。

經(jīng)過14個(gè)月的編碼,2001年8月31日,Subversion能夠“自己管理自己”了,開發(fā)者停止使用CVS保存Subversion的代碼,而使用Subversion本身。

雖然CollabNet啟動(dòng)了這個(gè)項(xiàng)目,并且一直提供了大量的工作支持(它為一些全職的Subversion開發(fā)者提供薪水),但Subversion像其它許多開源項(xiàng)目一樣,被松散的、透明的規(guī)則管理著,這樣的規(guī)則激勵(lì)著知識界的精英們。CollabNet的版權(quán)許可完全符合Debian的自由軟件方針。也就是說,任何人都可以根據(jù)自己的意愿自由的下載、修改和重新發(fā)布Subversion,不需要CollabNet或其他人的授權(quán)。

功能

·包含絕大部分電腦視疲勞綜合癥的功能

CVS是最基本的版本控制系統(tǒng)。Subversion包含了CVS的大部分功能,并且針對有些功能還稍加改進(jìn)。

·目錄的版本化

Subversion將目錄名以版本號的形式體現(xiàn)。

·基于版本的復(fù)制,刪除和重命名

無論復(fù)制、刪除還是重命名,都會被打上版本號,盡管這聽上去有些奇怪。

·自由的版本化元數(shù)據(jù)操作

Subversion允許任何元數(shù)據(jù)附加在文件或目錄中。這些屬性是鍵/值對,并且被版本化。Subversion也提供對修訂版附加任何鍵/值屬性的方法,這些屬性不會被版本化,因?yàn)樗麄儠詣?dòng)將元數(shù)據(jù)附加到版本空間中,但他們可以隨時(shí)被更改。

·混合追蹤

Subversion 1.5開始加入了混合追蹤功能。

·文件鎖

支持文件鎖定,當(dāng)多個(gè)用戶試圖編輯同一個(gè)文件時(shí)會收到警告。

·Apachenetwork service的支持,基于WebDAV/DeltaV協(xié)議

使用基于HTTP的WebDAV/DeltaV協(xié)議進(jìn)行網(wǎng)絡(luò)通信,而apache網(wǎng)絡(luò)服務(wù)器提供網(wǎng)絡(luò)存儲的站點(diǎn)服務(wù)。

·可執(zhí)行的標(biāo)簽

當(dāng)一個(gè)文件是可執(zhí)行的時(shí)候,Subversion會提示,并且當(dāng)這個(gè)可執(zhí)行的文件被放在版本控制中時(shí),Subversion會防止該程序檢查其他目錄。

·獨(dú)立進(jìn)程模式

Subversion可以運(yùn)行在獨(dú)立模式下

·一個(gè)只讀的存儲鏡像

Subversion提供一個(gè)工具,SVNsync,用于同步主服務(wù)器上的 文件到一個(gè)子存儲服務(wù)器上,并且標(biāo)為只讀的屬性

使用情況

雖然在 2006年 時(shí) Subversion 的使用族群仍然遠(yuǎn)少于傳統(tǒng)的 CVS,但已經(jīng)有許多開放源碼團(tuán)體決定將 CVS 轉(zhuǎn)換為 Subversion。已經(jīng)轉(zhuǎn)換使用 Subversion 的包括了 FreeBSD、apache 軟件 Foundation、KDE、GNOME、GCC、Python、Samba、Mono 以及許多團(tuán)體。許多開發(fā)團(tuán)隊(duì)換用 Subversion 是因?yàn)?Trac、SourceForge、CollabNet、CodeBeamer等專案協(xié)同作業(yè)軟件以及Eclipse、NetBeans等IDE提供 Subversion的資源整合。除此之外,一些自由軟件開發(fā)的協(xié)作網(wǎng)如SourceForge.net除了提供 CVS 外,現(xiàn)在也提供專案開發(fā)者使用 Subversion 作為源碼管理系統(tǒng), JavaForge、谷歌 Code以及 BountySource則以 Subversion 作為官方的源碼管理系統(tǒng)。

2009年,絕大多數(shù)電腦視疲勞綜合癥服務(wù)已經(jīng)改用SVN。CVS已經(jīng)停止維護(hù)。

客戶端

Subversion的客戶端有兩類,一類是WebSVN等基于Web的,一種是以TortoiseSVN為代表的客戶端軟件。前者需要Web服務(wù)器的支持,后者需要用戶在本地安裝客戶端,兩種都有免費(fèi)開源軟件供使用。

服務(wù)器

Subversion支持LinuxWindows,更多是安裝在Linux下。

SVN服務(wù)器有2種運(yùn)行方式:獨(dú)立服務(wù)器和借助Apache。2種方式各有利弊。

SVN存儲版本數(shù)據(jù)也有2種方式:Berkeley DB和FSFS。因?yàn)锽erkeley DB方式在服務(wù)器中斷時(shí),有可能鎖住數(shù)據(jù),所以還是FSFS方式更安全一點(diǎn)。

優(yōu)點(diǎn)

在SVN之前,CVS(Concurrent Version System:協(xié)同版本控制系統(tǒng))是使用最廣泛的版本管理軟件,服務(wù)器上保存所有的開發(fā)項(xiàng)目,開發(fā)者們通過服務(wù)器上的共享目錄,共同開發(fā)同一個(gè)項(xiàng)目,達(dá)到追蹤所有的工作進(jìn)度,而服務(wù)器上也會保存歷史版本信息,以方便開發(fā)者排錯(cuò)。

SVN與電腦視疲勞綜合癥對比的優(yōu)點(diǎn)如下:

* 統(tǒng)一的版本號。CVS是對每個(gè)文件順序編排版本號,在某一時(shí)間各文件的版

本號各不相同。而Subversion下,任何一次提交都會對所有文件增加到同一個(gè)新版本號,即使是提交并不涉及的文件。所以,各文件在某任意時(shí)間的版本號是相同的。版本號相同的文件構(gòu)成軟件的一個(gè)版本。

* 原子提交。一次提交不管是單個(gè)還是多個(gè)文件,都是作為一個(gè)整體提交的。在這當(dāng)中發(fā)生的意外例如傳輸中斷,不會引起數(shù)據(jù)庫的不完整和數(shù)據(jù)損壞。

* 重命名、復(fù)制、刪除文件等動(dòng)作都保存在版本歷史記錄當(dāng)中。

* 對于二進(jìn)制文件,使用了節(jié)省空間的保存方法(簡單的理解,就是只保存和上一版本不同之處)。

* 目錄也有版本歷史。整個(gè)目錄樹可以被移動(dòng)或者復(fù)制,操作很簡單,而且能夠保留全部版本記錄。

* 分支的開銷非常小。

* 優(yōu)化過的數(shù)據(jù)庫訪問,使得一些操作不必訪問數(shù)據(jù)庫就可以做到,這樣減少了很多不必要的和數(shù)據(jù)庫主機(jī)之間的網(wǎng)絡(luò)流量。

不足

只能設(shè)置目錄的訪問權(quán)限,無法設(shè)置單個(gè)文件的訪問權(quán)限。

若用戶有設(shè)置單個(gè)文件的訪問權(quán)限的需求,國內(nèi)有單位可提供基于開源Subversion的擴(kuò)展版本,見參考資料。

另外,Subversion的官方版本不支持NTFS文件系統(tǒng)的擴(kuò)展屬性,NTFS的擴(kuò)充屬性(安全屬性、附加數(shù)據(jù)流(可選數(shù)據(jù)流)、加密數(shù)據(jù)流等)在提交、檢出、導(dǎo)入、導(dǎo)出等操作過程中會丟失。

現(xiàn)在國內(nèi)有提供支持NTFS擴(kuò)展屬性的擴(kuò)充版Subversion、tSVN,即NTFS的擴(kuò)充屬性(安全屬性、附加數(shù)據(jù)流(可選數(shù)據(jù)流)、加密數(shù)據(jù)流等)可和文件一起被提交、檢出、導(dǎo)入、導(dǎo)出。見參考資料。

企業(yè)級

Subversion Multisite

對于企業(yè)級應(yīng)用,Subversion還有其先天不足,比如對于多個(gè)地點(diǎn)的并行開發(fā)。目前Subversion multisite,實(shí)現(xiàn)異地對等服務(wù)器自動(dòng)同步,支持并行開發(fā)以及異地備份。

基于Subversion的ALM平臺——UberSVN

ALM(Application Lifecycle Management)是scm的未來趨勢,各種軟件版本工具包括Subversion都要集成到其中。目前UberSVN是唯一的以Subversion為基礎(chǔ)構(gòu)建的ALM平臺,并實(shí)現(xiàn)了協(xié)同開發(fā)以及社交化編碼。

是客戶端還是服務(wù)器

Subversion代表的是代碼版本管理的一種標(biāo)準(zhǔn),沒有嚴(yán)格區(qū)分其到底是服務(wù)器還是客戶端,同樣提供二者的功能。

特性

Subversion支持:

版本化的目錄

CVS只能跟蹤單個(gè)文件的變更歷史,但是Subversion實(shí)現(xiàn)的“虛擬”版本化文件系統(tǒng)則可以跟蹤目錄樹的變更。在Subversion中,文件和目錄都是版本化的。

真實(shí)的版本歷史

由于只能跟蹤單個(gè)文件的變更,CVS無法支持如文件拷貝和改名這些常見的操作——這些操作改變了目錄的內(nèi)容。同樣,在CVS中,一個(gè)目錄下的文件只要名字相同即擁有相同的歷史,即使這些同名文件在歷史上毫無關(guān)系。而在Subversion中,可以對文件或目錄進(jìn)行增加、拷貝和改名操作,也解決了同名而無關(guān)的文件之間的歷史聯(lián)系問題。

原子提交

一系列相關(guān)的更改,要么全部提交到版本庫,要么一個(gè)也不提交。這樣用戶就可以將相關(guān)的更改組成一個(gè)邏輯整體,防止出現(xiàn)只有部分修改提交到版本庫的情況。

版本化的元數(shù)據(jù)

每一個(gè)文件和目錄都有自己的一組屬性——鍵和值,可以根據(jù)需要建立并存儲任何鍵/值對。與文件本身的內(nèi)容一樣,屬性也在版本控制之下。

可選的網(wǎng)絡(luò)層

Subversion在版本庫訪問的實(shí)現(xiàn)上具有較高的抽象程度,利于人們實(shí)現(xiàn)新的網(wǎng)絡(luò)訪問機(jī)制。Subversion可以作為一個(gè)擴(kuò)展模塊嵌入到apache之中,這種方式在穩(wěn)定性和交互性方面有很大的優(yōu)勢,可以直接使用服務(wù)器的成熟技術(shù)——認(rèn)證、授權(quán)和傳輸壓縮等。此外,Subversion自身也實(shí)現(xiàn)了一個(gè)輕型的、可獨(dú)立運(yùn)行的服務(wù)器軟件,這個(gè)服務(wù)器使用了一個(gè)自定義協(xié)議,可以輕松地使用SSH封裝。

一致的數(shù)據(jù)操作

Subversion用一個(gè)二進(jìn)制差異算法描述文件的變化,對于文本(可讀)和二進(jìn)制(不可讀)文件其操作方式是一致的,兩種類型的文件壓縮存儲在版本庫中,而差異信息則在網(wǎng)絡(luò)上雙向傳遞。

高效的分支和標(biāo)簽操作

在Subversion中,分支與標(biāo)簽操作的開銷與工程的大小無關(guān)。Subversion的分支和標(biāo)簽操作只是一種類似于硬鏈接的機(jī)制拷貝整個(gè)工程,因而這些操作通常只會花費(fèi)很少且相對固定的時(shí)間。

可修改性

Subversion沒有歷史負(fù)擔(dān),它以一系列優(yōu)質(zhì)的共享C程序庫的方式實(shí)現(xiàn),具有定義良好的API,這使得Subversion非常容易維護(hù),和其它語言的互操作性很強(qiáng)。

架構(gòu)

如圖給出了Subversion設(shè)計(jì)總體上的“俯視圖”。圖中的一端是保存所有版本數(shù)據(jù)的Subversion版本庫,另一端是Subvesion的客戶程序,管理著所有版本數(shù)據(jù)的本地映射(稱為“工作拷貝”),在這兩極之間是各種各樣的版本庫訪問(RA)層,某些使用電腦網(wǎng)絡(luò)通過網(wǎng)絡(luò)服務(wù)器訪問版本庫,某些則繞過網(wǎng)絡(luò)服務(wù)器直接訪問版本庫。

組件

安裝好的Subversion由幾個(gè)部分組成,下面將簡單的介紹一下這些組件。下文的描述或許過于簡略,不易理解,但不用擔(dān)心,本書后面的章節(jié)中會用更多的內(nèi)容來詳細(xì)闡述這些組件。

SVN

命令行客戶端程序。

SVNversion

此工具用來顯示工作拷貝的狀態(tài)(用術(shù)語來說,就是當(dāng)前項(xiàng)目的修訂版本)。

SVNlook

直接查看Subversion版本庫的工具。

SVNadmin

建立、調(diào)整和修復(fù)Subversion版本庫的工具。

SVNdumpfilter

過濾Subversion版本庫轉(zhuǎn)儲數(shù)據(jù)流的工具。

mod_dav_SVN

apacheHTTP服務(wù)器的一個(gè)插件,使版本庫可以通過網(wǎng)絡(luò)訪問。

SVNserve

一個(gè)單獨(dú)運(yùn)行的服務(wù)器程序,可以作為守護(hù)進(jìn)程或由SSH調(diào)用,這是另一種使版本庫,可以通過網(wǎng)絡(luò)訪問的方式。

SVNsync

一個(gè)通過網(wǎng)絡(luò)增加鏡像版本庫的程序。

基本概念

先為那些不熟悉版本數(shù)字技術(shù)的入門者提供一個(gè)簡單扼要、非系統(tǒng)的介紹,這里將從版本控制的基本概念開始,隨后闡述Subversion的獨(dú)特理念,并演示一些使用Subversion的例子。

下面以分享程序源代碼作為例子,但是記住Subversion可以管理任何類型的文件集——它并非是程序員專用的。

版本庫

一個(gè)典型的客戶/服務(wù)器系統(tǒng)

Subversion是一個(gè)“集中式”的信息共享系統(tǒng)。版本庫是Subversion的核心部分,是數(shù)據(jù)的中央倉庫。版本庫以典型的文件和目錄結(jié)構(gòu)形式的文件系統(tǒng)樹來保存信息。任意數(shù)量的客戶端連接到Subversion版本庫,讀取、修改這些文件。客戶端通過寫數(shù)據(jù)將信息分享給其他人,通過讀取數(shù)據(jù)采集工具別人共享的信息。圖“一個(gè)典型的客戶/服務(wù)器系統(tǒng)”展示了這種系統(tǒng):

Subversion聽起來跟一般的文件服務(wù)器沒什么不同。事實(shí)上,Subversion的版本庫的確是一種文件服務(wù)器,但不是“一般”的文件服務(wù)器。Subversion版本庫的特別之處在于,它會記錄每一次改變:每個(gè)文件的改變,甚至是目錄樹本身的改變,例如文件和目錄的添加、刪除和重新組織。

一般情況下,客戶端從版本庫中獲取的數(shù)據(jù)是文件系統(tǒng)樹中的最新數(shù)據(jù),但是客戶端也具備查看文件系統(tǒng)樹以前任何一個(gè)狀態(tài)的能力。舉個(gè)例子,客戶端有時(shí)會對一些歷史性問題感興趣,比如“上星期三時(shí)的目錄結(jié)構(gòu)是什么樣的?”或者“誰最后一個(gè)修改了這個(gè)文件,都修改了什么?”這些都是VCS的核心問題(設(shè)計(jì)用來記錄和跟蹤數(shù)據(jù)變化的系統(tǒng))。

版本模型

版本控制系統(tǒng)的核心任務(wù)是實(shí)現(xiàn)協(xié)作編輯和數(shù)據(jù)共享。但是不同的系統(tǒng)使用不同的策略實(shí)現(xiàn)這個(gè)目的。有理由去理解這些策略的區(qū)別,首先,如果遇到了其他類似Subversion的系統(tǒng),可以幫助比較現(xiàn)有的版本控制系統(tǒng);此外,可以幫助更有效的使用Subversion,因?yàn)镾ubversion本身支持不同的工作方式。

文件共享

所有的版本控制系統(tǒng)都需要解決這樣一個(gè)基礎(chǔ)問題:怎樣讓系統(tǒng)允許用戶共享信息,而不會讓他們因意外而互相干擾?在版本庫里意外覆蓋別人的更改非常容易。

注意事項(xiàng)

考慮“需要避免的問題”的情景,有兩個(gè)共同工作者,Harry和Sally,他們想同時(shí)編輯版本庫里的同一個(gè)文件,如果首先Harry保存它的修改,過了一會,Sally可能湊巧用自己的版本覆蓋了這些文件,Harry的更改不會永遠(yuǎn)消失(因?yàn)橄到y(tǒng)記錄了每次修改),但Harry所有的修改不會出現(xiàn)在Sally新版本的文件中,所以Harry的工作還是丟失了,至少是從最新的版本中丟失了,而且可能是意外的,這是要明確避免的情況!

鎖定-修改-解鎖方案

許多版本控制系統(tǒng)使用鎖定-修改-解鎖機(jī)制解決這種問題,在這樣的模型里,在一個(gè)時(shí)間段里版本庫的一個(gè)文件只允許被一個(gè)人修改。首先在修改之前,Harry要“鎖定”

住這個(gè)文件,鎖定很像是從圖書館借一本書,如果Harry鎖住這個(gè)文件,Sally不能做任何修改,如果Sally想請求得到一個(gè)鎖,版本庫會拒絕這個(gè)請求。在Harry結(jié)束編輯并且放開這個(gè)鎖之前,她只可以閱讀文件。Harry解鎖后,就要換班了,Sally得到自己的輪換位置,鎖定并且開始編輯這個(gè)文件。圖1.3“鎖定-修改-解鎖方案”描述了這樣的解決方案。

鎖定-修改-解鎖模型有一點(diǎn)問題就是限制太多,經(jīng)常會成為用戶的障礙:

1.鎖定可能導(dǎo)致管理問題。有時(shí)候Harry會鎖住文件然后忘了此事,這就是說Sally一直等待解鎖來編輯這些文件,她在這里僵住了。然后Harry去旅行了,現(xiàn)在Sally只好去找管理員放開鎖,這種情況會導(dǎo)致不必要的耽擱和時(shí)間浪費(fèi)。

2.鎖定可能導(dǎo)致不必要的線性化開發(fā)。如果Harry編輯一個(gè)文件的開始,Sally想編輯同一個(gè)文件的結(jié)尾,這種修改不會沖突,設(shè)想修改可以正確的合并到一起,他們可以輕松的并行工作而沒有太多的壞處,沒有必要讓他們輪流工作。

3.鎖定可能導(dǎo)致錯(cuò)誤的安全狀態(tài)。假設(shè)Harry鎖定和編輯一個(gè)文件A,同時(shí)Sally鎖定并編輯文件B,如果A和B互相依賴,這種變化是必須同時(shí)作的,這樣A和B不能正確的工作了,鎖定機(jī)制對防止此類問題將無能為力—從而產(chǎn)生了一種處于安全狀態(tài)的假相。很容易想象Harry和Sally都以為自己鎖住了文件,而且從一個(gè)安全,孤立的情況開始工作,因而沒有盡早發(fā)現(xiàn)他們不匹配的修改。鎖定經(jīng)常成為真正交流的替代品

拷貝-修改-合并方案

Subversion、CVS和一些版本控制系統(tǒng)使用拷貝-修改-合并模型,在這種模型里,每一個(gè)客戶聯(lián)系項(xiàng)目版本庫建立一個(gè)個(gè)人工作拷貝—版本庫中文件和目錄的本地映射。用戶并行工作,修改各自的工作拷貝,最終,各個(gè)私有的拷貝合并在一起,成為最終的版本,這種系統(tǒng)通??梢暂o助合并操作,但是最終要靠人工去確定正誤。

下面是一個(gè)例子,Harry和Sally為同一個(gè)項(xiàng)目各自建立了一個(gè)工作拷貝,工作是并行的,修改了同一個(gè)文件A,Sally首先保存修改到版本庫,當(dāng)Harry想去提交修改的時(shí)候,版本庫提示文件A已經(jīng)過期,換句話說,A在他上次更新之后已經(jīng)更改了,所以當(dāng)他通過客戶端請求合并版本庫和他的工作拷貝之后,碰巧Sally的修改和他的不沖突,所以一旦他把所有的修改集成到一起,他可以將工作拷貝保存到版本庫。

但是如果Sally和Harry的修改交疊了怎么辦?這種情況叫做沖突,這通常不是個(gè)大問題,當(dāng)Harry告訴他的客戶端去合并版本庫的最新修改到自己的工作拷貝時(shí),他的文件A就會處于沖突狀態(tài),他可以看到一對沖突的修改集,并手工的選擇保留一組修改。需要注意的是軟件不能自動(dòng)的解決沖突,只有人可以理解并作出智能的選擇,一旦Harry手工地解決了沖突——也許需要與Sally討論,它可以安全地把合并的文件保存到版本庫。

拷貝-修改-合并模型感覺有一點(diǎn)混亂,但在實(shí)踐中,通常運(yùn)行的很平穩(wěn),用戶可以并行的工作,不必等待別人,當(dāng)工作在同一個(gè)文件上時(shí),也很少會有交疊發(fā)生,沖突并不頻繁,處理沖突的時(shí)間遠(yuǎn)比等待解鎖花費(fèi)的時(shí)間少。

最后,一切都要?dú)w結(jié)到一條重要的因素:用戶交流。當(dāng)用戶交流貧乏,語法和語義的沖突就會增加,沒有系統(tǒng)可以強(qiáng)制用戶進(jìn)行完美的交流,沒有系統(tǒng)可以檢測語義上的沖突,所以沒有任何證據(jù)能夠承諾鎖定系統(tǒng)就可以防止沖突,實(shí)踐中,鎖定除了約束了生產(chǎn)力,并沒有做什么事。

什么時(shí)候鎖定是必需的

鎖定-修改-解鎖模型被認(rèn)為不利于協(xié)作,但有時(shí)候鎖定會更好。

拷貝-修改-合并模型假定文件是可以根據(jù)上下文合并的,就是版本庫的文件主要是以行為基礎(chǔ)的文本文件(例如程序源代碼)。但對于二進(jìn)制格式,例如藝術(shù)品或聲音,在這種情況下,十分有必要讓用戶輪流修改文件,如果沒有線性的訪問,有些人的許多工作就最終要被放棄。

盡管Subversion一直主要是一個(gè)拷貝-修改-合并系統(tǒng),但是它也意識到了需要鎖定一些文件,并且提供這種鎖定機(jī)制,這個(gè)特性的討論可以見“鎖定”一節(jié)。

實(shí)例研究

martin fowler使用SVN

一兩年前,我工作生涯的一個(gè)重要方面發(fā)生了變化,那之前我一直只在一臺電腦上工作(更確切地說是只用一塊HDD),所有工作文件都保存在我的筆記本硬盤里。如果我要用另外一臺桌面電腦,就通過文件共享操作那些文件。

自從去年我買了PowerBook事情就變了,現(xiàn)在我經(jīng)常轉(zhuǎn)戰(zhàn)于三臺機(jī)器:MacPowerBook、Windows筆記本、Ubuntu桌面。這就意味著我得保持多臺機(jī)器上的東西都是最新的——至少我的工作文件都要保持最新。有了多臺桌面電腦,我主要的Email服務(wù)從POP轉(zhuǎn)到了IMAP,這給我?guī)砭薮蟮谋憷M管它有時(shí)“打打隔”,但我敢說IMAP在我的多臺機(jī)器上跑得很好(我用Thunderbird做客戶端)。

我大部分工作文件都被Subversion管理起來了,每當(dāng)切換機(jī)器時(shí)我就提交(commit)工作目錄,再到新機(jī)器上更新(update)。一切都同步得好好的,還全面享受了版本管理服務(wù)。

不過,也有一些東西同步起來沒我想要的那么方便。地址簿就很難直接同步,Thunderbird總固執(zhí)地把它們放到一個(gè)特定的地方,Subversion檢查不到。更倒霉的是,地址簿是二進(jìn)制文件,難以合并(merge),這很煩人,但Mozilla Thunderbird文本文件來處理Email,這一點(diǎn)兒挺招人喜歡的,當(dāng)IMAP打嗝時(shí)我也不難處理。另外,與PDA同步也很難纏,最后我還是找到個(gè)不賴的辦法把所有聯(lián)系人和日程表信息在三臺機(jī)器上都同步好了。再者就是news聚合工具,它們之間可以通過OPML共享feeds(至少理論上如此),但不能記錄下哪些我讀過了哪些還沒讀。

文件盡量采用文本格式,這樣做好處很多。我所有寫作都是用XML,要同步寫的東西只需要一個(gè)文本編輯器。但圖表就成問題了,我還沒找到一個(gè)在所有平臺上都能用的東西,不過,搭起多臺桌面有一個(gè)好處,所有專用于一個(gè)系統(tǒng)的軟件我也能用了。

版本發(fā)布

2012年02月21日,Subversion Access control 4.1 引入更為敏捷靈活的授權(quán)方式。

2012年03月09日,apache Subversion 1.7.4 發(fā)布。

2012年05月19日,Apache Subversion 1.7.5 發(fā)布。

2012年08月16日,Apache Subversion 1.7.6 發(fā)布。

2012年10月09日,Apache Subversion 1.7.7 發(fā)布。

參考資料 >

生活家百科家居網(wǎng)