Reintegrate 只能在之前从 <URL> 合并修订版本 X 到 Y 的情况下才能用于重新整合源代码,但这并不是现在的情况。

130

我一直使用Tortoise 1.6的SVN分支,定期将主干合并到分支中以保持最新状态。

今天,我想重新整合该分支。我从Tortoise选择了“重新整合一个分支”,收到以下错误信息:

只有在之前从http://subversion/svn/saxdev/trunk向回合并了4709到5019个修订版本后才能使用重新整合功能,但事实并非如此

然后列出了大约50个文件及其描述,例如:

Error: branches/qst/kobalt/sax/businessobjects/util/HistoryParent.java

Error: Missing ranges: /trunk/kobalt/sax/businessobjects/util/HistoryParent.java:4709-5018

修订版5019是最新的版本,修订版4737是我创建该分支的版本。

我在修订版4737的日志中看到了以下内容:

Action: Added Path: /branches/qst Copy from path: /trunk

对我来说,这个错误信息表明该分支不是从主干创建的,但事实并非如此。

有什么想法吗?


1
好的。我现在不怎么使用Subversion了,但我会相信你的话! - colinjwebb
1
谢谢,伙计。我认为页面变得更好了。 - Gray
11个回答

145

如果你正在一个分支上工作,并一直将其与其他人的工作保持同步,当你创建主干的工作副本并尝试重新集成你的分支时,如果出现类似以下的消息,你可能会感到困惑:

$ svn merge --reintegrate https://server.blah/source/orb/branches/bronze_services
svn: Reintegrate can only be used if revisions 650 through 694 were previously merged from
     https://server.blah/source/orb/trunk to the reintegrate source, but this is not the
     case:
  branches/bronze_services/occl
    Missing ranges: /trunk/occl:650-693

我在Google上看到了一些解决方法,但它们让我感到很紧张,因为它们是“hack”。为了解决这个问题,我决定按照subversion在消息中的提示去做。我回到我的分支,并明确地合并了指定的修订版:

$ svn merge -r 650:693 https://server.blah/source/orb/trunk
$ svn commit -m 'merged revisions 650:693 from trunk'
    Sending        occl
Committed revision 695.

我这样做后,能够毫无问题地返回到主干的工作副本并重新集成分支。


18
好的!“按照提交信息提示的做就可以了”。 :) - Adam
7
我同意,更普遍的答案很诱人,但最好还是正确修复它。我不得不去到具体有问题的文件,并从主干使用 svn merge 命令合并它。 - Steve Kehlet
1
这对我非常有效。主要的诀窍是Tortoise没有告诉我问题修订版本。在升级我的命令行svn客户端后,我能够得到像你一样的消息,然后能够合并问题修订版本并返回到主干。 - user12861
7
这对我没有起作用,因为列出的“缺失”合并已经在分支中完成(重新整合源)。 - Sam
7
虽然这个答案听起来合理,但对我没用。我一直得到相同的错误信息。有帮助的是从列出的文件中删除svn:mergeinfo属性,就像被接受的答案所建议的那样。 - Krisztián Balla
显示剩余6条评论

87

[[虽然我的解决方案过去曾经对我有效,但是它可能会导致现代SVN客户端出现不正确的结果。在我们的情况下,合并错误似乎是自动化的副产品,这些自动化混淆了我们的SVN历史记录而不是真正的活动。我将其保留在此以备后用,但请考虑接受的答案。]]

对我来说解决方案是删除某些文件层次结构中与单个文件无关的 svn:mergeinfo 属性。

svn merge --reintegrate svn+ssh://svn/usr/local/svn/repos/all/trunk 
svn: Reintegrate can only be used if revisions 18765 through 18921 were
    previously merged from svn+ssh://svn/usr/local/svn/repos/all/trunk to the
    reintegrate source, but this is not the case:
trunk/proj/src/main/java/com/foo/furniture.java
Missing ranges: /trunk/proj/src/main/java/com/foo/furniture.java:18765-18920

要查找包含合并信息的文件,可以执行以下操作:

cd ~/svn/branches/2.7
svn propget -R svn:mergeinfo .

然后您可以删除合并信息属性:

svn propdel svn:mergeinfo proj/src/main/java/com/foo/furniture.java ...
svn commit -m 'removed mergeinfo' proj/src/main/java/com/foo/furniture.java ...

完成之后,我的合并顺利执行。


