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

Svn Subversion将本地更改合并到主干到分支,svn,svn-merge,Svn,Svn Merge,在我的本地Subversion工作副本中,我有一个主干和一个代码分支的副本。我已在主干中进行了更改,希望将这些更改复制到分支的本地副本(当前已清除) 我知道我可以将代码签入主干,然后使用svn merge将更改获取到分支上,但是有没有什么方法可以在不首先签入更改的情况下执行此操作 遗憾的是,diff/patch不起作用,因为围绕我在主干和分支之间的更改的代码中有更改。我知道svn merge可以处理这些问题,但正如我所说的,我不想首先检查我的更改 编辑以添加示例: 主干有一个包含以下内容的文件:

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

我知道我可以将代码签入主干,然后使用
svn merge
将更改获取到分支上,但是有没有什么方法可以在不首先签入更改的情况下执行此操作

遗憾的是,diff/patch不起作用,因为围绕我在主干和分支之间的更改的代码中有更改。我知道
svn merge
可以处理这些问题,但正如我所说的,我不想首先检查我的更改

编辑以添加示例:

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

File in trunk:                       File in branch:
apple                                apple
orange                               banana
pear                                 pear
Index: fruit.txt
===================================================================
--- fruit.txt  (revision 56)
+++ fruit.txt  (working copy)
@@ -1,3 +1,4 @@
 apple
 orange
 pear
+dragon fruit
在主干中,我在我的工作副本的主干文件中添加
dragonfruit
以下
pear
。如果我在中检查更改并使用merge将其复制到branch,Subversion将在文件的branch版本中正确地将
dragon fruit
添加到
pear
下面

svn diff
在我的主干文件副本上生成类似以下内容:

File in trunk:                       File in branch:
apple                                apple
orange                               banana
pear                                 pear
Index: fruit.txt
===================================================================
--- fruit.txt  (revision 56)
+++ fruit.txt  (working copy)
@@ -1,3 +1,4 @@
 apple
 orange
 pear
+dragon fruit
显然,使用补丁是行不通的,因为它会注意到未更改文本之间的差异


我想做的是,不必签入任何东西,在两个文件中的
pear
后面都列出
dragon fruit
,但不要在两个文件中更改
orange
/
banana
差异。

svn可以将工作副本的副本切换到分支机构


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

无论是
switch
还是
merge
还是
diff
都不能解决您需要移植的某些更改和不需要移植的某些更改的问题(假设更改位于同一组文件中;如果它们位于不同的文件中,则只能移植相关文件)

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


我会使用WinMerge、TortoiseMerge或其他类似的工具来比较分支和主干之间的相关文件,然后逐步执行,并仅应用所需的更改。

无法应用
svn diff
修补程序的原因是主干中的代码版本必须比主干中的更改更新。这是一个错误通常情况下,您可能已经扩展到某个功能,并继续在主干上工作

要解决此问题,您需要使分支与主干保持最新,然后应用差异

svn合并svn://path/to/trunk /路径/目标/工作副本

这将使您的分支与主干保持最新。如果有任何冲突,您必须解决它们

现在,

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新代码。patch

分支的工作副本现在将与主干保持最新,并且它将有您的新更改…并且不会触及主干的存储库版本

编辑:在对原始问题进行编辑以提供更多信息后,我现在建议如下:

例如,这是假设分支是基于主干的修订版30创建的,并且要导入的更改位于主干的修订版56中

  • svn up/path/to/branch WC
  • svn上行/路径/到/中继WC-r 30
  • svn合并svn://path/to/trunk -r 55:56/path/to/trunk WC
  • cd/path/to/trunk WC
  • svn diff/path/to/trunk WC>/path/to/branch WC/mychange.patch
  • cd/path/to/branch WC
  • patch-p0-i mychange.patch
  • 您在这里所做的是将主干更新为与创建分支的位置相同的版本。这样,您生成的任何修补程序都将基于相同的版本

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


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

    这个问题很老,但我仍然发布了正确的解决方案

    简言之,干什么

    svn diff > ~/trunk.diff
    
    然后在树根上

    patch -p0 -i ~/trunk.diff
    

    但一定要先快速备份磁盘上的内容。SVN switch尽了最大努力,但没有保证。SVN switch看起来是我目前的最佳选择。它远不理想,但必须这样做。我现在使用的是OrtoiseEmerge,但据我所知,这只提供了一种区分/修补方法来转移更改;而at不起作用,因为分支中的代码相对于主干中的代码发生了更改。除非你是说使用类似于OrtoiseDiff/WinDiff的东西来比较差异并手动移动它们…遗憾的是,这不是一个选项。所讨论的分支被从主干中切断,以提供特定已发布版本的代码副本。我正在制作主干上的错误修复,我们希望将其应用并提供给拥有以前版本的用户,而不向他们提供主干分支上的所有新功能。问题是:“很遗憾,diff/patch不起作用,因为围绕我在主干和分支之间的更改的代码中有更改。”@me\u在这种情况下,您