2009-02-25 105 views
30

假設人們一直在樹幹上和Subversion版本庫的一個分支上工作。我想放棄幹線上的任何更改,並將其替換爲分支的副本。在Subversion中用樹枝替換樹幹

another question所示,我可以移動或移除樹幹,然後將分支複製到樹幹。但隨後主幹的歷史被分支的歷史取代。如果我想保留後備箱的歷史記錄怎麼辦?

我想我想要的就像是一個合併,但一個目標的變化被忽略,只是取代了源。我如何在Subversion中做到這一點?這被認爲是良好的做法?

+0

您仍然可以通過瀏覽舊版本來訪問中繼歷史... – 2009-02-25 20:05:29

+0

但是任何查看文件歷史記錄的工具(例如Subclipse)只會顯示分支上的修訂。合併/複製後,我希望在主幹上看到一個新的修訂版本,其中包含從複製操作中刪除的所有添加/更改/刪除。 – 2009-02-25 20:10:43

+0

+1:我也需要這樣做。 @JW你有這個工作嗎? – 2009-10-28 16:24:54

回答

4

從分支合併到主幹的所有更改,然後解決所有衝突與

svn resolve path --accept theirs-full 

或者,你可以告訴合併這樣做:

svn merge -rX:HEAD url/of/branch trunk\wc --accept theirs-full 

這樣的合併之後,你有一個看起來像分支上的工作副本。你所要做的就是提交該中繼的工作副本。

+3

不會保留從分支點開始對trunk進行的更改(至少在沒有衝突時)?我很確定這種合併的結果不保證看起來像樹幹,但你是專家... – rmeador 2009-02-25 20:22:28

1

我不太確定我明白你想要做什麼。在分支創建後,您想要在樹幹上進行的所有更改發生什麼?在合併之後查看文件的歷史記錄時,是否希望它們不出現在日誌中?如果是這樣,那麼如果您刪除中繼並將分支複製到其位置 - 分支在分支之前與中繼共享歷史記錄,那麼這就是您將得到的結果,除了在分支之後進行的修訂外,它是相同的。

如果你想保留樹幹的歷史,但只是踩分支和合並之間所做的所有更改,這是一個稍微棘手的問題。我認爲如果你做了一個忽略祖先的合併(有一個選項--ignore-ancestry),它將用分支替換主幹的內容。您也可以嘗試使用合併的--force選項(代替--ignore-ancestry並與之相結合)。嘗試幾種不同的方法,看看你是否得到你想要的結果...

如果失敗了,你可以反向合併自分支點以來的所有變化,然後在分支中合併。這似乎可能會導致一些衝突,您當然想要使用分支中的版本來解決這些衝突。我不知道這些想法是否是最佳的。

4

Pre-1.5這很簡單:確保你的工作拷貝指向trunk,然後執行「svn合併url-of-trunk分支」。您收到的更改是主幹和分支之間的增量,有效地「給我所需的所有東西,使樹幹看起來像分支。」

我不知道1.5的新合併功能是否會改變這種情況。

32

雖然它的一個很老的線程,但還是分享我的經驗

最近,我們這樣做是爲了我們的項目之一,其次爲準則:

svn copy <repos/trunk> <repos/tag/old_trunk> -m "copied old trunk as tag" 

svn delete <repos/trunk> -m "deleted trunk temporarily" 

svn copy <repos/branch/new_fetaure_branch> <repos/trunk> -m "placed new trunk with features" 

按照這些步驟保持後備箱的歷史完好無損並將新功能分支替換爲中繼。

0
trunk  remplace (trunk with your branch) 
*----x  * ----> 
\   | 
    \   | 
    *--------| 
    branch 

這個分支從主幹創建,所以要小心不要粗暴地刪除幹線(問題與祖先)。首先做一個標記與你的軀幹,您的備份,在任何情況下...

我建議這樣做:

使用Eclipse SVN

  1. 點擊右鍵>團隊分公司/標籤(創建一個標籤 - 你的備份)

  2. 團隊>切換另一個分支/標籤...選擇你的分支,確保分支正確加載。

  3. 分支:Team> disconnect。刪除SVN信息。

  4. 團隊>共享項目...選擇你的樹幹。

  5. 團隊>提交您的幹線。

  6. 點擊右鍵...選擇與...分支/標籤 - >尋找您的分支。如果一切正常,您將擁有:「所選輸入之間沒有差異。」

我希望它有幫助。