Subversion中文使用指南_第1頁
Subversion中文使用指南_第2頁
Subversion中文使用指南_第3頁
Subversion中文使用指南_第4頁
Subversion中文使用指南_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Subversion使用指南主要的參考資料是《Subversion權(quán)威指南:針對(duì)Subversion1.6:(編譯自r3600/r3578)》BenCollins-Sussman、BrianW.Fitzpatrick和C.MichaelPilato1基本概念1.1版本庫Subversion是一個(gè)“集中式”的信息共享系統(tǒng)。版本庫是Subversion的核心部分,是數(shù)據(jù)的中央倉庫。版本庫以典型的文件和目錄結(jié)構(gòu)形式文件系統(tǒng)樹來保存信息。任意數(shù)量的客戶端連接到Subversion版本庫,讀取、修改這些文件??蛻舳送ㄟ^寫數(shù)據(jù)將信息分享給其他人,通過讀取數(shù)據(jù)獲取別人共享的信息。Subversion的版本庫是一種文件服務(wù)器,但不是“一般”的文件服務(wù)器。Subversion版本庫的特別之處在于,它會(huì)記錄每一次改變:每個(gè)文件的改變,甚至是目錄樹本身的改變,例如文件和目錄的添加、刪除和重新組織。版本模型一個(gè)版本控制系統(tǒng)的核心任務(wù)是能夠合作編輯和分享數(shù)據(jù)。而不同系統(tǒng)用不同策略實(shí)現(xiàn)這一點(diǎn)。1.2.1“鎖定-修改-解鎖”方案這種模型,版本庫一次只允許一個(gè)用戶修改某個(gè)文件。這種獨(dú)占的策略使用鎖來管理。即每次修改前必須鎖定這個(gè)文件。鎖定-修改-解鎖模型的問題是限制太多,經(jīng)常會(huì)成為用戶的障礙:?鎖定可能導(dǎo)致管理問題。有時(shí)候Harry會(huì)鎖住文件然后忘了此事,這就是說Sally一直等待解鎖來編輯這些文件,她在這里僵住了。然后Harry去旅行了,現(xiàn)在Sally只好去找管理員放開鎖,這種情況會(huì)導(dǎo)致不必要的耽擱和時(shí)間浪費(fèi)。?鎖定可能導(dǎo)致不必要的線性化開發(fā)。如果Harry編輯一個(gè)文件的開始,Sally想編輯同一個(gè)文件的結(jié)尾,這種修改不會(huì)沖突,設(shè)想修改可以正確的合并到一起,他們可以輕松的并行工作而沒有太多的壞處,沒有必要讓他們輪流工作。?鎖定可能導(dǎo)致錯(cuò)誤的安全狀態(tài)。假設(shè)Harry鎖定和編輯一個(gè)文件A,同時(shí)Sally鎖定并編輯文件B,如果A和B互相依賴,這種變化是必須同時(shí)作的,這樣A和B不能正確的工作了,鎖定機(jī)制對(duì)防止此類問題將無能為力—從而產(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助合并操作,但是最終要靠人工去確定正誤。如果Sally和Harry的修改交迭了該怎么辦?這種情況叫做沖突,這通常不是個(gè)大問題,當(dāng)Harry告訴他的客戶端去合并版本庫的最新修改到自己的工作拷貝時(shí),他的文件A就會(huì)處于沖突狀態(tài):他可以看到一對(duì)沖突的修改集,并手工的選擇保留一組修改。需要注意的是軟件不能自動(dòng)的解決沖突,只有人可以理解并作出智能的選擇,一旦Harry手工的解決了沖突—也許需要與Sally討論一它可以安全的把合并的文件保存到版本庫。什么時(shí)候鎖定是必需的?“拷貝-修改-合并”模型假定文件是可以上下文合并的一一版本庫中的大多數(shù)文件是基于行的文本文件。但是對(duì)于二進(jìn)制文件,比如聲音或圖片等,通常不能合并修改。這種情況下,需要線性的修改。Subversion提供了這種機(jī)制。1.3Subversion版本庫的URL正如我們?cè)谡緯锩枋龅?,Subversion使用URL來識(shí)別Subversion版本庫中的版本化資源,通常情況下,這些URL使用標(biāo)準(zhǔn)的語法,允許服務(wù)器名稱和端口作為URL的一部分:$svncheckout:9834/repos???但是Subversion處理URL的一些細(xì)微的不同之處需要注意,例如,使用file:訪問方法的URL(用來訪問本地版本庫)必須與習(xí)慣一致,可以包括一個(gè)localhost服務(wù)器名或者沒有服務(wù)器名:$svncheckoutfile:///var/svn/repos???$svncheckoutfile://localhost/var/svn/repos???同樣,在Windows平臺(tái)下使用file://模式時(shí)需要使用一個(gè)非正式的“標(biāo)準(zhǔn)”語法來訪問本機(jī)上不在同一個(gè)磁盤分區(qū)中的版本庫。下面的任意一個(gè)URL路徑語法都可以工作,其中的X表示版本庫所在的磁盤分區(qū):C:\>svncheckoutfile:///X:/var/svn/repos???C:\>svncheckout"file:///X|/var/svn/repos"???在第二個(gè)語法里,你需要使用引號(hào)包含整個(gè)URL,這樣豎線字符才不會(huì)被解釋為管道。當(dāng)然,也要注意URL使用普通的斜線而不是Windows本地(不是URL)的反斜線。最后,必須注意Subversion的客戶端會(huì)根據(jù)需要自動(dòng)編碼URL,這一點(diǎn)和一般的web瀏覽器一樣,舉個(gè)例子,如果一個(gè)URL包含了空格或是一個(gè)字符編碼大于128的ASCII字符:$svncheckout"http://host/pathwithspace/project/espaha"Subversion會(huì)避免不安全的字符并且轉(zhuǎn)換為如下命令:$svncheckouthttp://host/path%20with%20space/project/espa%C3%B1a當(dāng)URL包含空格時(shí),必須用雙引號(hào)括起來,這樣你的shell才會(huì)把它們當(dāng)做一個(gè)完整的參數(shù)表1.1.版本庫訪問URL模式 訪問方法HYPERLINKfile:///http://https://svn://svn+ssh://直接版本庫訪問(本地磁盤)通過配置Subversion的Apache服務(wù)器的WebDAV協(xié)議與http://相似,但是包括SSL加密。通過svnserve服務(wù)自定義的協(xié)議與svn://相似,但通過SSH封裝。1.4工作拷貝Subversion工作拷貝是你本地機(jī)器上的一個(gè)普通目錄,保存著一些文件,你可以任意的編輯文件,而且如果是源代碼文件,你可以像平常一樣編譯,你的工作拷貝是你的私有工作區(qū),在你明確的做了特定操作之前,Subversion不會(huì)把你的修改與其他人的合并,也不會(huì)把你的修改展示給別人,你甚至可以擁有同一個(gè)項(xiàng)目的多個(gè)工作拷貝。當(dāng)你在工作拷貝作了一些修改并且確認(rèn)它們工作正常之后,Subversion提供了一個(gè)命令可以“發(fā)布”你的修改給項(xiàng)目中的其他人(通過寫到版本庫),如果別人發(fā)布了各自的修改,Subversion提供了手段可以把這些修改與你的工作目錄進(jìn)行合并(通過讀取版本庫)。工作副本也包括一些由Subversion創(chuàng)建并維護(hù)的額外文件,用來協(xié)助執(zhí)行命令。通常情況下,你的工作副本的每個(gè)文件夾都有一個(gè)以.svn為名的文件夾,也被叫做工作副本的管理目錄這個(gè)目錄里的文件能夠幫助Subversion識(shí)別哪些文件做過修改,哪些文件相對(duì)于別人的工作已經(jīng)過期。一個(gè)典型的Subversion的版本庫經(jīng)常包含許多項(xiàng)目的文件(或者說源代碼),通常每一個(gè)項(xiàng)目都是版本庫的子目錄,在這種布局下,一個(gè)用戶的工作拷貝往往對(duì)應(yīng)版本庫的的一個(gè)子目錄。舉一個(gè)例子,你的版本庫包含兩個(gè)軟件項(xiàng)目,paint和calc。每個(gè)項(xiàng)目在它們各自的頂級(jí)子目錄下。為了得到一個(gè)工作拷貝,你必須檢出(checkout)版本庫的一個(gè)子樹,(術(shù)語“checkout”聽起來像是鎖定或者保留資源,實(shí)際上不是,只是簡單的得到一個(gè)項(xiàng)目的私有拷貝),舉個(gè)例子,你檢出/calc,你可以得到這樣的工作拷貝:$svncheckout/repos/calcAcalc/MakefileAcalc/integer.cAcalc/button.cCheckedoutrevision56.$ls-AcalcMakefilebutton.cinteger.c.svn/列表中的A表示Subversion增加了一些條目到工作拷貝,你現(xiàn)在有了一個(gè)/calc的個(gè)人拷貝,有一個(gè)附加的目錄一.svn一保存著前面提及的Subversion需要的額外信息。假定你修改了button.c,因?yàn)?svn目錄記錄著文件的修改日期和原始內(nèi)容,Subversion可以告訴你已經(jīng)修改了文件,然而,在你明確告訴它之前,Subversion不會(huì)將你的改變公開,將改變公開的操作被叫做提交(committing,或者是checkingin)修改到版本庫。將你的修改發(fā)布給其他人,你可以使用Subversion的svncommit:$svncommitbutton.c-m"Fixedatypoinbutton.c."Sendingbutton.cTransmittingfiledata.Committedrevision57.現(xiàn)在你對(duì)button.c的修改已經(jīng)被提交到版本庫,并用一個(gè)注釋描述了你的修改(即:fixedatypo).如果另一個(gè)用戶檢出(checksout)/calc的工作拷貝,他會(huì)在這個(gè)文件的最新版本中看到你的修改。假設(shè)你有個(gè)合作者,Sally,她和你同時(shí)取出了/calc的一個(gè)工作拷貝,你提交了你對(duì)button.c的修改,Sally的工作拷貝并沒有改變,Subversion只在用戶要求的時(shí)候才改變工作拷貝。為保持她的項(xiàng)目最新,Sally會(huì)要求Subversion更新她的工作拷貝,通過使用svnupdate.這會(huì)將你的修改與她的工作拷貝合并,其中也包括(自她上次更新后)其他人提交的修改。$pwd/home/sally/calc$ls-A.svn/Makefileinteger.cbutton.c$svnupdateUbutton.cUpdatedtorevision57.svnupdate命令的輸出表明Subversion更新了button.c的內(nèi)容,注意,Sally不必指定要更新的文件,subversion利用.svn以及版本庫的進(jìn)一步信息決定哪些文件需要更新。1.5修訂版本一次svncommit操作發(fā)布的對(duì)任何數(shù)目文件和目錄的修改被作為一個(gè)原子處理。在你的工作拷貝中,你可以修改文件的內(nèi)容,創(chuàng)建、刪除、重命名、拷貝文件和目錄,然后將這一系列修改提交作為一次原子處理。對(duì)于原子處理,我們的意思是:要么這所有修改都在版本庫中發(fā)生,要么一個(gè)也不發(fā)生。Subversion面對(duì)程序崩潰、系統(tǒng)崩潰、網(wǎng)絡(luò)問題和其他用戶的操作時(shí)盡量維持這種原子性。每當(dāng)版本庫接受了一個(gè)提交,文件系統(tǒng)進(jìn)入了一個(gè)新的狀態(tài),叫做一次修訂(revision),每一個(gè)修訂版本被賦予一個(gè)獨(dú)一無二的自然數(shù),一個(gè)比一個(gè)大,初始修訂號(hào)是0,只創(chuàng)建了一個(gè)空目錄,沒有任何內(nèi)容。全局版本號(hào)不像大多數(shù)的版本控制系統(tǒng),Subversion's修訂號(hào)是對(duì)于整個(gè)目錄樹而言的,而不是單獨(dú)的文件。每個(gè)修訂號(hào)代表整個(gè)目錄樹,在某些已提交修改后版本庫的一個(gè)特點(diǎn)狀態(tài)。另一種理解方式是修訂N代表版本庫文件系統(tǒng)在第N次提交后的狀態(tài)。

