2009-12-09 54 views
3

在我的本地Subversion工作副本中,我有一箇中繼和代碼分支的副本。我在trunk中進行了更改,並且想要將這些更改複製到我的(當前乾淨的)分支的本地副本中。顛覆合併本地變更中繼到分支

我知道我可以在代碼中的樹幹,然後使用svn merge得到改變到分支檢查,但有沒有這樣做沒有檢查在變化的某種方式?

不幸的是,差異/補丁將無法正常工作,因爲圍繞我的主幹和分支之間的變化的代碼發生了變化。我知道svn merge可以應付這些,但正如我所說,我寧願不必首先檢查我的變化。

編輯補充一個例子:

樹幹具有包含以下文件:

File in trunk:      File in branch: 
apple        apple 
orange        banana 
pear         pear 

在樹幹,我在後備箱下面文件pear添加dragon fruit我的工作副本。如果我檢查該更改並使用合併將其複製到分支,則Subversion將在文件的分支版本中正確添加pear以下的dragon fruit

svn diff我的樹幹文件的副本產生類似於下面的內容:

Index: fruit.txt 
=================================================================== 
--- fruit.txt (revision 56) 
+++ fruit.txt (working copy) 
@@ -1,3 +1,4 @@ 
apple 
orange 
pear 
+dragon fruit 

顯然使用補丁將無法正常工作,因爲它注意到了非改變文本之間的差異。

什麼事情發生,而不必檢查什麼,是有dragon fruit在這兩個文件pear後上市,但不會有orange/banana差異改變了兩個文件。

回答

4

您可以將svn switch工作副本複製到分支機構。

但是,您最安全的選擇是將您的更改提交給私人分支,並使用svn merge將它們合併到任何需要它們的地方。

+1

但千萬首先快速備份您的磁盤上的內容。 SVN交換機盡最大努力,但沒有保證。 –

+0

svn switch看起來是我目前擁有的最佳選擇。這遠非理想,但它必須這樣做。 –

1

無論switch也不merge也不diff解決您有您想要的端口超過一定的變化,並且你不’噸(假設變化是同一組文件中的某些變化的問題;如果它們是在不同的文件,您只能移植相關文件)。

在任何情況下,您都必須有一些方法來區分您想要應用到分支的變更集,應用它,然後繼續對trunk進行其他修改。

我會使用WinMerge,TortoiseMerge或一些類似的工具來比較分支和主幹之間的相關文件,並逐步完成並應用所需的更改。

+0

我目前使用的是TortoiseMerge,但據我所知,只提供diff/patch方法來移動更改;這將不起作用,因爲分支中的代碼相對於trunk中的代碼已經發生了變化。除非你的意思是使用像TortoiseDiff/WinDiff這樣的東西來比較差異並將它們手動移動... –

1

不能應用svn diff補丁的原因是因爲中繼線中的代碼版本必須比中繼線中的更改更新。這是一種常見的情況,您可能需要分支才能使用某個功能,並繼續在主幹上工作。

爲了解決這個問題,你需要把你的分支最新與軀幹,然後應用差異。

svn merge svn://path/to/trunk /path/to/working-copy

這將使你的分支與最新版本同步。如果有任何衝突,你必須解決它們。

現在,

svn commit /path/to/working-copy -m "Merged latest trunk changes into the branch"

然後,

svn diff /path/to/trunk > my-new-code.patch

最後,

cd /path/to/working-copy patch -p0 -i /path/to/my-new-code.patch

你的分支的工作副本現在將與主幹一起更新,並且它將會有你的新變更......並且主幹的存儲庫版本將不會被觸及。

編輯:原來的問題是編輯提供更多的信息後,我現在建議如下:

這是假設,例如,該分支是基於主幹的修訂30,並創建要導入的變化是在後備箱

  1. svn up /path/to/branch-WC
  2. svn up /path/to/trunk-WC -r 30
  3. 的修訂
  4. cd /path/to/trunk-WC
  5. svn diff /path/to/trunk-WC > /path/to/branch-WC/mychange.patch
  6. cd /path/to/branch-WC
  7. patch -p0 -i mychange.patch

你在做什麼這裏正在更新樹幹同一版本的分支產生在哪裏。這樣,您生成的任何補丁都將基於相同的修訂。

接下來,通過合併修訂55:56,你問只爲「火龍果」差異。由於橙色/香蕉變化未在修訂版55:56之間完成,因此該差異不會輸入到修補程序文件中。

如果修訂版本56中的更改取決於先前的更改集,則可能必須解決一些衝突或合併更多修訂版本(因爲此修訂版本30不會了解它們),但它應該正是您所需要的。

+0

這不是一個選項,很遺憾。有問題的分支被從中繼線上切下來,以特定的發貨版本提供代碼的副本。我正在修改主幹上的錯誤修復程序,我們希望將它們應用並提供給具有以前版本的人員,而不必在主幹分支上提供所有新功能。 –

1

這個問題是老了,但還是我張貼的解決方案

http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion

總之主幹做

svn diff > ~/trunk.diff 

,然後支根

patch -p0 -i ~/trunk.diff 
+1

從問題:「可悲的是,diff/patch不起作用,因爲我的主幹和分支之間的變化周圍的代碼發生了變化。」 –

+0

@me_and在這種情況下,您首先需要將來自trunk的更改合併到分支中,這是將'trunk.diff'合併到分支中的先決條件。 –

+1

@phaedrus:從問題:「我知道'svn merge'可以應對周圍的變化,但正如我所說,我寧願不必首先檢查我的變化。」 –