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