16

当带有合并跟踪的 SVN 工作时,它真的很棒,我喜欢它。但它一直在扭曲。我们正在使用 TortoiseSVN。我们不断收到以下消息:

错误:仅当修订版 1234 到 2345 之前从 /Trunk 合并到重新集成源时,才能使用重新集成,但情况并非如此

作为参考,这是我们正在使用的方法:

  1. 创建一个分支
  2. 在分支中开发
  3. 偶尔合并从主干到分支的一系列修订
  4. 当分支稳定时,将分支从分支重新整合到主干
  5. 删除分支

我在重新集成操作之前合并了从主干到分支的一系列修订(将范围留空,因此应该是所有修订),因此分支应该与主干正确同步。

现在,Trunk 有多个与之关联的 SVN 合并跟踪属性。应该是?还是应该重新整合不添加任何合并跟踪信息?

我们的流程有问题吗?这使得 SVN 无法使用——每 3 次重新集成中就有 1 次迫使我潜入并破解合并跟踪信息。

4

4 回答 4

10

当过去从主干到分支进行了部分合并时,有时会发生此问题。部分合并是指在整个树上执行合并但只提交其中的一部分。这将为您的树中的文件提供与树的其余部分不同步的 mergeinfo 数据。

上面的--reintegrate错误信息应该列出 svn 有问题的文件(至少在 svn 1.6 中是这样)。

您可以:

  1. 使用错误消息中的范围手动将问题文件从主干合并到分支。注意:您必须从范围的开头减去 1,因此您运行的命令将是:

    cd <directory of problem file in branch working copy>
    svn merge -r1233:2345 <url of file in trunk>
    svn commit
    

    或者

  2. 如果您确定分支中文件的内容是正确的,并且只想将文件标记为已合并,则可以使用以下--record-only标志svn merge

    cd <directory of problem file in branch working copy>
    svn merge --record-only -r1233:2345 <url of file in trunk>
    svn commit
    

(我认为你可以--record-only在整个树上使用,但我没有尝试过,你必须绝对确定没有真正的合并需要来自树干)

于 2010-09-22T15:04:15.907 回答
3

兔子跳可能是解决方案。

基本上,当您想从主干中提取这些更改时,而不是将主干更改连续合并到单个分支(branches/foo我们称之为):

  1. 将主干复制到新分支 ( branches/foo2)。
  2. 合并来自旧分支的更改(合并branches/foobranches/foo2)。
  3. 删除旧分支(删除branches/foo)。
于 2010-05-12T15:30:23.250 回答
3

您的问题是,您正试图在已经“损坏”的分支上使用 Reintegrate 合并,因为它已经完成了“半合并”。如果这是您的工作流程,我的建议是忽略重新集成并坚持修订合并。

但是,您收到错误的主要原因是 SVN 正在为您执行一些检查。在这种情况下,如果合并中有来自单个文件的额外合并信息,那么 svn 会抛出一个不稳定的问题并阻止您合并 - 主要是因为这种情况会产生您可能没有注意到的错误。这在 svn reintegrate 术语中称为子树合并(阅读 Reintegrate 到 Rescue 部分,特别是末尾有争议的 reintegrate 检查)。

您可以在执行中间合并时停止记录合并信息,或者只保留分支直到其准备就绪 - 然后合并将获取对主干所做的更改。我认为您也可以通过仅将整个主干合并到分支而不是单个文件来绕过此检查,从而使 mergeinfo 在最后重新集成时保持安全。

编辑:

@randomusername:我认为(从未仔细观察过)移动是它落入了“部分合并”陷阱。SVN 的一个很酷的特性是您可以进行稀疏结帐 - 仅获取树的部分副本。当您合并部分树时,SVN 不能说整个事物已合并,因为它显然没有合并,因此它记录的合并信息略有不同。这对重新整合没有帮助,因为重新整合必须合并所有内容回到主干,现在它发现一些位被修改而没有被合并,所以它抱怨。移动看起来是一样的——分支树的一部分现在在合并信息中的显示与预期不同。我不会为重新集成而烦恼,并坚持正常的修订范围合并。这是一个好主意,但它试图在太多不同的情况下为太多用户提供太多东西。

mergeinfo的完整故事在这里。

于 2010-05-31T23:39:34.190 回答
0

我怀疑您没有正确遵循合并说明:

“现在,使用 svn merge 和 --reintegrate 选项将您的分支更改复制回主干。您需要 /trunk 的工作副本。 您可以通过 svn checkout 获得一个,挖掘旧的主干工作副本从磁盘上的某个位置,或使用 svn 开关(参见“遍历分支”部分)。您的主干工作副本不能有任何本地编辑或包含修订的混合(参见“混合修订工作副本”部分)。虽然这些通常是合并的最佳实践,但在使用 --reintegrate 选项时需要它们。

一旦你有一个干净的主干工作副本,你就可以将你的分支合并回它:”

我在合并方面几乎没有问题。

于 2014-01-13T09:59:25.040 回答