【问题标题】:Redoing manual merge with SVN merge使用 SVN 合并重做手动合并
【发布时间】:2011-07-11 22:21:49
【问题描述】:

我正在尝试修复发生以下情况的 SVN 项目:

从主干中提取了一个功能分支 这个分支有定期提交。 当需要将分支合并回主干时,开发人员没有使用 SVN 合并,而是使用 WinMerge (!),因此我们为此丢失了所有历史记录。 此外,手动 WinMerge 中遗漏了一些小错误修复。 这发生在几周前,从那时起定期提交到主干,所以我们不能简单地恢复。

所以,我正在尝试返回并正确重做合并,但事实证明这比我想象的要复杂...

如果我尝试恢复到此“BadMerge”之前的某个点,然后进行适当的合并,我将无法重新合并 BM 之后发生的其他更改。

所以,我想我必须使用 svnadmin 转储和加载,类似于 this,但我无法确切地知道我需要做什么。

  1. 在 BM (ChangesetX) 之前转储更改。
  2. 转储 BM 后的更改 (ChangesetY.
  3. 将 ChangesetX 加载到什么位置?新的仓库?
  4. 对此进行适当的合并
  5. 加载变更集Y

这可能吗?任何帮助将不胜感激。

谢谢

汤姆

【问题讨论】:

    标签: svn merge restore svnadmin


    【解决方案1】:

    你可以做的是:

    1. 向那个显影剂扔SVN book,最好是在某种厚纸上打印输出。 (如果他能活下来,解雇他。)

    2. SVN 可以选择通过合并模式并记录哪些修订已合并到文件和文件夹属性中,但 实际上并未更改任何文件。 (使用 SVN babble:他们的“财产状态”是“改变的”,但他们的“文本状态”不是。)

    好久没用SVN命令行了,不知道怎么用,不过TortoiseSVN有这个:

    【讨论】:

    【解决方案2】:

    可能不是最优雅的方式,但在客户端可行:

    • svn 将主干的 HEAD 导出到目录 A
    • svn checkout BAD_COMMIT of trunk 到目录 B
    • 将文件从 A 复制到 B

    B 现在包含 BAD_COMMIT 之后的所有提交作为本地更改(您失去了这些提交之间的区别)。

    现在:

    • svn checkout BAD_COMMIT-1 of trunk 到目录 C
    • 将分支的 svn 合并,并将主干中分支的起点合并到工作副本 C
    • 将 C 复制到 A

    现在您在目录 A 中正确合并为 HEAD 的本地更改。提交 A。Trunk 现在已正确合并为 HEAD。

    最后:

    • svn 更新 B 到 HEAD
    • 解决冲突
    • 提交 B

    此时,您已经提交了合理的合并以及错误合并后的所有更改。您丢失了一些历史记录,但与在服务器端处理转储相比,麻烦更少。

    祝你好运!

    【讨论】:

      【解决方案3】:

      你是not limited to take what your versioning tool think is common base, 并记录像 sbi suggests 这样的合并可能是个好主意。如果所有其他方法都失败了,您始终可以通过检查文件的三个版本来手动进行合并,并直接在上面链接的答案中描述的那些上使用KDiff3。

      如果版本 X 和 Y 来自功能分支,并且版本 A 到 E 在主干上,

          A----------+
          |          |
          |          |
         \_/        \_/
          B          X
          |          |
          |          |
         \_/        \_/
          C <======= Y   Merge without being recorded by svn as a merge (right?), aka BadMerge
          |
          |
         \_/
          D
          |
          |
         \_/
          E
      

      然后重做合并检出版本A、Y 和B 并与kdiff3 合并。这将为您提供一个新的 C' 版本,该版本最好缺少 C 中引入的错误。然后你想在主干上完成其余的更改,所以合并C'、C 和E。这应该会给您一个新版本,您可以将其签入为版本F。

      我不太了解 svn,无法就您应该如何签入 C' 以及如何处理提供任何建议,但上述步骤至少应该为您提供您想要的最终结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        相关资源
        最近更新 更多