2
这真的帮助我解决了我的问题,但是我的问题是由于从子文件夹合并修订版本而不是在根文件夹上进行。我的问题是-我已经执行了合并,但是根文件夹没有意识到合并已经发生,这意味着我必须手动使用缺失的修订号更新合并信息属性。注意我之所以能够这样做,是因为该修订中没有其他文件更改,如果其他文件需要合并,则会导致意外行为-如果是这种情况,则需要重新合并修订。 - ExecutionOrder
5
在TortoiseSVN中,您可以右键单击该文件,选择“TortoiseSVN”-->“属性”,然后删除svn:mergeinfo属性。 - StarCub
3
你可能遇到了重复使用已经被重新整合的分支的问题。如果是这样,请查看http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate的最后一部分,从“一旦从分支到主干完成了--重新整合合并,该分支就不能再用于进一步的工作。”开始阅读。 - AlexMA
6
你不需要删除所有合并信息,只需删除其中缺少范围的合并信息。参考我的回答,使用TortoiseSVN错误输出过滤器的方法可以仅删除有问题的合并信息。 - Iain Samuel McLean Elder
5
除非你对自己要做的事情非常确定,否则不应删除合并信息属性。很多人可能会阅读这个内容,删除这些属性,无意中引入其他问题。Paul Whipp有更好的回答。 - Bizmarck
显示剩余6条评论

16

如果您尝试将分支重新集成到主干,并且从TortoiseSVN看到此类错误:

Merge reintegrate test only failed!: "Reintegrate can only be used if some revisions were previously merged from trunk, but this is not the case"

单击错误文本,按CTRL+ACTRL+C复制所有文本。

将文本粘贴到此PowerShell脚本的here-string中:

