在Subversion中将主干合并到分支

81

我正在使用 Subversion 1.4.6 版本,目前无法升级到 1.5 版本。

情况如下:

  1. 主干进行了很多结构性的更改(例如移动文件等)。

  2. 我有一个分支最近从主干合并而来,但是在这些重大更改之前。

最佳的合并主干到分支的方式是什么?

我的想法是:

  1. 首先小心地将分支与主干合并,只合并分支中被修改的文件到主干。

  2. 将主干复制到分支。如何才能在不丢失分支历史记录的情况下完成此操作?应该弃用分支并创建一个新的吗?


好的,看起来我没有给 SVN 足够的信任。它实际上是很聪明的。我只是被 "D" 和 "A" 的输出搞糊涂了,但在后台它确实进行了移动。


4
这个问题及其答案与非常旧的SVN客户端和服务器版本有关,与SVN 1.5+,特别是SVN 1.8+无关。 - bahrep
4个回答

89

是否有什么阻止您在上次合并以来将所有修订版合并到主干(trunk)上的内容?

svn merge -rLastRevisionMergedFromTrunkToBranch:HEAD url/of/trunk path/to/branch/wc

应该完全没问题。至少如果你想将主干上的所有更改合并到你的分支上。


3
当我试运行它时,许多文件有很多“D”和“A”,因为文件已经移动到了主干上。我的问题是,在这种情况下,SVN是否记住了文件的历史记录。 - Gilad Naor
你在移动主干(trunk)中的文件时使用了 svn rename 吗?如果是这样,历史记录应该会保留。我认为你应该尝试在小范围内进行此操作——创建一个新的仓库,一个只包含单个文件的主干,以及一个包含更改的分支,在主干上执行 svn rename 并检查历史记录是否存在。 - Yuval F
1
我怎样才能知道从主干合并到分支的最后一次修订是哪一个? - Leandro López
1
在较新版本的svn中,它作为文件属性存储(在哪里?也许是根目录)。旧版本不会存储此信息,您必须手动搜索。即搜索最后合并提交的日志。(这是一个主要的不便之处。Git、Mercurial、Bazaar没有这些限制) - Ronny Brendel
2
这里有一个很好的指南:http://stereointeractive.com/blog/2009/02/17/svn-merge-trunk-changes-to-your-branch/ - David d C e Freitas
重要的是要提到,这只有在分支是新的情况下才是真实的。在我的情况下,我之所以出现了这个错误,是因为我将一个分支复制到另一个地方,然后尝试将主干合并到它上面。问题是它没有合并信息。显然,svn复制不会做到这一点 :( - Cito

18

可以通过在工作副本目录中运行此命令找到从主干合并到分支的最新修订版本:

svn log -v --stop-on-copy

4
这只停止了分支创建时的日志记录;它不显示在此之后发生的任何合并操作。 - moswald
2
因为,在@moswald的小注意事项下,这可能非常有用。我不认为有什么问题。我通常没有长期存在的分支(最多一周),因此我通常只在重新集成之前从主干中拉取。 - Andrew

14

指定要合并的版本范围的方式有些“老旧”。在1.5+中,您可以使用:

svn merge HEAD url/of/trunk path/to/branch/wc

在1.6+中,您无需使用“HEAD”,因此可以使用:

svn merge url/of/trunk path/to/branch/wc

4
我正在使用版本号为1.6.11的软件,它要求我输入一个范围。 - Brent212
19
你必须说这么多吗?在工作副本中使用“svn merge /url/of/trunk”有什么问题吗? - GreenAsJade
1
svn: E195002: 无效的合并源“HEAD”;工作副本路径只能与存储库修订版(数字、日期或head)一起使用。 - Solo
3
@Solo HEAD确实需要您指定修订版本号,但现在不再需要使用HEAD。正如GreenAsJade所提到的那样,"svn merge /url/of/trunk path/to/branch/wc" 对我有效。 - Tim Smit
2
答案应进行修订,以删除“HEAD”。 - Jeff

0
命令svn merge --help(svn cli版本1.14.1)有一个名为“特性分支合并模式”的部分,描述了您正在尝试做的事情。
帮助文本建议您在干净的工作副本根目录下运行以下命令:
svn merge ^/trunk

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