[英]SVN merging branch-trunk-branch
我做蠢事。 我將中繼合並到分支中以進行同步和提交,然后將分支合並到沒有-reintegrate選項並提交的中繼中。 當然,我的分支機構仍在開發過程中,我需要它,但是我正在
svn:E195016 ...僅當先前將修訂版x throug y從“ http://some.pl/trunk ”合並到重新整合的源中時,才可以使用重新整合,但不是這種情況。
不幸的是,從那時起,行李箱一直向前行駛,所以我的分店不是最新的。
修復此問題的最佳解決方案是什么?
你只是那樣做嗎? 如果是這樣,您可以使用svn merge
取消合並更改。 假設您在版本1234中將分支合並到中繼:
$ svn co $repo/trunk
$ cd $trunk
$ svn merge -c -1234 . # Removes the merge that took place in revision 1234
讓我們了解將主干合並到分支並分支回主干時會發生什么:
當您將干線合並到分支時,您正在執行三點合並 。 也就是說,您正在查看兩個開發流的分支,主干和最新的共同祖先 (MRCA)。 您不僅在尋找分支和主干上的文件之間的差異,而且還在尋找與最近的共同祖先相比在主干上發生的更改。 我不希望主干和分支匹配,我希望應用從MRCA到主干的更改,並且忽略從MRCA到該分支尖端的更改。
Subversion使用svn:mergeinfo
跟蹤從主干合並到分支中的內容。 它可以使用它來找出不再需要進入分支的更改。 這樣,您的分支可能已更改了先前合並的內容,並且您不想從中繼重新導入。
現在,讓我們看一下從分支合並回主干的過程。 如果查看主干,則看不到分支中的任何內容已合並到主干中。 畢竟,我只是在做trunk-> branch合並。 如果執行標准合並,則將考慮在分支上進行的所有更改。
這甚至包括我在主干上所做的分支更改,然后合並到分支。 畢竟,Subversion並沒有真正了解這一點的方法。 中繼上沒有任何內容顯示此合並。
但是,我通常希望此時的主干和分支都同意。 (假設我在進行重新整合之前完成了從主干到分支的最終合並)。 因此,您要進行兩點合並:您想將分支版本與主干進行比較,合並之后,主干上的版本應類似於分支上的版本。
在較舊版本的Subversion中,這是--reintegrate
參數所做的。 它迫使Subversion使用兩點合並而不是三點合並。 但是,新版本的Subversion現在可以自動了解何時進行重新集成合並。
那么,重新整合后分支機構又有什么問題呢?
svn:mergeinfo
表示從主干到修訂版100的所有修訂都已合並到您的主干中。 現在,讓我們在分支上簽出修訂版102,然后進行合並。 svn:mergeinfo
說什么? 它說從主干到版本99的所有修訂都已合並到我的分支中。 Subversion會做什么? 它將要合並版本100、101和102中的更改到您的分支中。
但是請稍等! 修訂版100未在主干上發生。 它發生在分支上。 沒關系。 修訂版102包含您要在分支上進行的更改。 但是,修訂版101是您從分支回到主干的合並。 Subversion將嘗試合並我最初在分支上所做的所有更改,然后再合並到主干中, 回到分支上! 不是很好。
該怎么辦? 有兩種解決方案:
最簡單的方法是刪除分支並重新創建它。 畢竟,在進行重新整合的那一點上,分支和主干應該已經完全相同。 從理論上講,這沒有錯。 但是,您將失去分支機構的歷史記錄。
您可以做的另一件事是讓Subversion認為您已經將Revision 101中的更改合並到了分支上,而沒有實際進行合並。 您可以自己編輯svn:mergeinfo
來做到這一點,但這可能會出錯。
更好的方法是在合並中使用--record-only
選項:
$ svn co REPO/branch/1.2
$ cd 1.2
$ svn merge -r101 --record-only $REPO/trunk
$ svn commit -m"Rev 101 was my reintegration merge from 1.2->trunk"
一切都好。 現在,當我嘗試進行合並時,Subversion會將主干上的修訂版102合並到我的分支中,而不是我的重新集成修訂版中。
實際上,如果我在重新整合合並之后--record-only
了--record-only
合並,則可以這樣做:
$ cd 1.2
$ svn merge --record-only $REPO/trunk
那是因為除我的重新整合合並外,所有其他修訂都已經在分支機構中。 我所做的只是更新svn:mergeinfo
以包含來自主干的修訂版101。
因此,對於您的第一個錯誤 ,可能還可以。 檢查中繼和您的分支在那時是否同意。 如我所說,較新版本的Subversion理解從分支合並到主干應該是重新--reintegration
合並-即使您沒有包括--reintegration
參數。 如果沒有,您可能需要做更多的工作來解決這種情況。
對於第二個錯誤,請從主干到分支執行--record-only
合並以更新svn:mergeinfo
。 如果不能,則可能必須手動修改svn:mergeinfo
。 使用svn propedit
並不難,您可以在自己喜歡的編輯器中編輯屬性。 svn:mergeinfo
的格式非常明顯,因此添加額外的修訂版本並不困難。
總記得。 這是版本控制。 沒有任何東西被永久損壞。 您始終可以返回到存儲庫的早期版本,然后重試。 您得到的最糟糕的是永久記錄到svn log
中的錯誤方法的svn log
。
如果那是您一生中發生過的最糟糕的事情,那么您已經在這個多岩石的小星球上度過了幸福的時光。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.