@"
Command: Reintegrate merge http://svn.cloudcorp.com/branches/myproject into C:\Users\iain\Documents\Repositories\CloudCorp\trunk  
Error: Reintegrate can only be used if revisions 18089 through 18612 were previously  
Error:  merged from http://svn.corp.skyscanner.local/svn/SkyScannerDatabase/trunk to  
Error:  the reintegrate source, but this is not the case:  
Error:    
Error:  branches/myproject/userdata/usermanagementservice  
Error:   
Error:     Missing ranges:  
Error:  /trunk/userdata/usermanagementservice:18365,18404  
Error:    
Error:  branches/myproject/userdata/auto_create_db.sql  
Error:   
Error:     Missing ranges:  
Error:  /trunk/userdata/auto_create_db.sql:18406  
Error:   
Error:    
Error:  branches/myproject/userdata/create_audit_tables_triggers_uds.sql  
Error:   
Error:     Missing ranges:  
Error:  /trunk/userdata/create_audit_tables_triggers_uds.sql:18406  
"@ -split "`n" |
? { $_ -match ('Error: +branches') } |
% { $_.Substring($_.IndexOf('userdata')) } |
% { "svn propdel svn:mergeinfo $_" }

该脚本提取具有问题合并信息的文件的相对路径,并输出每个文件修复所需的命令列表。

您可能需要更改'userdata'值以适应您的存储库结构。

执行该脚本以输出您需要删除问题合并信息所需的命令。

在此示例中,该脚本将生成以下输出:

svn propdel svn:mergeinfo userdata/usermanagementservice  
svn propdel svn:mergeinfo userdata/auto_create_db.sql  
svn propdel svn:mergeinfo userdata/create_audit_tables_triggers_uds.sql  

在命令提示符下,您可以导航到分支基础(myproject)并执行命令以删除问题合并信息。

您应该看到类似于以下的输出:

property 'svn:mergeinfo' deleted from 'userdata\usermanagementservice'.
property 'svn:mergeinfo' deleted from 'userdata\auto_create_db.sql'.
property 'svn:mergeinfo' deleted from 'userdata\create_audit_tables_triggers_uds.sql'.

就像Gray的回答中所述,现在您应该将更改提交到分支并尝试重新集成。这次应该可以成功!


1
在重新整合之前,我曾将我的分支中的一些更改与主干合并(而不是重新整合),因为我在提交时错误地提交到了我的分支,而本来应该提交到主干。这可能是导致这些重新整合错误的原因吗? - Iain Samuel McLean Elder
@Sam 很高兴你觉得有帮助。你需要用\s+替换字面空格才能让它对你起作用吗? - Iain Samuel McLean Elder
有点像;更需要的是+才能让它对我起作用。在我的情况下,有些行有两个空格,而其他行有三个空格,因此需要支持可变数量的空格。我不确定为什么我把空格改成了\s;那可能是不必要的,所以对此我很抱歉! - Sam
@Sam 不用担心,但是我会把它暂时改回一个字面上的空格,直到TortoiseSVN开始混合使用制表符或其他字符。我保留了 +,因为这对你很有用。 - Iain Samuel McLean Elder
@Sam 我这么一丝不苟只是因为我曾经在某些正则表达式引擎中遇到了\s与字面空格行为的微妙错误。 :-) - Iain Samuel McLean Elder
显示剩余2条评论

12

实际上,我使用了"合并两个不同分支"选项来将主干和分支合并到我的工作副本中进行修复。 然后我将其提交到了主干。

太棒了


4
这个回答并没有很好地解释你做了什么。没有示例,甚至没有链接到手册所需的部分。 - zigg
回想起来,不,它并不正确。然而,因为这是我在同一天回答问题的答案,它成为了几个月内最好的答案。如果你仍在使用Tortoise SVN 1.6,我认为它还是有意义的。但现在我已经接受了Gray的答案作为被采纳的答案。 - colinjwebb
当我使用1.8版本将合并源合并到主干时,出现了重新整合错误。这个合并源之前已经从主干中合并了一个特定的修订版本。1.8似乎认为正在尝试重新整合合并,但实际上并不是。使用1.6的模拟合并可以正常工作,但两个URL的合并也适用。 - Nick
1
1.8版本失败的确切情况是,将标签从某些修订版本复制到补丁发布中,从主干中挑选一个更改通过合并到已打好补丁的标签进行后移,对已打好补丁的标签进行进一步更改,并将其合并回主干。需要将基本标签和已打好补丁版本之间的更改合并回主干,而2个URL的合并对此非常有效。 - Nick
在花费了三天的时间试图理解发生了什么之前,我应该先阅读这个答案。我仍然不明白为什么会出现这个问题,但怀疑@Nick的评论是原因——现在事情正在运作,我不会再深究了... - Dave Richardson
@DaveRlz 不确定这是否与我评论的相关,但即使在1.9中,我发现合并到特定项目而不是整个WC可能会导致svn:mergeinfo属性处理错误,影响特别是再整合合并。最近花了几个小时使用--record-only和一些手动合并信息编辑成功地省略合并信息。主干中的一些合并信息属性记录了来自主干的合并,即对自身。因此,合并信息处理仍然有问题。尽管如此,我已经学会了小心处理并解决它。 - Nick

7
在tortoise SVN中,我使用的方法是:不要合并所有分支版本,而是选择特定的范围并手动从分支中选择所有需要合并的版本。

1
谢谢您提供这么基础的想法。在所有答案中,这不仅是最简单的,而且是唯一对我有效的一个。 - redman

3

按照SVN所提示的进行操作。

  1. 将分支从SVN告知您的版本合并。
  2. 从分支重新集成到主干。

4
对我没用,变更已经存在于该分支中。你的指示看起来应该适用于某些情况,但似乎基于一种假设,因此并不普适。 - Sam

1

在以下版本中出现了此问题:

  • TortoiseSVN 1.9.7,Build 27907 - 64位,2017/08/08 19:34:38
  • Subversion 1.9.7,-release
  • apr 1.5.2
  • apr-util 1.5.4
  • serf 1.3.9
  • OpenSSL 1.0.2l 25 May 2017
  • zlib 1.2.8
  • SQLite 3.14.1

右键单击要合并的分支(但是收到此消息),选择“更新到修订版”选项,然后在打开的对话框中(如下所示的屏幕截图)选择这些修订版,然后单击“确定” - 合并所有先前的修订版后,您将不会收到此消息。

enter image description here

在这里添加一些内容,以帮助正在使用Tortoise SVN的人


1

在使用分支的部分检出后,我遇到了这个错误。我一直在保持分支与主干同步,但未检出的分支部分的主干修订版本当然没有被更新。解决方法是完全检出分支,然后合并所有主干更改。在将这些更改提交到分支后,我可以成功地将分支合并到主干。


1

查看我的答案这里,了解我在类似情况下的经验。我不确定这是否是您问题的源头,但它看起来像是当两个更改相互取消时,Subversion 1.8在合并信息方面存在问题。


0
我遇到了这个问题。我在我的分支上执行了 SVN 日志,以找出我将主干合并到我的分支的位置。
我记录了所有修订版本。
然后,我通过手动指定修订版本来将我的分支合并到主干。我指定了所有范围,以排除我合并主干的修订版本。我成功地将我的分支合并了。
我必须对合并信息进行一些还原,但是我成功将我的代码合并了。
我立即删除了我的分支。

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