仅当先前从 <URL> 合并修订 X 到 Y 以重新集成源时,才能使用重新集成,但情况并非如此

Posted

技术标签:

【中文标题】仅当先前从 <URL> 合并修订 X 到 Y 以重新集成源时,才能使用重新集成,但情况并非如此【英文标题】:Reintegrate can only be used if revisions X through Y were previously merged from <URL> to reintegrate the source, but this is not the case 【发布时间】:2011-06-11 21:03:13 【问题描述】:

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

今天,我想我会重新整合分支。我从 Tortoise 中选择了“重新集成分支”并收到以下错误消息:

仅当修订 4709 到 5019 之前从 http://subversion/svn/saxdev/trunk 合并到重新集成源时,才能使用重新集成,但情况并非如此

然后列出了大约 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 版的日志中得到了这个

操作:添加路径:/branches/qst 从路径复制:/trunk

对我来说,该错误消息表明该分支最初不是来自主干,这是不正确的。

有什么想法吗?

【问题讨论】:

好的。我不再使用 Subversion,但会相信你的话! 谢谢老兄。我认为页面更适合它。 【参考方案1】:

如果您在一个分支上工作,并且一直在与其他人的工作保持同步,那么当您创建主干的工作副本并尝试重新集成您的分支时,如果您收到如下消息,您可能会感到困惑:

$ 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 上看到了许多解决方法,但它们让我感到紧张,因为它们是“黑客”。为了解决这个问题,我决定只做消息中暗示的颠​​覆。我回到我的分支并明确合并了指定的修订:

$ 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.

一旦我这样做了,我就可以毫无问题地返回到主干的工作副本并重新集成分支。

希望对你有帮助

【讨论】:

不错! “只做消息中暗示的颠​​覆”。 :) 我同意,更受欢迎的答案很诱人,但正确修复它可能更好。我必须从后备箱转到特定的有问题的文件并svn merge 这对我很有用。主要的技巧是乌龟没有告诉我问题的修订。升级我的命令行 svn 客户端后,我能够让它像你一样给我一条消息,然后能够合并问题修订并返回到主干。 这对我不起作用,因为列出的“缺失”合并已经在分支中完成(重新集成源)。 虽然这个答案听起来很合理,但它对我不起作用。我不断收到相同的错误消息。有帮助的是从列出的文件中删除 svn:mergeinfo 属性,就像接受的答案所暗示的那样。【参考方案2】:

[[虽然我的解决方案过去对我有用,但它可能会导致现代 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 .

然后你可以删除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 ...

完成此操作后,我的合并执行良好。

【讨论】:

这确实帮助我解决了我的问题,但我的问题是由于合并来自子文件夹的修订而不是在根文件夹上执行此操作。我的问题是 - 我已经执行了合并,但根文件夹没有识别出合并已经发生,这意味着我必须使用缺少的修订号手动更新 mergeinfo 道具。 注意 我只能这样做,因为修订版没有其他文件更改,如果需要合并其他文件会导致意外行为 - 如果是这种情况,您将需要重新合并修订版. 在 TortoiseSVN 中,您可以右键单击该文件,选择“TortoiseSVN” --> “属性”并删除 svn:mergeinfo 属性。 @StephenKennedy 您可能会遇到重用已重新集成的分支的问题。如果是这样,请查看svnbook.red-bean.com/en/1.7/… 的最后一部分,以“一旦从分支到主干完成 --reintegrate 合并,该分支不再可用于进一步的工作。” +1。您不需要删除所有的合并信息;只是那些缺少范围的。请参阅my answer,了解通过过滤 TortoiseSVN 错误输出来仅删除问题 mergeinfos 的方法。 -1。除非您确实确定自己在做什么,否则不应删除 mergeinfo 属性。很多人可能会阅读这篇文章,删除这些属性,并无意中引入其他问题。 Paul Whipp 有一个更好的答案。【参考方案3】:

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

点击错误文本并按CTRL + A, CTRL + C复制所有文本.

将文本粘贴到此 PowerShell 脚本的此处字符串中:

@"
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 $_" 

该脚本提取存在问题的文件的相对路径 mergeinfo 并输出一个命令列表来修复每个命令。

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

执行脚本输出删除问题mergeinfos所需的命令。

在本例中,脚本将产生以下输出:

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's answer 一样,现在您应该将更改提交到分支并尝试再次重新集成。这次应该可以了!

【讨论】:

在重新集成之前很久,我确实从我的分支合并(而不是重新集成)一些对主干的更改,因为当我打算提交到主干时我不小心提交到我的分支。这可能是这些重新集成错误背后的原因吗? 在我的情况下,这似乎正是导致此问题的原因。感谢您花时间编写脚本! @Sam 很高兴你发现它有帮助。您是否需要用 \s+ 替换文字空间以使其适合您? 排序;它需要更多的+ 才能为我工作。在我的例子中,有些行有两个空格,而其他行有三个,因此需要支持可变数量的空格。我不知道为什么我把空间改成了\s;这可能是不需要的,很抱歉那部分! @Sam 不用担心,但我现在将它改回文字空间,直到 TortoiseSVN 开始将它与制表符或其他任何东西混合在一起 :-) 我已经离开了 +,因为它是对你有用。【参考方案4】:

实际上,我使用“合并两个不同的分支”选项修复了它,将主干和分支合并到我的工作副本中。然后我把它提交给了后备箱。

太棒了

【讨论】:

这个答案并没有真正解释你做了什么。没有示例,甚至没有指向手册必要部分的链接。 事后看来,不,它没有。但是,由于这是我在与问题同一天的答案,因此这是几个月来最好的答案。我想假设你仍然使用 Tortoise SVN 1.6 是有道理的。我现在已经接受了格雷的答案作为接受的答案。 示例:svn merge ^/tags/w.x ^/tags/y.z 。当我使用 1.8 并合并到合并源具有先前从主干合并到其中的特定修订的主干时,会弹出重新集成错误。 1.8 似乎决定尝试重新整合合并,但事实并非如此。与 1.6 的试运行合并可以正常工作,但两个 URL 合并也适合。 在 1.8 中失败的确切场景是从一些修订版本中复制标签以进行补丁发布,通过合并到补丁标签中来挑选从主干到反向端口的更改,进一步更改为修补的标签,并将其合并回主干。基本标记和修补版本之间的更改需要合并回主干,并且 2 URL 合并可以解决这个问题。 我应该先阅读这个答案,然后再花 3 天时间试图了解发生了什么。我仍然不明白为什么我会遇到这个问题,但怀疑@Nick 的评论是原因 - 现在一切正常,我不会再看下去了......【参考方案5】:

在 tortoise SVN 中对我有用的东西:不要合并分支中的所有修订,而是选择特定范围并手动从分支中选择所有修订。

【讨论】:

感谢您提出这样一个基本的想法。在所有答案中,这不仅是最不复杂的,而且是唯一对我有用的答案。【参考方案6】:

按照 SVN 告诉你的去做。

    从 SVN 告诉你的 Reversion 中合并分支 从分支重新集成到主干

【讨论】:

对我不起作用。分支中已经存在更改。您的说明看起来应该适用于某些情况,但它们似乎是基于假设,因此它们似乎并不通用。【参考方案7】:

另请参阅我的回答here,了解我对类似案例的经验。我不确定这是否是您的问题的根源,但是当两个更改相互取消时,Subversion 1.8 的 mergeinfo 确实存在问题。

【讨论】:

【参考方案8】:

我在使用分支的部分结帐后收到此错误。我使分支与主干保持同步,但未检出的部分分支的主干修订当然没有更新。解决方法是对分支进行全面检查,然后合并所有主干更改。将这些提交到分支后,我可以成功地将分支合并到主干。

【讨论】:

【参考方案9】:

遇到这个问题

TortoiseSVN 1.9.7,内部版本 27907 - 64 位,2017/08/08 19:34:38 Subversion 1.9.7,-release 4 月 1.5.2 日 apr-util 1.5.4 农奴1.3.9 OpenSSL 1.0.2l 2017 年 5 月 25 日 zlib 1.2.8 SQLite 3.14.1

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

在此处添加此内容以帮助正在使用 Tortoise SVN 的人

【讨论】:

【参考方案10】:

我遇到了这个问题。我在我的分支上做了一个 SVN 日志,以查找我是否已将主干合并到我的分支。

我注意到所有的修订。

然后我通过手动指定修订将我的分支合并到主干。如果我合并了主干,我指定了所有范围以排除修订。我设法合并了我的分支。

我不得不对 mergeinfo 进行一些还原,但我合并了我的代码。

我立即删除了我的分支。

【讨论】:

【参考方案11】:

我知道这是一篇旧帖子,但我也一直在努力解决这个问题,直到我发现错误消息中列出的文件存在 SVN 属性问题。

我在有问题的文件上右击:TortoiseSVN > Properties,发现该文件有两个svn:mergeinfo,其中一个没有从data继承。所以我删除了那个mergeinfo。

我使用 TortoiseSVN 1.12.2,内部版本 28653 - 64 位。

【讨论】:

以上是关于仅当先前从 <URL> 合并修订 X 到 Y 以重新集成源时,才能使用重新集成,但情况并非如此的主要内容,如果未能解决你的问题,请参考以下文章

Subversion:如何找到所有未合并到主干的修订?

仅当先前的加入未找到任何内容时才离开加入

Tortoisesvn 跳过记录合并信息

如何仅从 xml 文件中提取特定部分并合并它们?

jqGrid合并表头

如何找到我从分支合并的最后一个修订?