重做手动合并SVN合并

时间:2011-03-09 13:53:51

标签: svn merge restore svnadmin

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

功能分支取自主干 这个分支经常提交。 当将分支合并回主干时,开发人员不使用SVN合并,而是使用WinMerge(!),因此我们失去了所有历史记录。 此外,手动WinMerge中还有许多小错误修复。 这发生在几个星期前,从那时起经常提交到主干,所以我们不能简单地恢复。

所以,我试图回去并正确地重做合并,但事实证明这比我想象的要复杂得多......

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

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

  1. 在BM之前转储更改(ChangesetX)。
  2. 转发后更改BM(ChangesetY。
  3. 加载ChangesetX到什么?一个新的回购?
  4. 正确合并此
  5. Load ChangesetY
  6. 这可能吗?任何帮助将不胜感激。

    谢谢

    汤姆

3 个答案:

答案 0 :(得分:1)

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

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

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

现在:

  • svn checkout BAD_COMMIT-1 of trunk进入目录C
  • 执行你的分支的svn合并,以及你的分支在trunk中的起点到工作副本C
  • 将C复制到A

现在,您在目录A中具有正确的合并作为对HEAD的本地更改。提交A. Trunk现在具有正确的HEAD合并。

最后:

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

此时你提交了一个合理的合并,并且在合并错误后进行了所有更改。您丢失了一些历史记录,但在服务器端使用转储时麻烦较少。

祝你好运!

答案 1 :(得分:1)

你能做的是:

  1. SVN book扔给该开发者,最好以打印输出的形式放在某种沉重的纸张上。 (如果他能够幸存下来,解雇他。)

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

  3. 我暂时没有使用SVN命令行,所以我不知道如何使用它,但是TortoiseSVN有这个:

    enter image description here

答案 2 :(得分:0)

你是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

然后重做合并签出版本AYB并与kdiff3合并。这将为您提供一个新的C'版本,最好缺少C中引入的错误。然后,您希望在主干上完成其余更改,因此合并C'CE。这应该会为您提供一个新版本,您可以将其作为版本F签入。

我不知道svn是否足以提供有关如何签入C'以及如何处理的建议,但上述步骤至少应该为您提供所需的最终结果。