圖1.7“版本庫”可以更形象的描述版本庫,想象有一組修訂號(hào),從0開始,從左到右,每一個(gè)修訂號(hào)有一個(gè)目錄樹掛在它下面,每一個(gè)樹好像是一次提交后的版本庫“快照”。圖1?7■版本庫需要特別注意的是,工作拷貝并不一定對(duì)應(yīng)版本庫中的單個(gè)修訂版本,他們可能包含多個(gè)修訂版本的文件。舉個(gè)例子,你從版本庫檢出一個(gè)工作拷貝,最近的修訂號(hào)是4:calc/Makefile:4integer.c:4button.c:4此刻,工作目錄與版本庫的修訂版本4完全對(duì)應(yīng),然而,你修改了button.c并且提交之后,假設(shè)沒有別的提交出現(xiàn),你的提交會(huì)在版本庫建立修訂版本5,你的工作拷貝會(huì)是這個(gè)樣子的:calc/Makefile:4integer.c:4button.c:5假設(shè)在這個(gè)時(shí)候,Sally提交了對(duì)integer.c的修改,創(chuàng)建了修訂6.如果你使用svnupdate更新你的工作拷貝,它就會(huì)像這樣:calc/Makefile:6integer.c:6button.c:6Sally對(duì)integer.c的改變會(huì)出現(xiàn)在你的工作拷貝,你對(duì)button.c的改變還在,在這個(gè)例子里,Makefile在4、5、6修訂版本都是一樣的,但是Subversion會(huì)把他的Makefile的修訂號(hào)設(shè)為6來表明它是最新的,所以你在工作拷貝頂級(jí)目錄作一次干凈的更新,會(huì)使得所有內(nèi)容對(duì)應(yīng)版本庫的同一修訂版本。1.6工作副本怎樣跟蹤版本庫對(duì)于工作拷貝的每一個(gè)文件,Subversion在管理區(qū)域.svn/記錄兩項(xiàng)關(guān)鍵的信息:Whatrevisionyourworkingfileisbasedon(thisiscalledthefile'sworkingrevision)Atimestamprecordingwhenthelocalcopywaslastupdatedbytherepository給定這些信息,通過與版本庫通訊,Subversion可以告訴我們工作文件是處于如下四種狀態(tài)的那一種:未修改且是當(dāng)前的文件在工作目錄里沒有修改,在工作修訂版本之后沒有修改提交到版本庫。svncommit操作不做任何事情,svnupdate不做任何事情。本地已修改且是當(dāng)前的文件在工作目錄里已經(jīng)修改,在工作修訂版本之后沒有修改提交到版本庫。這些本地修改沒用提交到版本庫,因此svncommit這個(gè)文件會(huì)成功發(fā)布你的修改,svnupdate不做任何事情.未修改且已過時(shí)這個(gè)文件在工作目錄沒有修改,但在版本庫中已經(jīng)修改了。這個(gè)文件最終將更新到最新版本,成為當(dāng)時(shí)的公共修訂版本。svncommit不做任何事情,svnupdate將會(huì)取得最新的版本到工作拷貝。本地已修改且已過時(shí)這個(gè)文件在工作目錄和版本庫都得到修改。一個(gè)svncommit將會(huì)失敗,這個(gè)文件必須首先更新,svnupdate命令會(huì)合并公共和本地修改,如果Subversion不可以自動(dòng)完成,將會(huì)讓用戶解決沖突。這看起來需要記錄很多事情,但是svnstatus命令可以告訴你工作拷貝中文件的狀態(tài)。如果你不小心刪除了子目錄.svn,最簡單的解決辦法是刪除包含的目錄(普通的文件系統(tǒng)刪除,而不是svndelete),然后在父目錄運(yùn)行svnupdate.Subversion客戶端會(huì)重新下載你刪除的目錄,并包含新的.svn。1.7更新和提交是分開的Subversion的一個(gè)基礎(chǔ)原則就是“push”action不會(huì)引起a“pull”,反之亦然.如果你正在進(jìn)行一些新的修改,svnupdate會(huì)將版本庫中的修改合并進(jìn)入你(當(dāng)前)的修改,而不是強(qiáng)制你發(fā)布這些修改。這個(gè)規(guī)則的主要副作用就是工作拷貝需要記錄額外的信息來追蹤混合修訂版本,并且也需要能容忍這種混合,當(dāng)目錄本身也是版本化的時(shí)候情況更加復(fù)雜。要檢查你的工作拷貝的修訂情況,可以使用svnstatus命令,加上--verbose參數(shù)。Thisisthe“timemachine”aspectofaversioncontrolsystem—thefeaturethatallowsyoutomoveanyportionofyourworkingcopyforwardandbackwardinhistory.混合修訂版本有限制無論你如何在工作拷貝中利用混合修訂版本,這種靈活性還是有限制的。第一,你不能提交對(duì)一個(gè)不是最新的文件或目錄的刪除操作。如果這個(gè)文件有更新的版本存在于版本庫中,你的刪除會(huì)被拒絕,以防止你意外刪除你沒有看到的修改。第二,如果目錄已經(jīng)不是最新的了,你不能提交一個(gè)目錄的元數(shù)據(jù)更改。一個(gè)目錄的工作修訂版本定義了許多條目和屬性,因而對(duì)一個(gè)過期的版本提交屬性會(huì)破壞一些你沒有見到的屬性。2基本使用2.1幫助Subversion命令行工具是一個(gè)自包含文檔的工具—在任何時(shí)候你可以運(yùn)行svnhelpSUBCOMMAND來查看子命令的語法,參數(shù)以及行為方式。2.2導(dǎo)入數(shù)據(jù)到你的版本庫有兩種方法可以將新文件引入Subversion版本庫:svnimport和svnadd。svnimportsvnimport是將未版本化文件導(dǎo)入版本庫的最快方法,會(huì)根據(jù)需要?jiǎng)?chuàng)建中介目錄。svnimport不需要一個(gè)工作副本,你的文件會(huì)直接提交到版本庫,這通常用在你希望將一組文件加入到Subversion版本庫時(shí),例如:$svnadmincreate/var/svn/newrepos$svnimportmytreefile:///var/svn/newrepos/some/project\-m"Initialimport"Addingmytree/foo.cAddingmytree/bar.cAddingmytree/subdirAddingmytree/subdir/quux.hCommittedrevision1.在上一個(gè)例子里,將會(huì)拷貝目錄mytree到版本庫的some/project下:$svnlistfile:///var/svn/newrepos/some/projectbar.cfoo.csubdir/注意,在導(dǎo)入之后,原來的目錄樹并沒有轉(zhuǎn)化成工作副本,為了開始工作,你還是需要運(yùn)行svncheckout導(dǎo)出一個(gè)工作副本。2.3初始化檢出大多數(shù)時(shí)候,你會(huì)使用checkout從版本庫取出一個(gè)新拷貝,開始使用Subversion,這樣會(huì)在本機(jī)創(chuàng)建一個(gè)項(xiàng)目的“本地拷貝”,這個(gè)拷貝包括了命令行指定版本庫中的頂點(diǎn)(最新的)版。$svncheckout/repos/svn/trunkAtrunk/Makefile.inAtrunk/ac-helpersAtrunk/ac-helpers/install.shAtrunk/ac-helpers/install-shAtrunk/build.conf???Checkedoutrevision8810.你也可以在版本庫URL之后指定一個(gè)目錄,這樣會(huì)將你的工作目錄放到你的新目錄,舉個(gè)例子:$svncheckout/repos/svn/trunksubvAsubv/Makefile.inAsubv/ac-helpersAsubv/ac-helpers/install.shAsubv/ac-helpers/install-shAsubv/build.conf???Checkedoutrevision8810.這樣將把你的工作副本放到subv,而不是和前面那樣放到trunk,如果subv不存在,將會(huì)自動(dòng)創(chuàng)建。名稱中有什么?Subversion努力不限制版本控制的數(shù)據(jù)類型。文件的內(nèi)容和屬性值都是按照二進(jìn)制數(shù)據(jù)存儲(chǔ)和傳遞。Subversion內(nèi)部使用二進(jìn)制處理數(shù)據(jù)一例如,屬性名稱,路徑名和日志信息一UTF-8編碼的Unicode,這并不意味著與Subversion的交互必須完全使用UTF-8。作為一個(gè)慣例,Subversion的客戶端能夠透明的轉(zhuǎn)化UTF-8和你所使用系統(tǒng)的編碼,前提是可以進(jìn)行有意義的轉(zhuǎn)換(當(dāng)然是大多數(shù)目前常見的編碼)。此外,路徑名稱在WebDAV交換中會(huì)作為XML屬性值,就像Subversion的管理文件。這意味著路徑名稱只能包含合法的XML(I.O)字符,Subversion也會(huì)禁止路徑名稱中出現(xiàn)TAB,CR或LF字符,所以它們才不會(huì)在區(qū)別程序或如svnlog和svnstatus的輸出命令中斷掉。命令行客戶端會(huì)添加一些額外的幫助字節(jié)一自動(dòng)將你輸入的URL路徑字符轉(zhuǎn)化為“合法正確的”內(nèi)部用版本。你的工作副本“同你系統(tǒng)上的文件和目錄沒有任何區(qū)別”,你可以隨意修改文件,但是你必須告訴Subversion你做的其他任何事。例如,你希望拷貝或移動(dòng)工作副本的一個(gè)文件,你應(yīng)該使用svncopy或者svnmove,而不要使用操作系統(tǒng)的拷貝移動(dòng)命令。2.4禁用密碼緩存當(dāng)你執(zhí)行的Subversion命令需要認(rèn)證時(shí),缺省情況下Subversion會(huì)在磁盤緩存認(rèn)證信息。在某些系統(tǒng)中,Subversion不能加密你的認(rèn)證數(shù)據(jù)。你會(huì)被詢問,是否緩存你的明文密碼到磁盤。永久禁用明文密碼緩存,可以在本地servers配置文件中的全局section增加store-plaintext-passwords二no。對(duì)于特定的服務(wù)器禁用,則在適當(dāng)?shù)膅roupsection中增加這行。在某個(gè)命令中關(guān)閉密碼緩存,可以使用--no-auth-cache選項(xiàng),如果希望永久關(guān)閉緩存,可以在本機(jī)Subversion的配置文件中增加store-passwords=no這一行。2.5基本的工作循環(huán)典型的工作周期是這樣的:更新你的工作副本。?svnupdate做出修改?svnadd?svndelete(del,remove,rm)?svncopy?svnmove?svnmkdir檢驗(yàn)修改?svnstatus?svndiff可能會(huì)取消一些修改?svnrevert解決沖突(合并別人的修改)?svnupdate?svnresolve提交你的修改?svncommit你希望更新你的工作副本得到所有其他人這段時(shí)間作出的修改,使用svnupdate讓你的工作副本與最新的版本同步:$svnupdateUfoo.cUbar.cUpdatedtorevision2.當(dāng)服務(wù)器通過svnupdate將修改傳遞到你的工作副本時(shí),每一個(gè)項(xiàng)目之前會(huì)有一個(gè)字母,來讓你知道Subversion為保持最新對(duì)你的工作副本作了哪些工作。關(guān)于這些字母的詳細(xì)含義,可以執(zhí)行svnhelpupdate。你可以對(duì)工作副本做出兩種修改:文件修改和目錄樹修改。你不需要告訴Subversion你希望修改一個(gè)文件,只需要用你的編輯器,字處理器,圖形程序,或任何工具做出修改,Subversion會(huì)自動(dòng)檢測到文件的修改。此外,二進(jìn)制文件的處理方式和文本文件一樣,也有同樣的效率。對(duì)于目錄樹更改,你可以告訴Subversion將文件和目錄“標(biāo)記”為調(diào)度刪除,添加,拷貝或移動(dòng)。這些動(dòng)作會(huì)在工作副本上立刻發(fā)生效果,但只有提交后才會(huì)在版本庫里生效。版本控制符號(hào)連接Subversion可以將特殊類型符號(hào)鏈接(或“symlink”)版本化。一個(gè)符號(hào)鏈接是對(duì)文件系統(tǒng)中其他對(duì)象的透明引用,可以通過對(duì)符號(hào)鏈接操作,實(shí)現(xiàn)對(duì)引用對(duì)象的讀寫操作。當(dāng)符號(hào)鏈提交到Subversion版本庫,Subversion會(huì)記住這個(gè)文件實(shí)際上是一個(gè)符號(hào)鏈接,也會(huì)知道這個(gè)符號(hào)鏈接指向的“對(duì)象”。當(dāng)這個(gè)符號(hào)鏈接檢出到另一個(gè)支持符號(hào)鏈接

的操作系統(tǒng)上時(shí),Subversion會(huì)重新構(gòu)建文件系統(tǒng)級(jí)的符號(hào)鏈接。當(dāng)然這樣不會(huì)影響在Windows這類不支持符號(hào)鏈接的系統(tǒng)上的操作,在此類系統(tǒng)上,Subversion只會(huì)創(chuàng)建一個(gè)包含指向?qū)ο舐窂降奈谋疚募?,因?yàn)檫@個(gè)文件不能在Windows系統(tǒng)上作為符號(hào)鏈接使用,所以它也會(huì)防止Windows用戶作其他Subversion相關(guān)的操作。下面是Subversion用來修改目錄樹結(jié)構(gòu)的五個(gè)最常用的子命令。svnaddfoo調(diào)度將文件,目錄或者符號(hào)鏈接foo添加到版本庫。當(dāng)你下次提交后,foo會(huì)成為其父目錄的一個(gè)子對(duì)象。注意,如果foo是目錄,所有foo中的內(nèi)容也會(huì)調(diào)度增加。如果你只想添加foo本身,請(qǐng)使用--non-recursive(-N)參數(shù)。svndeletefoo調(diào)度將文件,目錄或者符號(hào)鏈接foo從版本庫中刪除,如果foo是文件或符號(hào)鏈接,它會(huì)馬上從工作副本中刪除。如果foo是目錄,不會(huì)被刪除,但是Subversion調(diào)度刪除它。當(dāng)你提交修改后,foo就會(huì)在你的工作副本和版本庫中被刪除。1svncopyfoobar建立一個(gè)新條目bar作為foo的復(fù)制品,并且自動(dòng)調(diào)度增加bar,當(dāng)在下次提交時(shí)會(huì)將bar添加到版本庫,這種復(fù)制會(huì)記錄下來歷史(按照來自foo的方式記錄)。如果不傳遞--parents,svncopy并不建立中介目錄。svnmovefoobar這個(gè)命令與與運(yùn)行svncopyfoobar;svndeletefoo完全相同,bar作為foo的拷貝調(diào)度添加,foo已經(jīng)調(diào)度刪除。如果不傳遞--parents,svnmove不建立中介的目錄。svnmkdirblort這個(gè)命令同運(yùn)行mkdirblort;svnaddblort相同,也就是創(chuàng)建一個(gè)叫做blort的文件,并且調(diào)度增加到版本庫。2.6檢查你的修改當(dāng)你完成修改,你需要提交它們到版本庫,但是在此之前,檢查一下做過什么修改是個(gè)好主意。通過提交前的檢查,你可以整理一份精確的日志信息。你也可以發(fā)現(xiàn)你不小心修改的文件,給了你一次撤銷修改的機(jī)會(huì)。此外,這是一個(gè)在發(fā)布之前,復(fù)審和檢查的好機(jī)會(huì)。你可通過命令svnstatus瀏覽所做的修改,通過命令svndiff檢查修改的詳細(xì)信息。Subversion通過在.svn管理區(qū)域使用原始的版本緩存來做到這一點(diǎn)。這使得報(bào)告和恢復(fù)本地修改而不必訪問網(wǎng)絡(luò)。這個(gè)緩存(稱為“text-base”)也允許Subversion根據(jù)原始版本生成一個(gè)壓縮的增量(“差異”)提交本地修改。即使你有個(gè)非??斓木W(wǎng)絡(luò),這個(gè)緩存也有極大的好處—只向服務(wù)器提交修改的部分而不是整個(gè)文件的操作更快。如果你在工作副本的頂級(jí)目錄運(yùn)行不帶參數(shù)的svnstatus命令,它會(huì)檢測你對(duì)所有文件或目錄作出的修改。以下的例子是來展示svnstatus可能返回的狀態(tài)代碼(注意#之后?scratch.cAstuff/loot/bloo.hCstuff/loot/lump.cDstuff/fish.cMbar.c的內(nèi)容不是svnstatus打印的信息?scratch.cAstuff/loot/bloo.hCstuff/loot/lump.cDstuff/fish.cMbar.cfileisnotunderversioncontrolfileisscheduledforadditionfilehastextualconflictsfromanupdatefileisscheduledfordeletionthecontentinbar.chaslocalmodifications在這種輸出格式中,svnstatus打印6列字符,緊跟一些空格,接著是文件或目錄名。第一列告訴文件或目錄的狀態(tài)或它的內(nèi)容。返回代碼如下:Aitem預(yù)定加入到版本庫的文件,目錄或符號(hào)鏈的item。Citem文件item發(fā)生了沖突。從服務(wù)器收到的修改與工作副本的本地修改發(fā)生交迭(在更新期間不會(huì)被解決)。在你提交到版本庫前,必須手工解決沖突。Ditem文件,目錄或是符號(hào)鏈item預(yù)定從版本庫中刪除。Mitem文件item的內(nèi)容被修改了。如果你傳遞一個(gè)路徑給svnstatus,它只給你這個(gè)項(xiàng)目的信息:$svnstatusstuff/fish.cDstuff/fish.csvnstatus也有一個(gè)一verbose(-v)選項(xiàng),它可以顯示工作副本中的所有項(xiàng)目,即使沒有改變過的:$svnstatus;-vM4423sallyREADME4430sallyINSTALLM4420harrybar.c4418irastuff4435harrystuff/trout.cD4419irastuff/fish.c4421sallystuff/thingsA0??stuff/things/bloo.h4436harrystuff/things/gloo.c這是svnstatus的“長形式”。第一列的含義不變,第二列顯示工作版本號(hào)。第三列和第四列顯示最后一次修改的版本號(hào)和修改者。上面所有的svnstatus調(diào)用并沒有聯(lián)系版本庫—只是與.svn中的原始數(shù)據(jù)進(jìn)行比較最后,使用--show-updates(-u)選項(xiàng),它將會(huì)聯(lián)系版本庫,為已經(jīng)過時(shí)的數(shù)據(jù)增加新信息:$svnstatus-u-vM*4423sallyREADMEM4420harrybar.c*4435harrystuff/trout.cD4419irastuff/fish.cA0??stuff/things/bloo.hStatusagainstrevision:46注意這兩個(gè)星號(hào):如果你現(xiàn)在執(zhí)行svnupdate,你的README和trout.c會(huì)被更新。這告訴你許多有用的信息——你需要在提交之前,使用更新操作得到服務(wù)器中文件README的更新,否則服務(wù)器會(huì)說文件已經(jīng)過時(shí),拒絕你的提交(后面還有更多關(guān)于此主題的信息)。另一種檢查修改的方式是svndiff命令。你可以通過不帶參數(shù)的svndiff精確的找出你所做的修改,它會(huì)輸出統(tǒng)一差異格式的修改信息:$svndiffIndex:bar.c bar.c(revision3)+++bar.c(workingcopy)@@-1,7+1,12@@+#include<sys/types.h>+#include<sys/stat.h>+#include<unistd.h>++#include<stdio.h>intmain(void){-printf("Sixty-fourslicesofAmericanCheese...\n");+printf("Sixty-fiveslicesofAmericanCheese...\n");return0;}Index:README README(revision3)+++README(workingcopy)@@-193,3+193,4@@+Notetoself:pickuplaundry.Index:stuff/fish.c stuff/fish.c(revision1)+++stuff/fish.c(workingcopy)-Welcometothefileknownas'fish'.-Informationonfishwillbeheresoon.Index:stuff/things/bloo.h stuff/things/bloo.h(revision8)+++stuff/things/bloo.h(workingcopy)+Hereisanewfiletodescribe+thingsaboutbloo.svndiff命令通過比較你的文件與存儲(chǔ)在.svn的“原始”文件來輸出信息,預(yù)定要增加的文件會(huì)顯示所有增加的文本,預(yù)定要?jiǎng)h除的文件會(huì)顯示所有要?jiǎng)h除的文本。輸出的格式為統(tǒng)一差異格式。刪除的行前面加一個(gè)-,增加的行前面有一個(gè)+。svndiff命令也打印文件名和補(bǔ)丁程序需要的位置信息,所以你可以通過重定向一個(gè)差異文件來生成“補(bǔ)丁”:$svndiff>patchfile舉個(gè)例子,你可以通過郵件把補(bǔ)丁文件發(fā)送到其他開發(fā)者,在提交之前審核或測試。Subversion使用內(nèi)置差異引擎,默認(rèn)輸出統(tǒng)一差異格式。如果你期望不同的輸出格式,你可以使用--diff-cmd指定外置的比較程序,并且通過選項(xiàng)--extensions(-x)來傳遞其它參數(shù)。例如,察看本地文件foo.c的本地修改,同時(shí)忽略大小寫差異,你可以運(yùn)行svndiff--diff-cmd/usr/bin/diff-x"-i"foo.c。2.7取消本地修改假定我們?cè)诓炜磗vndiff的輸出,發(fā)現(xiàn)對(duì)某個(gè)文件的所有修改都是錯(cuò)誤的?;蛟S你根本不應(yīng)該修改這個(gè)文件,或者是從開頭重新修改會(huì)更加容易。這是使用svnrevert的好機(jī)會(huì):$svnrevertREADMEReverted'README'Subversion使用緩存在.svn目錄的“原始”副本來把文件恢復(fù)到未修改的狀態(tài)。此外,svnrevert可以撤銷任何預(yù)定要做的操作一例如你不再想增加一個(gè)新文件。也可用于不小心刪除了一個(gè)文件的情況。$svnstatusfoo?foo$svnaddfooAfoo$svnrevertfooReverted'foo'$svnstatusfoo?foo2.8解決沖突(合并別人的修改)當(dāng)運(yùn)行svnupdate遇到?jīng)_突時(shí):$svnupdateUINSTALLGREADMEConflictdiscoveredin'bar.c'.Select:(p)postpone,(df)diff-full,(e)edit,(h)helpformoreoptions:U和G沒必要關(guān)注,這些文件已經(jīng)從版本庫更新。U代表文件沒用本地修改,但得到了版本庫的更新。代表merGed,說明文件有本地修改,從版本庫中的更新不會(huì)覆蓋本地修改。后兩行則稱為交互式?jīng)_突處理。意思是服務(wù)器的更新覆蓋了你的本地修改,你擁有機(jī)會(huì)解決這些沖突。所有選項(xiàng)如下(按h):???(p)postpone-marktheconflicttoberesolvedlater(df)diff-full-showallchangesmadetomergedfile(e)edit-changemergedfileinaneditor(r)resolved-acceptmergedversionoffile(mf)mine-full-acceptmyversionofentirefile(ignoretheirchanges)(tf)theirs-full-accepttheirversionofentirefile(losemychanges)(l)launch-launchexternaltooltoresolveconflict(h)help-showthislist(p)ostpone讓文件在更新完成之后保持沖突狀態(tài)。(d)iff-(f)ull使用標(biāo)準(zhǔn)區(qū)別格式顯示base修訂版本和沖突文件本身的區(qū)別。(e)dit用你喜歡的編輯器打開沖突的文件,編輯器是環(huán)境變量EDITOR設(shè)置的。(r)esolved編輯完后,告訴svn已經(jīng)解決了沖突,應(yīng)該接受當(dāng)前的內(nèi)容。(m)ine-(f)ull丟棄新從服務(wù)器接收的變更,并只使用你的本地修改。(t)heirs-(f)ull丟棄你的本地修改,只使用從服務(wù)器新接收的變更。(l)aunch啟動(dòng)外部程序來執(zhí)行沖突解決,這需要一些預(yù)先的準(zhǔn)備。2.9交互式的查看沖突區(qū)別(輸入df)???Select:(p)postpone,(df)diff-full,(e)edit,(h)elpformoreoptions:df .svn/text-base/sandwich.txt.svn-baseTueDec1121:33:572007+++.svn/tmp/tempfile.32.tmpTueDec1121:34:332007@@-1+1,5@@-Justbuyasandwich.+<<<<<<<.mine+Gopickupacheesesteak.+=======+Bringmeataco!+>>>??.r32???區(qū)別內(nèi)容的第一行顯示工作拷貝的原始內(nèi)容(BASE修訂),下一行是你的修改,最后一行則是剛從服務(wù)器接收的修改(通常為HEAD修訂)??偣灿兴姆N方式解決沖突——其中兩種允許你有選擇的合并和編輯,另外兩種則是簡單的選擇某個(gè)版本的文件。可以選擇編輯命令(e)在文本編輯器中手動(dòng)編輯文件中有沖突標(biāo)志的地方。使用合并工具,你需要設(shè)置SVN_MERGE環(huán)境變量或者在Subversion的配置文件中定義merge-tool-cmd選項(xiàng)。Subversion會(huì)傳遞四個(gè)參數(shù)給合并工具:BASE修訂的文件,從服務(wù)器接收的修訂文件,本地修改的文件,合并的文件(包含沖突標(biāo)記)。如果你的合并工具期待不同的參數(shù)順序或格式,你需要寫一個(gè)封裝的腳本給Subversion來調(diào)用。編輯完后,如果你滿意修改,則使用解決命令(r)。如果不需要合并修改,而只是接受某個(gè)版本,則使用mf或tf命令。2.10延后解決沖突如果你沒有準(zhǔn)備去檢查或解決沖突,你可以輸入p來延后解決。如果任何沖突都不想解決,則給svnupdate加上--non-interactive選項(xiàng),沖突文件會(huì)被自動(dòng)標(biāo)記為C。當(dāng)你延后解決沖突,svn通常會(huì)做三件事輔助你注意和解決沖突:Subversion在更新時(shí)打印C標(biāo)記,并且標(biāo)記這個(gè)文件已沖突。Subversion認(rèn)為文件是可以合并的(通過屬性svn:mime-type來區(qū)分),它就會(huì)在文件中放置沖突標(biāo)志來凸顯覆蓋的區(qū)域——使用特別的文本串來劃定沖突的“邊界”。對(duì)于每一個(gè)沖突的文件,Subversion放置三個(gè)額外的未版本化文件到你的工作副本:filename.mine你做的本地修改文件,但不包含沖突標(biāo)記。(如果Subversion認(rèn)為文件不可合并,.mine不會(huì)創(chuàng)建,因?yàn)樗c工作文件是一樣的。)filename.rOLDREVBASE修訂的文件。即修改前最后一次檢出的文件。filename.rNEWREV當(dāng)你更新時(shí),從服務(wù)器接收的文件。這個(gè)文件就是版本庫的HEAD修訂。這里0LDREV是你的.svn目錄中的修訂版本號(hào),NEWREV是版本庫中HEAD的版本號(hào)。這時(shí),Subversion不會(huì)允許提交文件,直到這三個(gè)臨時(shí)文件被移除。解決沖突使用svnresolve命令和附加某種參數(shù)的--accept選項(xiàng)。如果你希望選擇上次檢出后修改之前的文件版本,選擇base參數(shù)。如果你希望選擇只包含你修改的版本,選擇mine-full參數(shù)。如果你希望選擇最近從服務(wù)器更新的版本(因此會(huì)丟棄你的所以編輯),選擇theirs-full參數(shù)。如果你希望手動(dòng)(檢查和編輯有沖突標(biāo)志的文件)解決沖突則使用working參數(shù)。svnresolve會(huì)移除三個(gè)臨時(shí)文件,并接受某個(gè)你指定的文件版本,Subversion就不在認(rèn)為文件處于沖突狀態(tài)了:$svnresolve一acceptworkingsandwich.txtResolvedconflictedstateof'sandwich.txt'2.11手工合并沖突$catsandwich.txtToppieceofbreadMayonnaiseLettuceTomatoProvolone<<<<<<<.mineSalamiMortadellaProsciuttoSauerkrautGrilledChicken>>>>>>>.r2CreoleMustardBottompieceofbread小于號(hào)字串、等于號(hào)字串和大于號(hào)字串就是沖突標(biāo)志。通過與合作者協(xié)調(diào)解決沖突,直到消除所有沖突標(biāo)志:ToppieceofbreadMayonnaiseLettuceTomatoProvoloneSalamiMortadellaProsciuttoCreoleMustardBottompieceofbread這時(shí)使用svnresolve,你可以提交你的修改:$svnresolve一acceptworkingsandwich.txtResolvedconflictedstateof'sandwich.txt'$svncommit-m"Goaheadandusemysandwich,discardingSally'sedits."要小心使用svnresolve,因?yàn)橐坏┦褂胹vnresolve,就會(huì)移除相應(yīng)的臨時(shí)文件,Subversion就會(huì)允許你提交文件,即使其中含有沖突標(biāo)志。2.12提交你的修改最后你的修改結(jié)束了,你合并了服務(wù)器上所有的修改,你準(zhǔn)備好提交修改到版本庫。svncommit提交所有修改到版本庫.這時(shí)你需要同時(shí)提交一個(gè)日志信息描述你的修改.如果日志信息簡短,可以附加在命令行上(一message(-m)選項(xiàng)):$svncommit-m"Correctednumberofcheeseslices."Sendingsandwich.txtTransmittingfiledata.Committedrevision3.然而,你也許會(huì)希望告訴Subversion通過一個(gè)文件名得到日志信息,使用--file(-F)選項(xiàng):$svncommit-FlogmsgSendingsandwich.txtTransmittingfiledata.Committedrevision4.如果你既沒有指定--message(-m)也沒有--file(-F)選項(xiàng),Subversion會(huì)自動(dòng)啟動(dòng)編輯器編寫一個(gè)日志信息(見editor-cmd屬性,可使用一editor-cmd選項(xiàng)或者指定SVN_EDITOR,VISUAL或EDITOR環(huán)境變量)。注:如果你正在編輯器中編寫日志信息,并決定要取消你的提交,你可以直接退出編輯器而不保存即可。如果你已經(jīng)保存,則可以刪除文本,保存,再退出:$svncommitWaitingforEmacs...DoneLogmessageunchangedornotspecified(a)bort,(c)ontinue,(e)dita$2.13檢視歷史產(chǎn)生歷史修改列表查找一個(gè)文件或目錄的歷史信息,使用svnlog命令。svnlog會(huì)提供誰對(duì)這個(gè)文件或目錄做出了修改的記錄,以及在哪個(gè)修訂版本,這個(gè)修訂的時(shí)間和日期,和提交時(shí)伴隨的日/志信息。$svnlogr3|sally|2008-05-1523:09:28-0500(Thu,15May2008)|1lineAddedincludelinesandcorrected#ofcheeseslices.r2|harry|2008-05-1418:43:15-0500(Wed,14May2008)|1lineAddedmain()methods.r1|sally|2008-05-1019:50:31-0500(Sat,10May2008)|1lineInitialimport默認(rèn)情況下,日志信息是倒序的。如果你想要指定特定的 修訂范圍和順序,使用--revision(-r)選項(xiàng):$svn log -r 5:19 #正序顯示5到19的日志$svn log -r 19:5 #倒序顯示5到19的日志$svn log -r 8 #顯示修訂8的日志指定特定文件或目錄:$svnlogfoo.c??$svnlog/svn/trunk/code/foo.c???svnlog使用--verbose(-v)選項(xiàng)則會(huì)顯示復(fù)制文件、移動(dòng)文件和目錄等路徑變化的信息:$svnlog-r8-vr8|sally|2008-05-2113:19:25-0500(Wed,21May2008)|1lineChangedpaths:M/trunk/code/foo.cM/trunk/code/bar.hA/trunk/code/doc/READMEFrozzledthesub-spacewinch.注:如果沒有指定路徑,svnlog使用當(dāng)前工作目錄作為默認(rèn)的目標(biāo)路徑。即只顯示此目錄及其下文件和目錄的修訂信息。檢查歷史修改詳情svndiff有三種不同的用法:?檢查本地修改不使用任何參數(shù)調(diào)用時(shí),svndiff將會(huì)比較你的工作文件與緩存在.svn的“原始”副本。?比較工作副本與版本庫如果傳遞一個(gè)一revision(-r)參數(shù),你的工作副本會(huì)與版本庫中的指定版本比較:$svndiff-r3rules.txtIndex:rules.txt rules.txt(revision3)+++rules.txt(workingcopy)@@-1,4+1,5@@BekindtoothersFreedom二ResponsibilityEverythinginmoderation-Chewwithyourmouthopen+Chewwithyourmouthclosed+Listenwhenothersarespeaking$?比較版本庫中的版本通過一revision(-r)傳遞兩個(gè)通過冒號(hào)分開的版本號(hào),這兩個(gè)版本會(huì)直接比較:$svndiff-r2:3rules.txtIndex:rules.txt rules.txt(revision2)+++rules.txt(revision3)@@-1,4+1,4@@Bekindtoothers-Freedom二ChocolateIceCream+Freedom二ResponsibilityEverythinginmoderationChewwithyourmouthopen$一種更方便方式比較一個(gè)修訂和之前的修訂,則使用--change(-c)選項(xiàng):$svndiff-c3rules.txtIndex:rules.txt

rules.txt(revision2)+++rules.txt(revision3)@@-1,4+1,4@@Bekindtoothers-Freedom二ChocolateIceCream+Freedom二ResponsibilityEverythinginmoderationChewwithyourmo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論