Subversion合并本地更改主干到分支

时间:2009-12-09 11:41:59

标签: svn svn-merge

在我的本地Subversion工作副本中,我有一个trunk和一个代码分支的副本。我已在主干中进行了更改,并希望将这些更改复制到我的(当前干净的)本地分支副本。

我知道我可以将代码签入trunk,然后使用svn merge将更改发送到分支,但有没有办法在没有先检查更改的情况下执行此操作?

可悲的是,diff / patch不起作用,因为我的中继和分支之间的更改周围的代码发生了变化。我知道svn merge可以应对这些问题,但正如我所说,我宁愿不必先检查我的更改。

编辑添加示例:

主干有一个包含以下内容的文件:

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

在trunk中,我在dragon fruit下面的pear添加了我的工作副本中的trunk文件。如果我要检查更改并使用merge将其复制到分支,Subversion会在文件的分支版本中正确地在dragon fruit下面添加pear

我的trunk文件副本上的

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,而不是{{1}两个文件都改变了/ orange差异。

4 个答案:

答案 0 :(得分:4)

您可以svn switch将工作副本的副本发送到分支机构。

但是,最安全的做法是将更改提交到私有分支,并使用svn merge将它们合并到您需要的任何位置。

答案 1 :(得分:1)

switchmergediff都没有解决您想要移植的某些更改以及您没有进行某些更改的问题(假设更改位于同一组文件;如果它们在不同的文件中,则只能移植相关文件。)

在任何情况下,您都必须有一些方法来区分您要应用于分支的变更集,应用它,然后继续对主干进行其他修改。

我会使用WinMerge,TortoiseMerge或类似工具来比较分支和主干之间的相关文件,并逐步执行它并仅应用您想要的更改。

答案 2 :(得分: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创建的,并且您要导入的更改位于主干的修订版56中

  1. svn up /path/to/branch-WC
  2. svn up /path/to/trunk-WC -r 30
  3. svn merge svn://path/to/trunk -r 55:56 /path/to/trunk-WC
  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
  8. 您在这里所做的是将主干更新到与创建分支的位置相同的版本。这样,您生成的任何补丁都将基于相同的修订版。

    接下来,通过合并修订版55:56,你只要求“龙果”差异。由于版本55:56之间没有进行橙色/香蕉更改,因此该差异不会输入到补丁文件中。

    如果修订版56中的更改取决于以前的更改集,则可能必须解决一些冲突或合并更多修订(因为此版本30中继将不知道它们),但它应该正是您所需要的。< / p>

答案 3 :(得分: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