将本地修改从主干合并到分支的Subversion操作

3
在我的本地Subversion工作副本中,我有一份trunk的副本和一个代码分支的副本。我已经在trunk上做了更改,并希望将这些更改复制到我(目前空白的)本地分支副本中。
我知道我可以将代码提交到trunk,然后使用svn merge将更改合并到分支上,但是否有某种方法可以在不先检查更改的情况下执行此操作?
不幸的是,diff/patch无法正常工作,因为在trunk和branch之间的代码中存在我的更改周围的更改。我知道svn merge可以处理这些更改,但正如我所说,我宁愿不必先检查我的更改。
编辑以添加示例:
trunk有一个包含以下内容的文件:
File in trunk:                       File in branch:
apple                                apple
orange                               banana
pear                                 pear

在主干上,我在我的工作副本中的trunk文件下添加了dragon fruit,放在pear下面。如果我提交该更改并使用合并将其复制到分支,则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

很明显,使用补丁(patch)是行不通的,因为它会注意到非更改文本之间的差异。

我想要的是,在不需要检查任何内容的情况下,在两个文件中将dragon fruit列在pear之后,但不要更改orange/banana的差异。

4个回答

4

您可以将工作副本的副本使用svn switch切换到分支。

不过,最安全的方法是将更改提交到私有分支,并使用svn merge在需要的地方合并它们。


1
但是请先快速备份您磁盘上的内容。SVN切换会尽力而为,但并不保证成功。 - Jim T
svn switch 看起来是我目前最好的选择。虽然远非理想,但只能这样了。 - me_and

1

switchmergediff都不能解决您想要移植某些更改和不想移植某些更改的问题(假设这些更改在同一组文件中;如果它们在不同的文件中,您只能移植相关文件)。

无论如何,您都必须有一种方法来区分仅应用于分支的更改集,应用它,然后继续对主干进行其他修改。

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


我目前正在使用TortoiseMerge,但据我所知,它只提供了一种diff/patch方法来移动更改;这不起作用,因为分支中的代码相对于主干中的代码已经发生了变化。除非你是指使用类似TortoiseDiff/WinDiff之类的工具手动比较差异并将其移动过去... - me_and

1

你无法应用一个svn diff补丁的原因是主干代码的版本必须比你的分支中的更改要新。这是一种常见的情况,你可能已经分支出去开发一个功能,而主干上的工作继续进行。

为了解决这个问题,你需要将你的分支更新到与主干相同的状态,然后再应用补丁。

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

这将使你的分支与主干保持同步。如果有任何冲突,你需要解决它们。

现在,

svn commit /path/to/working-copy -m "将最新的主干更改合并到分支中"

然后,

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的主干不会知道它们),但它应该正是您所需的。

很遗憾,这不是一种选项。相关分支已被从主干中切断,以提供特定版本的代码副本。我正在主干上进行错误修复,我们希望将其回退并提供给拥有先前版本的人,而不会向他们提供主干分支上的所有新功能。 - me_and

1

1
很遗憾,diff/patch不起作用,因为主干和分支之间的代码变化包围了我的更改。 - me_and
在这种情况下,您首先需要将来自主干的更改合并到分支中,这是将“trunk.diff”合并到分支所必需的先决条件。 - amit kumar
1
@phaedrus:从这个问题来看,“我知道svn merge可以处理周围的更改,但是正如我所说,我宁愿不必先检查我的更改。” - me_and

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接