Subversion版本升級(jí)兼容性以及合并跟蹤相關(guān)問(wèn)題報(bào)道 下篇
本文接著上篇文章繼續(xù)報(bào)道Subsverion版本升級(jí)、兼容性以及Subversion合并跟蹤問(wèn)題,歡迎大家一起來(lái)討論研究。
Subversion1.5支持的合并跟蹤是“基礎(chǔ)的”:最重要的部分已經(jīng)實(shí)現(xiàn),但是在我們最初的規(guī)格中還有一部分需要去實(shí)現(xiàn)(特別是對(duì)于reflectivemerges的正確支持,更好的change-availabilityreporting和更好的trackingofrenamedfiles),雖然在1.5還要加入一些主要的特性,但我們不希望為等待某個(gè)特性延遲我們的發(fā)布。更多的合并跟蹤改進(jìn)希望在Subversion1.6或以后的版本出現(xiàn)。
概述Subversion的合并跟蹤設(shè)計(jì)為:
◆減少分支維護(hù)的記錄負(fù)擔(dān)
◆防止常見(jiàn)的“重復(fù)合并”問(wèn)題
◆允許對(duì)于變更的cherry-picking
每個(gè)變更集都可以通過(guò)修訂版本號(hào)識(shí)別,通過(guò)新的svn:mergeinfo屬性在合并的目標(biāo)存放在合并變更集的信息(通俗來(lái)說(shuō)就是“合并信息(mergeinfo)”),Subversion會(huì)自動(dòng)保持合并信息的為最新,但是也有辦法手工記錄/消除合并信息,這是因?yàn)榭倳?huì)有些時(shí)候人們知道一些Subversion不知道的事情。用戶界面從主干合并分支不再需要指明修訂版本范圍,每當(dāng)你希望與trunk同步,你可以這樣做:
$cdBRANCH_WORKING_COPY
$svnmergeURL_TO_TRUNKSubversion能夠計(jì)算出從URL_TO_TRUNK有哪些變更沒(méi)有合并,并只處理這些變更,當(dāng)將分支合并回主干,我們只需要:
$cdTRUNK_WORKING_COPY
$svnmerge--reintegrateURL_TO_BRANCH下面是所有合并跟蹤相關(guān)接口變更的正式描述。
svnmerge命令使用兩個(gè)新的選項(xiàng):--record-only和--reintegrate。
–record-only選項(xiàng)至于-r結(jié)合工作,并且和你所想的一樣:它只是用來(lái)將修訂版本標(biāo)記為已合并(或未合并的,使用“-”作為否定語(yǔ)法),而實(shí)際上除了合并信息(mergeinfo),什么也沒(méi)有做。例如,當(dāng)因?yàn)樾誓硞€(gè)人手工修改了這個(gè)文件而合并了這個(gè)其他地方修改的變更時(shí),這非常有效,與其讓讓變更在下次合并時(shí)加入進(jìn)來(lái),從而引起文本沖突,我們不如記錄這個(gè)變更已經(jīng)合并。(細(xì)節(jié)見(jiàn)Subversion書(shū)的merge-trackingrequirements,andBlockingChanges。)–reintegrate選項(xiàng)在將分支合并回主干時(shí)使用;它會(huì)檢查一些防護(hù)措施條件并快速有效的進(jìn)行合并,更多內(nèi)容見(jiàn)Subversionbook的Keepingabranchinsync。新的svnmergeinfo命令可以顯示一個(gè)目錄已經(jīng)接收的變更集,以及哪些變更集還適合接收,Subversion手冊(cè)的MergeinfoandPreviews有更多信息。svnlog和svnblame命令有了新的-g(--use-merge-history)選項(xiàng),使之將mergeinfo納入考慮,如果沒(méi)有提供這個(gè)選項(xiàng),它們就會(huì)參考合并信息。
使用-g選項(xiàng)的原因是有時(shí)候忽略合并歷史會(huì)更好,在blame輸出中,有時(shí)候你希望看到合并變更的人物B,而有些時(shí)候你希望看到最初作出這些修改人物A;使用-g可以得到后者的信息。在日志輸出中,你有時(shí)候希望看到某一行提交的修訂版本,而有時(shí)你希望看到最初的修改做合并修訂版本轉(zhuǎn)移走了;再次,-g顯示后者的信息(使用”Mergedvia:“標(biāo)識(shí),后面是合并發(fā)生的修訂版本號(hào)碼),見(jiàn)Subversion手冊(cè)的Merge-SensitiveLogsandAnnotations。Subversion合并跟蹤和兼容性前面已經(jīng)說(shuō)了,在隨server升級(jí)版本庫(kù)以前不支持合并跟蹤。
如果你正在使用svnmerge包裹程序來(lái)進(jìn)行合并,而現(xiàn)在希望使用Subversion1.5本身的合并跟蹤功能功能,你一定要使用svnmerge-migrate-history.py腳本來(lái)轉(zhuǎn)化svnmerge的自定義屬性為Subversion使用的svn:mergeinfo屬性。
已知問(wèn)題1.5.0的合并跟蹤還有許多已知的問(wèn)題,我們首先解決了最重要的,下面是:
◆issue#3128:merge--reintegrate應(yīng)該更好的處理重命名
◆issue#2897:對(duì)反向合并的更好支持
◆issue#3126:更好已知變更報(bào)告(svnmergeinfo顯示了太少或太多的合適修訂版本)
◆issue#2837:當(dāng)執(zhí)行循環(huán)合并時(shí)合并跟蹤能起效果
◆issue#3056:防止以智能方式重復(fù)合并
◆issue#2898:當(dāng)刪除/添加子時(shí)無(wú)需處理合并信息
◆issue#3067:在合并范圍內(nèi)不存在的樹(shù)不應(yīng)該破壞合并
◆issue#3157:從路徑的自然歷史合并變更會(huì)創(chuàng)建引用自己的合并信息
◆issue#3174:合并算法需要對(duì)重命名的子樹(shù)特別關(guān)注
(可以看listofallmerge-relatedopenissues,盡管很多不是關(guān)于Subversion合并跟蹤)
Issue#3157可能是會(huì)很容易遇到的,所以下面是如何解決這個(gè)問(wèn)題的詳細(xì)描述:合并跟蹤信息現(xiàn)在可以保存在路徑的“本身歷史”中,當(dāng)從trunk的特定修訂版本x創(chuàng)建了一個(gè)分支,然后將分支的所有變更合并回trunk時(shí),如果沒(méi)有明確的限制合并范圍并且沒(méi)有使用--reintegrate選項(xiàng)時(shí),后果是,trunk的合并跟蹤信息將會(huì)列出x之前的信息。這對(duì)以后的合并操作沒(méi)有壞處,但是對(duì)于trunk上的svnlog-g會(huì)使用以前修訂版本的合并跟蹤信息(而不只是HEAD)。
注意,這一定不會(huì)是一個(gè)發(fā)布分支(也叫做“維護(hù)分支”)的問(wèn)題,因?yàn)橐粋€(gè)人通常不會(huì)將其合并回主干,相反,推薦的時(shí)間是對(duì)于進(jìn)入trunk的新變更使用特性分支,可以在分支的生命周期結(jié)尾一次合并到主干。 一個(gè)辦法是在提交合并修訂之前修正合并跟蹤信息,通過(guò)恢復(fù)“本身歷史”信息:svnmerge--record-only-rX:1。另一個(gè)方案是完全防止這種情形,通過(guò)在第一次就明確的指定合并范圍,例如-rX:HEAD,更多信息可以看這個(gè)郵件。 當(dāng)Subversion合并一個(gè)特性分支,最佳方案是使用--reintegrate選項(xiàng)。
【編輯推薦】