




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Subversion使用指南主要的參考資料是《Subversion權威指南:針對Subversion1.6:(編譯自r3600/r3578)》BenCollins-Sussman、BrianW.Fitzpatrick和C.MichaelPilato1基本概念1.1版本庫Subversion是一個“集中式”的信息共享系統(tǒng)。版本庫是Subversion的核心部分,是數(shù)據(jù)的中央倉庫。版本庫以典型的文件和目錄結構形式文件系統(tǒng)樹來保存信息。任意數(shù)量的客戶端連接到Subversion版本庫,讀取、修改這些文件。客戶端通過寫數(shù)據(jù)將信息分享給其他人,通過讀取數(shù)據(jù)獲取別人共享的信息。Subversion的版本庫是一種文件服務器,但不是“一般”的文件服務器。Subversion版本庫的特別之處在于,它會記錄每一次改變:每個文件的改變,甚至是目錄樹本身的改變,例如文件和目錄的添加、刪除和重新組織。版本模型一個版本控制系統(tǒng)的核心任務是能夠合作編輯和分享數(shù)據(jù)。而不同系統(tǒng)用不同策略實現(xiàn)這一點。1.2.1“鎖定-修改-解鎖”方案這種模型,版本庫一次只允許一個用戶修改某個文件。這種獨占的策略使用鎖來管理。即每次修改前必須鎖定這個文件。鎖定-修改-解鎖模型的問題是限制太多,經(jīng)常會成為用戶的障礙:?鎖定可能導致管理問題。有時候Harry會鎖住文件然后忘了此事,這就是說Sally一直等待解鎖來編輯這些文件,她在這里僵住了。然后Harry去旅行了,現(xiàn)在Sally只好去找管理員放開鎖,這種情況會導致不必要的耽擱和時間浪費。?鎖定可能導致不必要的線性化開發(fā)。如果Harry編輯一個文件的開始,Sally想編輯同一個文件的結尾,這種修改不會沖突,設想修改可以正確的合并到一起,他們可以輕松的并行工作而沒有太多的壞處,沒有必要讓他們輪流工作。?鎖定可能導致錯誤的安全狀態(tài)。假設Harry鎖定和編輯一個文件A,同時Sally鎖定并編輯文件B,如果A和B互相依賴,這種變化是必須同時作的,這樣A和B不能正確的工作了,鎖定機制對防止此類問題將無能為力—從而產(chǎn)生了一種處于安全狀態(tài)的假相。很容易想象Harry和Sally都以為自己鎖住了文件,而且從一個安全,孤立的情況開始工作,因而沒有盡早發(fā)現(xiàn)他們不匹配的修改。鎖定經(jīng)常成為真正交流的替代品?!翱截?修改-合并”方案Subversion,CVS和一些版本控制系統(tǒng)使用拷貝-修改-合并模型,在這種模型里,每一個客戶聯(lián)系項目版本庫建立一個個人工作拷貝—版本庫中文件和目錄的本地映射。用戶并行工作,修改各自的工作拷貝,最終,各個私有的拷貝合并在一起,成為最終的版本,這種系統(tǒng)通??梢暂o助合并操作,但是最終要靠人工去確定正誤。如果Sally和Harry的修改交迭了該怎么辦?這種情況叫做沖突,這通常不是個大問題,當Harry告訴他的客戶端去合并版本庫的最新修改到自己的工作拷貝時,他的文件A就會處于沖突狀態(tài):他可以看到一對沖突的修改集,并手工的選擇保留一組修改。需要注意的是軟件不能自動的解決沖突,只有人可以理解并作出智能的選擇,一旦Harry手工的解決了沖突—也許需要與Sally討論一它可以安全的把合并的文件保存到版本庫。什么時候鎖定是必需的?“拷貝-修改-合并”模型假定文件是可以上下文合并的一一版本庫中的大多數(shù)文件是基于行的文本文件。但是對于二進制文件,比如聲音或圖片等,通常不能合并修改。這種情況下,需要線性的修改。Subversion提供了這種機制。1.3Subversion版本庫的URL正如我們在整本書里描述的,Subversion使用URL來識別Subversion版本庫中的版本化資源,通常情況下,這些URL使用標準的語法,允許服務器名稱和端口作為URL的一部分:$svncheckout:9834/repos???但是Subversion處理URL的一些細微的不同之處需要注意,例如,使用file:訪問方法的URL(用來訪問本地版本庫)必須與習慣一致,可以包括一個localhost服務器名或者沒有服務器名:$svncheckoutfile:///var/svn/repos???$svncheckoutfile://localhost/var/svn/repos???同樣,在Windows平臺下使用file://模式時需要使用一個非正式的“標準”語法來訪問本機上不在同一個磁盤分區(qū)中的版本庫。下面的任意一個URL路徑語法都可以工作,其中的X表示版本庫所在的磁盤分區(qū):C:\>svncheckoutfile:///X:/var/svn/repos???C:\>svncheckout"file:///X|/var/svn/repos"???在第二個語法里,你需要使用引號包含整個URL,這樣豎線字符才不會被解釋為管道。當然,也要注意URL使用普通的斜線而不是Windows本地(不是URL)的反斜線。最后,必須注意Subversion的客戶端會根據(jù)需要自動編碼URL,這一點和一般的web瀏覽器一樣,舉個例子,如果一個URL包含了空格或是一個字符編碼大于128的ASCII字符:$svncheckout"http://host/pathwithspace/project/espaha"Subversion會避免不安全的字符并且轉換為如下命令:$svncheckouthttp://host/path%20with%20space/project/espa%C3%B1a當URL包含空格時,必須用雙引號括起來,這樣你的shell才會把它們當做一個完整的參數(shù)表1.1.版本庫訪問URL模式 訪問方法HYPERLINKfile:///http://https://svn://svn+ssh://直接版本庫訪問(本地磁盤)通過配置Subversion的Apache服務器的WebDAV協(xié)議與http://相似,但是包括SSL加密。通過svnserve服務自定義的協(xié)議與svn://相似,但通過SSH封裝。1.4工作拷貝Subversion工作拷貝是你本地機器上的一個普通目錄,保存著一些文件,你可以任意的編輯文件,而且如果是源代碼文件,你可以像平常一樣編譯,你的工作拷貝是你的私有工作區(qū),在你明確的做了特定操作之前,Subversion不會把你的修改與其他人的合并,也不會把你的修改展示給別人,你甚至可以擁有同一個項目的多個工作拷貝。當你在工作拷貝作了一些修改并且確認它們工作正常之后,Subversion提供了一個命令可以“發(fā)布”你的修改給項目中的其他人(通過寫到版本庫),如果別人發(fā)布了各自的修改,Subversion提供了手段可以把這些修改與你的工作目錄進行合并(通過讀取版本庫)。工作副本也包括一些由Subversion創(chuàng)建并維護的額外文件,用來協(xié)助執(zhí)行命令。通常情況下,你的工作副本的每個文件夾都有一個以.svn為名的文件夾,也被叫做工作副本的管理目錄這個目錄里的文件能夠幫助Subversion識別哪些文件做過修改,哪些文件相對于別人的工作已經(jīng)過期。一個典型的Subversion的版本庫經(jīng)常包含許多項目的文件(或者說源代碼),通常每一個項目都是版本庫的子目錄,在這種布局下,一個用戶的工作拷貝往往對應版本庫的的一個子目錄。舉一個例子,你的版本庫包含兩個軟件項目,paint和calc。每個項目在它們各自的頂級子目錄下。為了得到一個工作拷貝,你必須檢出(checkout)版本庫的一個子樹,(術語“checkout”聽起來像是鎖定或者保留資源,實際上不是,只是簡單的得到一個項目的私有拷貝),舉個例子,你檢出/calc,你可以得到這樣的工作拷貝:$svncheckout/repos/calcAcalc/MakefileAcalc/integer.cAcalc/button.cCheckedoutrevision56.$ls-AcalcMakefilebutton.cinteger.c.svn/列表中的A表示Subversion增加了一些條目到工作拷貝,你現(xiàn)在有了一個/calc的個人拷貝,有一個附加的目錄一.svn一保存著前面提及的Subversion需要的額外信息。假定你修改了button.c,因為.svn目錄記錄著文件的修改日期和原始內(nèi)容,Subversion可以告訴你已經(jīng)修改了文件,然而,在你明確告訴它之前,Subversion不會將你的改變公開,將改變公開的操作被叫做提交(committing,或者是checkingin)修改到版本庫。將你的修改發(fā)布給其他人,你可以使用Subversion的svncommit:$svncommitbutton.c-m"Fixedatypoinbutton.c."Sendingbutton.cTransmittingfiledata.Committedrevision57.現(xiàn)在你對button.c的修改已經(jīng)被提交到版本庫,并用一個注釋描述了你的修改(即:fixedatypo).如果另一個用戶檢出(checksout)/calc的工作拷貝,他會在這個文件的最新版本中看到你的修改。假設你有個合作者,Sally,她和你同時取出了/calc的一個工作拷貝,你提交了你對button.c的修改,Sally的工作拷貝并沒有改變,Subversion只在用戶要求的時候才改變工作拷貝。為保持她的項目最新,Sally會要求Subversion更新她的工作拷貝,通過使用svnupdate.這會將你的修改與她的工作拷貝合并,其中也包括(自她上次更新后)其他人提交的修改。$pwd/home/sally/calc$ls-A.svn/Makefileinteger.cbutton.c$svnupdateUbutton.cUpdatedtorevision57.svnupdate命令的輸出表明Subversion更新了button.c的內(nèi)容,注意,Sally不必指定要更新的文件,subversion利用.svn以及版本庫的進一步信息決定哪些文件需要更新。1.5修訂版本一次svncommit操作發(fā)布的對任何數(shù)目文件和目錄的修改被作為一個原子處理。在你的工作拷貝中,你可以修改文件的內(nèi)容,創(chuàng)建、刪除、重命名、拷貝文件和目錄,然后將這一系列修改提交作為一次原子處理。對于原子處理,我們的意思是:要么這所有修改都在版本庫中發(fā)生,要么一個也不發(fā)生。Subversion面對程序崩潰、系統(tǒng)崩潰、網(wǎng)絡問題和其他用戶的操作時盡量維持這種原子性。每當版本庫接受了一個提交,文件系統(tǒng)進入了一個新的狀態(tài),叫做一次修訂(revision),每一個修訂版本被賦予一個獨一無二的自然數(shù),一個比一個大,初始修訂號是0,只創(chuàng)建了一個空目錄,沒有任何內(nèi)容。全局版本號不像大多數(shù)的版本控制系統(tǒng),Subversion's修訂號是對于整個目錄樹而言的,而不是單獨的文件。每個修訂號代表整個目錄樹,在某些已提交修改后版本庫的一個特點狀態(tài)。另一種理解方式是修訂N代表版本庫文件系統(tǒng)在第N次提交后的狀態(tài)。
圖1.7“版本庫”可以更形象的描述版本庫,想象有一組修訂號,從0開始,從左到右,每一個修訂號有一個目錄樹掛在它下面,每一個樹好像是一次提交后的版本庫“快照”。圖1?7■版本庫需要特別注意的是,工作拷貝并不一定對應版本庫中的單個修訂版本,他們可能包含多個修訂版本的文件。舉個例子,你從版本庫檢出一個工作拷貝,最近的修訂號是4:calc/Makefile:4integer.c:4button.c:4此刻,工作目錄與版本庫的修訂版本4完全對應,然而,你修改了button.c并且提交之后,假設沒有別的提交出現(xiàn),你的提交會在版本庫建立修訂版本5,你的工作拷貝會是這個樣子的:calc/Makefile:4integer.c:4button.c:5假設在這個時候,Sally提交了對integer.c的修改,創(chuàng)建了修訂6.如果你使用svnupdate更新你的工作拷貝,它就會像這樣:calc/Makefile:6integer.c:6button.c:6Sally對integer.c的改變會出現(xiàn)在你的工作拷貝,你對button.c的改變還在,在這個例子里,Makefile在4、5、6修訂版本都是一樣的,但是Subversion會把他的Makefile的修訂號設為6來表明它是最新的,所以你在工作拷貝頂級目錄作一次干凈的更新,會使得所有內(nèi)容對應版本庫的同一修訂版本。1.6工作副本怎樣跟蹤版本庫對于工作拷貝的每一個文件,Subversion在管理區(qū)域.svn/記錄兩項關鍵的信息:Whatrevisionyourworkingfileisbasedon(thisiscalledthefile'sworkingrevision)Atimestamprecordingwhenthelocalcopywaslastupdatedbytherepository給定這些信息,通過與版本庫通訊,Subversion可以告訴我們工作文件是處于如下四種狀態(tài)的那一種:未修改且是當前的文件在工作目錄里沒有修改,在工作修訂版本之后沒有修改提交到版本庫。svncommit操作不做任何事情,svnupdate不做任何事情。本地已修改且是當前的文件在工作目錄里已經(jīng)修改,在工作修訂版本之后沒有修改提交到版本庫。這些本地修改沒用提交到版本庫,因此svncommit這個文件會成功發(fā)布你的修改,svnupdate不做任何事情.未修改且已過時這個文件在工作目錄沒有修改,但在版本庫中已經(jīng)修改了。這個文件最終將更新到最新版本,成為當時的公共修訂版本。svncommit不做任何事情,svnupdate將會取得最新的版本到工作拷貝。本地已修改且已過時這個文件在工作目錄和版本庫都得到修改。一個svncommit將會失敗,這個文件必須首先更新,svnupdate命令會合并公共和本地修改,如果Subversion不可以自動完成,將會讓用戶解決沖突。這看起來需要記錄很多事情,但是svnstatus命令可以告訴你工作拷貝中文件的狀態(tài)。如果你不小心刪除了子目錄.svn,最簡單的解決辦法是刪除包含的目錄(普通的文件系統(tǒng)刪除,而不是svndelete),然后在父目錄運行svnupdate.Subversion客戶端會重新下載你刪除的目錄,并包含新的.svn。1.7更新和提交是分開的Subversion的一個基礎原則就是“push”action不會引起a“pull”,反之亦然.如果你正在進行一些新的修改,svnupdate會將版本庫中的修改合并進入你(當前)的修改,而不是強制你發(fā)布這些修改。這個規(guī)則的主要副作用就是工作拷貝需要記錄額外的信息來追蹤混合修訂版本,并且也需要能容忍這種混合,當目錄本身也是版本化的時候情況更加復雜。要檢查你的工作拷貝的修訂情況,可以使用svnstatus命令,加上--verbose參數(shù)。Thisisthe“timemachine”aspectofaversioncontrolsystem—thefeaturethatallowsyoutomoveanyportionofyourworkingcopyforwardandbackwardinhistory.混合修訂版本有限制無論你如何在工作拷貝中利用混合修訂版本,這種靈活性還是有限制的。第一,你不能提交對一個不是最新的文件或目錄的刪除操作。如果這個文件有更新的版本存在于版本庫中,你的刪除會被拒絕,以防止你意外刪除你沒有看到的修改。第二,如果目錄已經(jīng)不是最新的了,你不能提交一個目錄的元數(shù)據(jù)更改。一個目錄的工作修訂版本定義了許多條目和屬性,因而對一個過期的版本提交屬性會破壞一些你沒有見到的屬性。2基本使用2.1幫助Subversion命令行工具是一個自包含文檔的工具—在任何時候你可以運行svnhelpSUBCOMMAND來查看子命令的語法,參數(shù)以及行為方式。2.2導入數(shù)據(jù)到你的版本庫有兩種方法可以將新文件引入Subversion版本庫:svnimport和svnadd。svnimportsvnimport是將未版本化文件導入版本庫的最快方法,會根據(jù)需要創(chuàng)建中介目錄。svnimport不需要一個工作副本,你的文件會直接提交到版本庫,這通常用在你希望將一組文件加入到Subversion版本庫時,例如:$svnadmincreate/var/svn/newrepos$svnimportmytreefile:///var/svn/newrepos/some/project\-m"Initialimport"Addingmytree/foo.cAddingmytree/bar.cAddingmytree/subdirAddingmytree/subdir/quux.hCommittedrevision1.在上一個例子里,將會拷貝目錄mytree到版本庫的some/project下:$svnlistfile:///var/svn/newrepos/some/projectbar.cfoo.csubdir/注意,在導入之后,原來的目錄樹并沒有轉化成工作副本,為了開始工作,你還是需要運行svncheckout導出一個工作副本。2.3初始化檢出大多數(shù)時候,你會使用checkout從版本庫取出一個新拷貝,開始使用Subversion,這樣會在本機創(chuàng)建一個項目的“本地拷貝”,這個拷貝包括了命令行指定版本庫中的頂點(最新的)版。$svncheckout/repos/svn/trunkAtrunk/Makefile.inAtrunk/ac-helpersAtrunk/ac-helpers/install.shAtrunk/ac-helpers/install-shAtrunk/build.conf???Checkedoutrevision8810.你也可以在版本庫URL之后指定一個目錄,這樣會將你的工作目錄放到你的新目錄,舉個例子:$svncheckout/repos/svn/trunksubvAsubv/Makefile.inAsubv/ac-helpersAsubv/ac-helpers/install.shAsubv/ac-helpers/install-shAsubv/build.conf???Checkedoutrevision8810.這樣將把你的工作副本放到subv,而不是和前面那樣放到trunk,如果subv不存在,將會自動創(chuàng)建。名稱中有什么?Subversion努力不限制版本控制的數(shù)據(jù)類型。文件的內(nèi)容和屬性值都是按照二進制數(shù)據(jù)存儲和傳遞。Subversion內(nèi)部使用二進制處理數(shù)據(jù)一例如,屬性名稱,路徑名和日志信息一UTF-8編碼的Unicode,這并不意味著與Subversion的交互必須完全使用UTF-8。作為一個慣例,Subversion的客戶端能夠透明的轉化UTF-8和你所使用系統(tǒng)的編碼,前提是可以進行有意義的轉換(當然是大多數(shù)目前常見的編碼)。此外,路徑名稱在WebDAV交換中會作為XML屬性值,就像Subversion的管理文件。這意味著路徑名稱只能包含合法的XML(I.O)字符,Subversion也會禁止路徑名稱中出現(xiàn)TAB,CR或LF字符,所以它們才不會在區(qū)別程序或如svnlog和svnstatus的輸出命令中斷掉。命令行客戶端會添加一些額外的幫助字節(jié)一自動將你輸入的URL路徑字符轉化為“合法正確的”內(nèi)部用版本。你的工作副本“同你系統(tǒng)上的文件和目錄沒有任何區(qū)別”,你可以隨意修改文件,但是你必須告訴Subversion你做的其他任何事。例如,你希望拷貝或移動工作副本的一個文件,你應該使用svncopy或者svnmove,而不要使用操作系統(tǒng)的拷貝移動命令。2.4禁用密碼緩存當你執(zhí)行的Subversion命令需要認證時,缺省情況下Subversion會在磁盤緩存認證信息。在某些系統(tǒng)中,Subversion不能加密你的認證數(shù)據(jù)。你會被詢問,是否緩存你的明文密碼到磁盤。永久禁用明文密碼緩存,可以在本地servers配置文件中的全局section增加store-plaintext-passwords二no。對于特定的服務器禁用,則在適當?shù)膅roupsection中增加這行。在某個命令中關閉密碼緩存,可以使用--no-auth-cache選項,如果希望永久關閉緩存,可以在本機Subversion的配置文件中增加store-passwords=no這一行。2.5基本的工作循環(huán)典型的工作周期是這樣的:更新你的工作副本。?svnupdate做出修改?svnadd?svndelete(del,remove,rm)?svncopy?svnmove?svnmkdir檢驗修改?svnstatus?svndiff可能會取消一些修改?svnrevert解決沖突(合并別人的修改)?svnupdate?svnresolve提交你的修改?svncommit你希望更新你的工作副本得到所有其他人這段時間作出的修改,使用svnupdate讓你的工作副本與最新的版本同步:$svnupdateUfoo.cUbar.cUpdatedtorevision2.當服務器通過svnupdate將修改傳遞到你的工作副本時,每一個項目之前會有一個字母,來讓你知道Subversion為保持最新對你的工作副本作了哪些工作。關于這些字母的詳細含義,可以執(zhí)行svnhelpupdate。你可以對工作副本做出兩種修改:文件修改和目錄樹修改。你不需要告訴Subversion你希望修改一個文件,只需要用你的編輯器,字處理器,圖形程序,或任何工具做出修改,Subversion會自動檢測到文件的修改。此外,二進制文件的處理方式和文本文件一樣,也有同樣的效率。對于目錄樹更改,你可以告訴Subversion將文件和目錄“標記”為調度刪除,添加,拷貝或移動。這些動作會在工作副本上立刻發(fā)生效果,但只有提交后才會在版本庫里生效。版本控制符號連接Subversion可以將特殊類型符號鏈接(或“symlink”)版本化。一個符號鏈接是對文件系統(tǒng)中其他對象的透明引用,可以通過對符號鏈接操作,實現(xiàn)對引用對象的讀寫操作。當符號鏈提交到Subversion版本庫,Subversion會記住這個文件實際上是一個符號鏈接,也會知道這個符號鏈接指向的“對象”。當這個符號鏈接檢出到另一個支持符號鏈接
的操作系統(tǒng)上時,Subversion會重新構建文件系統(tǒng)級的符號鏈接。當然這樣不會影響在Windows這類不支持符號鏈接的系統(tǒng)上的操作,在此類系統(tǒng)上,Subversion只會創(chuàng)建一個包含指向對象路徑的文本文件,因為這個文件不能在Windows系統(tǒng)上作為符號鏈接使用,所以它也會防止Windows用戶作其他Subversion相關的操作。下面是Subversion用來修改目錄樹結構的五個最常用的子命令。svnaddfoo調度將文件,目錄或者符號鏈接foo添加到版本庫。當你下次提交后,foo會成為其父目錄的一個子對象。注意,如果foo是目錄,所有foo中的內(nèi)容也會調度增加。如果你只想添加foo本身,請使用--non-recursive(-N)參數(shù)。svndeletefoo調度將文件,目錄或者符號鏈接foo從版本庫中刪除,如果foo是文件或符號鏈接,它會馬上從工作副本中刪除。如果foo是目錄,不會被刪除,但是Subversion調度刪除它。當你提交修改后,foo就會在你的工作副本和版本庫中被刪除。1svncopyfoobar建立一個新條目bar作為foo的復制品,并且自動調度增加bar,當在下次提交時會將bar添加到版本庫,這種復制會記錄下來歷史(按照來自foo的方式記錄)。如果不傳遞--parents,svncopy并不建立中介目錄。svnmovefoobar這個命令與與運行svncopyfoobar;svndeletefoo完全相同,bar作為foo的拷貝調度添加,foo已經(jīng)調度刪除。如果不傳遞--parents,svnmove不建立中介的目錄。svnmkdirblort這個命令同運行mkdirblort;svnaddblort相同,也就是創(chuàng)建一個叫做blort的文件,并且調度增加到版本庫。2.6檢查你的修改當你完成修改,你需要提交它們到版本庫,但是在此之前,檢查一下做過什么修改是個好主意。通過提交前的檢查,你可以整理一份精確的日志信息。你也可以發(fā)現(xiàn)你不小心修改的文件,給了你一次撤銷修改的機會。此外,這是一個在發(fā)布之前,復審和檢查的好機會。你可通過命令svnstatus瀏覽所做的修改,通過命令svndiff檢查修改的詳細信息。Subversion通過在.svn管理區(qū)域使用原始的版本緩存來做到這一點。這使得報告和恢復本地修改而不必訪問網(wǎng)絡。這個緩存(稱為“text-base”)也允許Subversion根據(jù)原始版本生成一個壓縮的增量(“差異”)提交本地修改。即使你有個非常快的網(wǎng)絡,這個緩存也有極大的好處—只向服務器提交修改的部分而不是整個文件的操作更快。如果你在工作副本的頂級目錄運行不帶參數(shù)的svnstatus命令,它會檢測你對所有文件或目錄作出的修改。以下的例子是來展示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預定加入到版本庫的文件,目錄或符號鏈的item。Citem文件item發(fā)生了沖突。從服務器收到的修改與工作副本的本地修改發(fā)生交迭(在更新期間不會被解決)。在你提交到版本庫前,必須手工解決沖突。Ditem文件,目錄或是符號鏈item預定從版本庫中刪除。Mitem文件item的內(nèi)容被修改了。如果你傳遞一個路徑給svnstatus,它只給你這個項目的信息:$svnstatusstuff/fish.cDstuff/fish.csvnstatus也有一個一verbose(-v)選項,它可以顯示工作副本中的所有項目,即使沒有改變過的:$svnstatus;-vM4423sallyREADME4430sallyINSTALLM4420harrybar.c4418irastuff4435harrystuff/trout.cD4419irastuff/fish.c4421sallystuff/thingsA0??stuff/things/bloo.h4436harrystuff/things/gloo.c這是svnstatus的“長形式”。第一列的含義不變,第二列顯示工作版本號。第三列和第四列顯示最后一次修改的版本號和修改者。上面所有的svnstatus調用并沒有聯(lián)系版本庫—只是與.svn中的原始數(shù)據(jù)進行比較最后,使用--show-updates(-u)選項,它將會聯(lián)系版本庫,為已經(jīng)過時的數(shù)據(jù)增加新信息:$svnstatus-u-vM*4423sallyREADMEM4420harrybar.c*4435harrystuff/trout.cD4419irastuff/fish.cA0??stuff/things/bloo.hStatusagainstrevision:46注意這兩個星號:如果你現(xiàn)在執(zhí)行svnupdate,你的README和trout.c會被更新。這告訴你許多有用的信息——你需要在提交之前,使用更新操作得到服務器中文件README的更新,否則服務器會說文件已經(jīng)過時,拒絕你的提交(后面還有更多關于此主題的信息)。另一種檢查修改的方式是svndiff命令。你可以通過不帶參數(shù)的svndiff精確的找出你所做的修改,它會輸出統(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命令通過比較你的文件與存儲在.svn的“原始”文件來輸出信息,預定要增加的文件會顯示所有增加的文本,預定要刪除的文件會顯示所有要刪除的文本。輸出的格式為統(tǒng)一差異格式。刪除的行前面加一個-,增加的行前面有一個+。svndiff命令也打印文件名和補丁程序需要的位置信息,所以你可以通過重定向一個差異文件來生成“補丁”:$svndiff>patchfile舉個例子,你可以通過郵件把補丁文件發(fā)送到其他開發(fā)者,在提交之前審核或測試。Subversion使用內(nèi)置差異引擎,默認輸出統(tǒng)一差異格式。如果你期望不同的輸出格式,你可以使用--diff-cmd指定外置的比較程序,并且通過選項--extensions(-x)來傳遞其它參數(shù)。例如,察看本地文件foo.c的本地修改,同時忽略大小寫差異,你可以運行svndiff--diff-cmd/usr/bin/diff-x"-i"foo.c。2.7取消本地修改假定我們在察看svndiff的輸出,發(fā)現(xiàn)對某個文件的所有修改都是錯誤的?;蛟S你根本不應該修改這個文件,或者是從開頭重新修改會更加容易。這是使用svnrevert的好機會:$svnrevertREADMEReverted'README'Subversion使用緩存在.svn目錄的“原始”副本來把文件恢復到未修改的狀態(tài)。此外,svnrevert可以撤銷任何預定要做的操作一例如你不再想增加一個新文件。也可用于不小心刪除了一個文件的情況。$svnstatusfoo?foo$svnaddfooAfoo$svnrevertfooReverted'foo'$svnstatusfoo?foo2.8解決沖突(合并別人的修改)當運行svnupdate遇到?jīng)_突時:$svnupdateUINSTALLGREADMEConflictdiscoveredin'bar.c'.Select:(p)postpone,(df)diff-full,(e)edit,(h)helpformoreoptions:U和G沒必要關注,這些文件已經(jīng)從版本庫更新。U代表文件沒用本地修改,但得到了版本庫的更新。代表merGed,說明文件有本地修改,從版本庫中的更新不會覆蓋本地修改。后兩行則稱為交互式?jī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使用標準區(qū)別格式顯示base修訂版本和沖突文件本身的區(qū)別。(e)dit用你喜歡的編輯器打開沖突的文件,編輯器是環(huán)境變量EDITOR設置的。(r)esolved編輯完后,告訴svn已經(jīng)解決了沖突,應該接受當前的內(nèi)容。(m)ine-(f)ull丟棄新從服務器接收的變更,并只使用你的本地修改。(t)heirs-(f)ull丟棄你的本地修改,只使用從服務器新接收的變更。(l)aunch啟動外部程序來執(zhí)行沖突解決,這需要一些預先的準備。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修訂),下一行是你的修改,最后一行則是剛從服務器接收的修改(通常為HEAD修訂)??偣灿兴姆N方式解決沖突——其中兩種允許你有選擇的合并和編輯,另外兩種則是簡單的選擇某個版本的文件。可以選擇編輯命令(e)在文本編輯器中手動編輯文件中有沖突標志的地方。使用合并工具,你需要設置SVN_MERGE環(huán)境變量或者在Subversion的配置文件中定義merge-tool-cmd選項。Subversion會傳遞四個參數(shù)給合并工具:BASE修訂的文件,從服務器接收的修訂文件,本地修改的文件,合并的文件(包含沖突標記)。如果你的合并工具期待不同的參數(shù)順序或格式,你需要寫一個封裝的腳本給Subversion來調用。編輯完后,如果你滿意修改,則使用解決命令(r)。如果不需要合并修改,而只是接受某個版本,則使用mf或tf命令。2.10延后解決沖突如果你沒有準備去檢查或解決沖突,你可以輸入p來延后解決。如果任何沖突都不想解決,則給svnupdate加上--non-interactive選項,沖突文件會被自動標記為C。當你延后解決沖突,svn通常會做三件事輔助你注意和解決沖突:Subversion在更新時打印C標記,并且標記這個文件已沖突。Subversion認為文件是可以合并的(通過屬性svn:mime-type來區(qū)分),它就會在文件中放置沖突標志來凸顯覆蓋的區(qū)域——使用特別的文本串來劃定沖突的“邊界”。對于每一個沖突的文件,Subversion放置三個額外的未版本化文件到你的工作副本:filename.mine你做的本地修改文件,但不包含沖突標記。(如果Subversion認為文件不可合并,.mine不會創(chuàng)建,因為它與工作文件是一樣的。)filename.rOLDREVBASE修訂的文件。即修改前最后一次檢出的文件。filename.rNEWREV當你更新時,從服務器接收的文件。這個文件就是版本庫的HEAD修訂。這里0LDREV是你的.svn目錄中的修訂版本號,NEWREV是版本庫中HEAD的版本號。這時,Subversion不會允許提交文件,直到這三個臨時文件被移除。解決沖突使用svnresolve命令和附加某種參數(shù)的--accept選項。如果你希望選擇上次檢出后修改之前的文件版本,選擇base參數(shù)。如果你希望選擇只包含你修改的版本,選擇mine-full參數(shù)。如果你希望選擇最近從服務器更新的版本(因此會丟棄你的所以編輯),選擇theirs-full參數(shù)。如果你希望手動(檢查和編輯有沖突標志的文件)解決沖突則使用working參數(shù)。svnresolve會移除三個臨時文件,并接受某個你指定的文件版本,Subversion就不在認為文件處于沖突狀態(tài)了:$svnresolve一acceptworkingsandwich.txtResolvedconflictedstateof'sandwich.txt'2.11手工合并沖突$catsandwich.txtToppieceofbreadMayonnaiseLettuceTomatoProvolone<<<<<<<.mineSalamiMortadellaProsciuttoSauerkrautGrilledChicken>>>>>>>.r2CreoleMustardBottompieceofbread小于號字串、等于號字串和大于號字串就是沖突標志。通過與合作者協(xié)調解決沖突,直到消除所有沖突標志:ToppieceofbreadMayonnaiseLettuceTomatoProvoloneSalamiMortadellaProsciuttoCreoleMustardBottompieceofbread這時使用svnresolve,你可以提交你的修改:$svnresolve一acceptworkingsandwich.txtResolvedconflictedstateof'sandwich.txt'$svncommit-m"Goaheadandusemysandwich,discardingSally'sedits."要小心使用svnresolve,因為一旦使用svnresolve,就會移除相應的臨時文件,Subversion就會允許你提交文件,即使其中含有沖突標志。2.12提交你的修改最后你的修改結束了,你合并了服務器上所有的修改,你準備好提交修改到版本庫。svncommit提交所有修改到版本庫.這時你需要同時提交一個日志信息描述你的修改.如果日志信息簡短,可以附加在命令行上(一message(-m)選項):$svncommit-m"Correctednumberofcheeseslices."Sendingsandwich.txtTransmittingfiledata.Committedrevision3.然而,你也許會希望告訴Subversion通過一個文件名得到日志信息,使用--file(-F)選項:$svncommit-FlogmsgSendingsandwich.txtTransmittingfiledata.Committedrevision4.如果你既沒有指定--message(-m)也沒有--file(-F)選項,Subversion會自動啟動編輯器編寫一個日志信息(見editor-cmd屬性,可使用一editor-cmd選項或者指定SVN_EDITOR,VISUAL或EDITOR環(huán)境變量)。注:如果你正在編輯器中編寫日志信息,并決定要取消你的提交,你可以直接退出編輯器而不保存即可。如果你已經(jīng)保存,則可以刪除文本,保存,再退出:$svncommitWaitingforEmacs...DoneLogmessageunchangedornotspecified(a)bort,(c)ontinue,(e)dita$2.13檢視歷史產(chǎn)生歷史修改列表查找一個文件或目錄的歷史信息,使用svnlog命令。svnlog會提供誰對這個文件或目錄做出了修改的記錄,以及在哪個修訂版本,這個修訂的時間和日期,和提交時伴隨的日/志信息。$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默認情況下,日志信息是倒序的。如果你想要指定特定的 修訂范圍和順序,使用--revision(-r)選項:$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)選項則會顯示復制文件、移動文件和目錄等路徑變化的信息:$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使用當前工作目錄作為默認的目標路徑。即只顯示此目錄及其下文件和目錄的修訂信息。檢查歷史修改詳情svndiff有三種不同的用法:?檢查本地修改不使用任何參數(shù)調用時,svndiff將會比較你的工作文件與緩存在.svn的“原始”副本。?比較工作副本與版本庫如果傳遞一個一revision(-r)參數(shù),你的工作副本會與版本庫中的指定版本比較:$svndiff-r3rules.txtIndex:rules.txt rules.txt(revision3)+++rules.txt(workingcopy)@@-1,4+1,5@@BekindtoothersFreedom二ResponsibilityEverythinginmoderation-Chewwithyourmouthopen+Chewwithyourmouthclosed+Listenwhenothersarespeaking$?比較版本庫中的版本通過一revision(-r)傳遞兩個通過冒號分開的版本號,這兩個版本會直接比較:$svndiff-r2:3rules.txtIndex:rules.txt rules.txt(revision2)+++rules.txt(revision3)@@-1,4+1,4@@Bekindtoothers-Freedom二ChocolateIceCream+Freedom二ResponsibilityEverythinginmoderationChewwithyourmouthopen$一種更方便方式比較一個修訂和之前的修訂,則使用--change(-c)選項:$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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 休養(yǎng)所老年公寓設計與運營創(chuàng)新策略考核試卷
- 意外傷害保險與保險行業(yè)的風險管理與案例分析研究分析考核試卷
- 家用紡織品的供應鏈管理與物流優(yōu)化考核試卷
- 車險理賠合規(guī)培訓課件
- 花生銷售合同范本
- 裝修押金轉讓合同范本
- 抵押的車位合同范本
- 寄養(yǎng)羊合同范本
- 小學生態(tài)平衡課件
- 超市促銷培訓課件
- 醫(yī)學遺傳學教案-山東大學醫(yī)學遺傳學
- 海南省澄邁縣2024-2025學年七年級上學期期末考試地理試題(含答案)
- 2025年蘇州衛(wèi)生職業(yè)技術學院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 部編人教版五年級下冊小學數(shù)學全冊教案
- 2024年世界職業(yè)院校技能大賽高職組“聲樂、器樂表演組”賽項參考試題庫(含答案)
- 2024年共青團入團考試題庫及答案
- 2023年國家公務員錄用考試《申論》真題(副省卷)及答案解析
- 2024-2030年中國醫(yī)療器械維修設備行業(yè)供需狀況及發(fā)展策略分析報告
- 中國心力衰竭診斷和治療指南2024解讀(完整版)
- 女性健康知識講座課件
- DB11T 1787-2020 二氧化碳排放核算和報告要求 其他行業(yè)
評論
0/150
提交評論