簡體   English   中英

SVN合並分支機構

[英]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現在可以自動了解何時進行重新集成合並。

那么,重新整合后分支機構又有什么問題呢?

  • 版本99 :您從主干合並到分支並提交更改。 在您的分支上,` svn:mergeinfo顯示,直到修訂版99的中繼上的所有內容都已合並到分支中。
  • 修訂版100 :您將合並從主干提交到分支。
  • 修訂版100 :仍在修訂版100上,您對中繼進行檢出。 您想要從分支到主干進行重新集成合並。
  • 版本100 :您現在進行重新整合合並。 您在主干上看到svn:mergeinfo表示從主干到修訂版100的所有修訂都已合並到您的主干中。
  • 修訂版101 :您提交了中繼合並。
  • 修訂版102 :您進行了更改,並意識到這也應該放在分支機構中。

現在,讓我們在分支上簽出修訂版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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM