SVN分支與合并中修改問(wèn)題專家詳解
本節(jié)接著上節(jié)繼續(xù)向大家簡(jiǎn)單介紹一下SVN分支與合并問(wèn)題,主要內(nèi)容有SVNmerge用法取消修改,SVN與修改集以及如何找回刪除的項(xiàng)目等,希望本文的介紹對(duì)大家的學(xué)習(xí)有所幫助。下面是SVN分支與合并具體介紹。
取消修改
SVNmerge另一個(gè)常用的做法是取消已經(jīng)做得提交,假設(shè)你愉快的在/calc/trunk工作,你發(fā)現(xiàn)303版本對(duì)integer.c的修改完全錯(cuò)了,它不應(yīng)該被提交,你可以使用svnmerge來(lái)“取消”這個(gè)工作拷貝上所作的操作,然后提交本地修改到版本庫(kù),你要做得只是指定一個(gè)相反的區(qū)別。(你可以通過(guò)指定--revision303:302--change-303
$svnmerge-c-303http://svn.example.com/repos/calc/trunk
Uinteger.c
$svnstatus
Minteger.c
$svndiff…
#verifythatthechangeisremoved…
$svncommit-m"Undoingchangecommittedinr303."
Sendinginteger.c
Transmittingfiledata.
Committedrevision350.
我們可以把版本庫(kù)修訂版本想象成一組修改(一些版本控制系統(tǒng)叫做修改集),通過(guò)-r選項(xiàng),你可以告訴svnmerge來(lái)應(yīng)用修改集或是一個(gè)修改集范圍到你的工作拷貝,在我們的情況例子里,我們使用svnmerge合并修改集#303到工作拷貝。SVN分支與合并中取消修改問(wèn)題介紹完了,我們?cè)賮?lái)看一下SVN與修改集的問(wèn)題。
SVN與修改集
每一個(gè)人對(duì)于“修改集”的概念都有些不一樣,至少對(duì)于版本控制系統(tǒng)的“修改集特性”這一概念有著不同的期望,根據(jù)我們的用途,可以說(shuō)修改集只是一個(gè)有***名字的一系列修改集合,修改也許包括文件內(nèi)容的修改,目錄樹(shù)結(jié)構(gòu)的修改,或是元數(shù)據(jù)的調(diào)整,更通常的說(shuō)法,一個(gè)修改集就是我們可以引用的有名字的補(bǔ)丁。
在SVN里,一個(gè)全局的修訂版本號(hào)N標(biāo)示一個(gè)版本庫(kù)中的樹(shù):它代表版本庫(kù)在N次提交后的樣子,它也是一個(gè)修改集的隱含名稱:如果你比較樹(shù)N與樹(shù)N-1,你可以得到你提交的補(bǔ)丁。出于這個(gè)原因,想象“版本N”并不只是一棵樹(shù),也是一個(gè)修改集。如果你使用一個(gè)問(wèn)題追蹤工具來(lái)管理bug,你可以使用版本號(hào)來(lái)表示特定的補(bǔ)丁修正了bug—舉個(gè)例子,“這個(gè)問(wèn)題是在版本9238修正的”,然后其他人可以運(yùn)行svnlog-r9238來(lái)查看修正這個(gè)bug的修改集,或者使用svndiff-r9237:9238來(lái)看補(bǔ)丁本身。SVN的合并命令也使用版本號(hào)作為參數(shù),可以將特定修改集從一個(gè)分支合到另一個(gè)分支:svnmerge-r9237:9238將會(huì)合并修改集#9238到本地拷貝。記住回滾修改和任何一個(gè)svnmerge命令都一樣,所以你應(yīng)該使用svnstatus或是svndiff來(lái)確定你的工作處于期望的狀態(tài)中,然后使用svncommit來(lái)提交,提交之后,這個(gè)特定修改集不會(huì)反映到HEAD版本了。
繼續(xù),你也許會(huì)想:好吧,這不是真的取消提交吧!是吧?版本303還依然存在著修改,如果任何人取出calc的303-349版本,他還會(huì)得到錯(cuò)誤的修改,對(duì)吧?
是的,這是對(duì)的。當(dāng)我們說(shuō)“刪除”一個(gè)修改時(shí),我們只是說(shuō)從HEAD刪除,原始的修改還保存在版本庫(kù)歷史中,在多數(shù)情況下,這是足夠好的。大多數(shù)人只是對(duì)追蹤HEAD版本感興趣,在一些特定情況下,你也許希望毀掉所有提交的證據(jù)(或許某個(gè)人提交了一個(gè)秘密文件),這不是很容易的,因?yàn)镾VN設(shè)計(jì)用來(lái)不丟失任何信息,每個(gè)修訂版本都是依賴其它修訂版本的不可變目錄樹(shù),從歷史刪除一個(gè)版本會(huì)導(dǎo)致多米諾效應(yīng),會(huì)在后面的版本導(dǎo)致混亂甚至?xí)绊懰械墓ぷ骺截?。[22]
找回刪除的項(xiàng)目
SVN分支與合并介紹一下如何找回刪除的項(xiàng)目。版本控制系統(tǒng)非常重要的一個(gè)特性就是它的信息從不丟失,即使當(dāng)你刪除了文件或目錄,它也許從HEAD版本消失了,但這個(gè)對(duì)象依然存在于歷史的早期版本,一個(gè)新手經(jīng)常問(wèn)到的問(wèn)題是“怎樣找回我的文件和目錄?”。
***步首先要知道需要拯救的項(xiàng)目是什么,這里有個(gè)很有用的比喻:你可以認(rèn)為任何存在于版本庫(kù)的對(duì)象生活在一個(gè)二維的坐標(biāo)系統(tǒng)里,***維是一個(gè)特定的版本樹(shù),第二維是在樹(shù)中的路徑,所以你的文件或目錄的任何版本可以通過(guò)這樣一對(duì)坐標(biāo)定義。(記住常見(jiàn)的“peg修訂版本”語(yǔ)法—foo.c@224—在前面的“Peg和實(shí)施修訂版本”一節(jié)提到過(guò)。)
首先,你需要svnlog來(lái)察看你需要找回的坐標(biāo)對(duì),一個(gè)好的策略是使用svnlog--verbose來(lái)察看包含刪除項(xiàng)目的目錄,--verbose選項(xiàng)顯示所有改變的項(xiàng)目的每一個(gè)版本,你只需要找出你刪除文件或目錄的那一個(gè)版本。你可以通過(guò)目測(cè)找出這個(gè)版本,也可以使用另一種工具來(lái)檢查日志的輸出(通過(guò)grep或是在編輯器里增量查找)。
$cdparent-dir
$svnlog-v…
------------------------------------------------------------------------
r808|joe|2003-12-2614:29:40-0600(Fri,26Dec2003)|3lines
Changedpaths:
D/calc/trunk/real.c
M/calc/trunk/integer.c
Addedfastfouriertransformfunctionstointeger.c.
Removedreal.cbecausecodenowindouble.c.…
在這個(gè)例子里,你可以假定你正在找已經(jīng)刪除了的文件real.c,通過(guò)查找父目錄的歷史,你知道這個(gè)文件在808版本被刪除,所以存在這個(gè)對(duì)象的版本在此之前。結(jié)論:你想從版本807找回/calc/trunk/real.c。
以上是最重要的部分—重新找到你需要恢復(fù)的對(duì)象?,F(xiàn)在你已經(jīng)知道該恢復(fù)的文件,而你有兩種選擇。
一種是對(duì)版本反向使用svnmerge到808(我們已經(jīng)學(xué)會(huì)了如何取消修改,見(jiàn)“取消修改”一節(jié)),這樣會(huì)重新添加real.c,這個(gè)文件會(huì)列入增加的計(jì)劃,經(jīng)過(guò)一次提交,這個(gè)文件重新回到HEAD。
在這個(gè)例子里,這不是一個(gè)好的策略,這樣做不僅把real.c加入添加到計(jì)劃,也取消了對(duì)integer.c的修改,而這不是你期望的。確實(shí),你可以恢復(fù)到版本808,然后對(duì)integer.c執(zhí)行取消svnrevert操作,但這樣的操作無(wú)法擴(kuò)大使用,因?yàn)槿绻麖陌姹?08修改了90個(gè)文件怎么辦?
所以第二個(gè)方法不是使用svnmerge,而是使用svncopy命令,精確的拷貝版本和路徑“坐標(biāo)對(duì)”到你的工作拷貝:
$svncopy-r807\
http://svn.example.com/repos/calc/trunk/real.c./real.c
$svnstatus
A+real.c
$svncommit-m"Resurrectedreal.cfromrevision807,/calc/trunk/real.c."
Addingreal.c
Transmittingfiledata.
Committedrevision1390.
加號(hào)標(biāo)志表明這個(gè)項(xiàng)目不僅僅是計(jì)劃增加中,而且還包含了歷史,SVN記住了它是從哪個(gè)拷貝過(guò)來(lái)的。在將來(lái),對(duì)這個(gè)文件運(yùn)行svnlog會(huì)看到這個(gè)文件在版本807之前的歷史,換句話說(shuō),real.c不是新的,而是原先刪除的那一個(gè)的后代。盡管我們的例子告訴我們?nèi)绾握一匚募?,?duì)于恢復(fù)刪除的目錄也是一樣的。本節(jié)關(guān)于SVN分支與合并問(wèn)題介紹完畢。
【編輯推薦】