在我的本地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
。
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
差异。
答案 0 :(得分:4)
您可以svn switch
将工作副本的副本发送到分支机构。
但是,最安全的做法是将更改提交到私有分支,并使用svn merge
将它们合并到您需要的任何位置。
答案 1 :(得分:1)
switch
,merge
和diff
都没有解决您想要移植的某些更改以及您没有进行某些更改的问题(假设更改位于同一组文件;如果它们在不同的文件中,则只能移植相关文件。)
在任何情况下,您都必须有一些方法来区分您要应用于分支的变更集,应用它,然后继续对主干进行其他修改。
我会使用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中
svn up /path/to/branch-WC
svn up /path/to/trunk-WC -r 30
svn merge 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中继将不知道它们),但它应该正是您所需要的。< / 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