3

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

我知道我可以将代码签入到主干,然后用于svn merge将更改放到分支上,但是有没有办法在不先签入更改的情况下做到这一点?

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

编辑添加一个例子:

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

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

在主干中,我在工作副本的主干文件中添加dragon fruit以下内容。pear如果我检查更改并使用合并将其复制到分支,Subversion 将正确添加dragon fruitpear文件的分支版本中。

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

4 回答 4

4

您可以svn switch将工作副本的副本复制到分支。

但是,您最安全的选择是将您的更改提交到私有分支,并svn merge在您需要的任何地方合并它们。

于 2009-12-09T11:52:19.170 回答
1

既不switch也不解决您想要移植的某些更改mergediff您不想移植的某些更改的问题(假设这些更改位于同一组文件中;如果它们位于不同的文件中,则只能移植相关的文件)。

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

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

于 2009-12-09T16:30:37.780 回答
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

您在这里所做的是将主干更新为与创建分支的位置相同的版本。这样,您生成的任何补丁都将基于相同的修订。

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

如果修订版 56 中的更改依赖于以前的更改集,您可能需要解决一些冲突或合并更多修订版(因为此修订版 30 主干不会知道它们),但这应该正是您所需要的。

于 2009-12-09T16:56:11.310 回答
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
于 2012-02-20T12:48:00.027 回答