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