在Subversion 1.5中,当将一个分支重新整合到主干中时出现了"Missing ranges"错误消息。

32

我正在尝试将开发分支重新集成到我的Subversion 1.5存储库的主干中。在此操作之前,我将所有更改从主干合并到了开发分支。现在,当我尝试从该分支重新集成更改时,会出现以下错误消息:

Command: Reintegrate merge https://dev/svn/branches/devel into C:\trunk  
Error: Reintegrate can only be used if revisions 280 through 325 were previously   
Error: merged from https://dev/svn/trunk to the reintegrate   
Error: source, but this is not the case:  
Error:   branches/devel/images/test  
Error:     Missing ranges: /trunk/images/test:280-324  
...

这条消息继续抱怨我的项目中的一些文件夹。但是当我再次尝试将从主干到开发分支的更改合并时,TortoiseSVN告诉我没有需要合并的内容(因为我已经在之前合并了所有更改):

Command: Merging revisions 1-HEAD of https://dev/svn/trunk into C:\devel, respecting ancestry  
Completed: C:\devel  

我正在尝试按照这里的说明进行操作:http://svnbook.red-bean.com/en/1.5/svn.branchmerge.basicmerging.html,但是没有关于解决这个问题的信息。

有什么想法吗?也许我应该删除主干,然后复制我的分支?但我不确定是否安全。

另请参阅

svn merge with --reintegrate complains about missing ranges but mergeinfo seems correct


2
我曾经遇到过类似的问题,SVN认为我缺少了一个合并,但是当我尝试合并时,却没有任何需要合并的内容。请参考https://dev59.com/hmrWa4cB1Zd3GeqP6QWg。 - Ryan
5个回答

33

我们纠结于这个问题了几周,最终解决了它。

在我们的情况下,我们在一个分支上工作,这个分支每天都会合并所有主干修订版。当我们尝试重新整合它(合并回主干)时,我们遇到了这个错误。 当我们尝试将缺失的范围合并到我们的分支中时,我们收到了“没有要合并的内容”信息。这种情况发生在几个不相关的分支和不同的文件和文件夹中。

解决方法是将缺失的范围添加到我们分支中文件或文件夹的 svn:mergeinfo 属性中。

对于消息中的每个“Missing ranges:path:revision_range”行:

  • 编辑在已合并分支中提到的文件/文件夹的 svn:mergeinfo 属性
  • 在属性值的末尾添加以下字符串(例如 /trunk/images/test:280-324)
  • 保存 SVN 属性

提交所有更改,并重新整合。


2
好丑啊...但是绕过这种错误行为确实非常高效。有时候这是唯一的解决方案。 - Hervé
1
可以使用 svn propedit svn:mergeinfo path/to/file/or/folder 命令来编辑 svn:mergeinfo 属性。 - xyz

29

首先,您需要将从主干的r280到r324的版本合并到您的分支中。

看起来您已经将r325合并到了您的分支中,但是--reintegrate需要获取所有最新版本的合并。不能有任何缺口。

以下是一些诊断信息:

           +----------------------> /branches/devel
          /                    /   \<--merge not working!
 --------/-------+--+---+-----+---------> trunk
         |       \  |  /      |
        280       \ V /      325
                    V
                  missing sync merges from trunk to branch

我认为这是你的分支结构,所以你需要将主干上所有的更改同步到你的分支上。你只合并了r325,所以只需要合并r280-r324,然后执行--reintegrate命令就可以了。


4
很遗憾,情况并非如此。当我尝试将主干中第280到325次特定修订版本的更改合并到开发分支时,TortoiseSVN显示没有需要合并的内容(我之前已经合并了这些更改并提交了合并)。但是当我尝试重新整合时,出现了错误消息。 - pako
21
@pako,如果答案不正确,为什么要接受它呢?要么删除您的评论,要么不接受答案... 在这种情况下,答案是正确的,但您的评论很令人困惑。 - yegor256
2
@pako在上面的评论中与自己产生了冲突,但也接受了答案,但我可以说我也遇到了同样的问题。将所有修订版合并到我的分支中,当我尝试重新集成时,会出现“缺少范围”消息。svn,版本1.6.2(r37639)和tortoise 1.6.5(我相信)。 - butallmj
1
我曾经遇到过同样的问题。今天我设法解决了这个问题,方法是删除分支上除根文件夹上的属性之外的所有合并信息属性。如果您只在每个分支的根级别进行合并,则据我所知,那些属性实际上不应该存在。 - Dave Branton
我通过从主干合并到分支并点击“所有修订版本”来解决了这个问题 - 然后我再次从分支到主干执行了“所有修订版本”。然后,合并到主干就成功了。 - Dave Lawrence
这对我有效,但是问题中的范围是280:324,而不是280:325。 - Tim Smit

18

我曾遇到过这个问题,最终原因是我的分支中某个文件夹上的SVN属性存在错误。

解决方案很简单——我使用了特定版本号从主干合并到了我的分支,也就是那个被报告为丢失的版本号:

在这里输入图片描述

然后指定仅记录合并操作:

在这里输入图片描述

这样做可以正确地将我的分支与主干同步,并使得之后的分支重新集成到主干时不会出现缺失范围的错误信息。

这种方法避免了对任何文件/文件夹的 svn:mergeinfo 属性进行手动编辑。


依据我的经验,如果您尝试合并特定的修订版本并且报告没有可做的事情,则这是正确的答案。谢谢! - Nick Hanshaw

5

当我开始使用svn合并命令的-r选项,并且在没有它的情况下进行了合并后,我就不再遇到这些问题了。我使用的是svn 1.6.1。

以下是我的做法:
1. 当从分支合并到主干或从主干合并到分支时,我使用-r选项,如下:

 cd branchWorkArea/topDir
 svn merge -r<branchPoint>:HEAD [otheroptions] svn://svn/project/trunk/topDir
  1. 当我解决任何冲突并测试代码后,我将合并提交到分支,然后使用相同的基本选项(特别是-rBranchPoint:HEAD)将分支合并到主干。

  2. 当主干经过测试和提交后,我使用--reintegrate选项关闭该分支。确保也在其上使用-rbranchPoint:HEAD选项。

对于其他选项,我总是使用

--depth infinity (在1.6.2中默认为infinity,但以前不是)
-x -b -x -w --ignore-eol-style

也许我只是运气好,但事情似乎工作得更好。

要查找分支的分支点,请执行svn log --stop-on-copy,然后查看最后两个版本-它将是创建分支的svn副本。

在Linux上执行此操作,我会执行以下操作:

svn log --stop-on-copy svn://svn/project/trunk/topDir |
grep '^r' | tail -1 | sed -e 's/^r//1'-e 's/ .*//g'

这应该打印分支点的修订号码。

祝你好运


-1

我刚遇到了这个问题,对我有用的方法是首先将分支与主干同步,以便分支可以从主干获取最新的更新。之后,我尝试将分支重新整合到主干中,这样就可以正常工作了。


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