1

I'm trying to fix an SVN project where the following happened:

A feature branch was taken from trunk There were regular commits to this branch. When it came time to merge the branch back into trunk, the developer didn't use SVN merge, but WinMerge (!), so we lost all of our history for this. In addition there were a number of small bug fixes that were missed in the manual WinMerge. This happened a few weeks ago and there have been regular commits to trunk since then, so we can't simply revert.

So, I'm trying to go back and redo the merge correctly, but this is proving more complex than I'd thought...

If I try to revert to a point prior to this "BadMerge" and then do a proper merge, I can't re-merge the other changes that have happened after BM.

So, I think I have to use svnadmin dump and load, similarly to this, but I can't work out exactly what I need to do.

  1. Dump changes prior to BM (ChangesetX).
  2. Dump changes post BM (ChangesetY.
  3. Load ChangesetX to what? a new repo?
  4. Do proper merge of this
  5. Load ChangesetY

Is this possible? Any help would be greatly appreciated.

Thanks

Tom

4

3 回答 3

1

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

  • svn 将主干的 HEAD 导出到目录 A
  • svn checkout BAD_COMMIT 的中继到目录 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

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

祝你好运!

于 2011-03-09T14:13:08.890 回答
1

你可以做的是:

  1. 把SVN 书扔给那个开发者,最好是在某种厚纸上打印输出。(如果他能活下来,解雇他。)

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

我有一段时间没有使用 SVN 命令行了,所以我不知道如何使用它,但是TortoiseSVN有这个:

在此处输入图像描述

于 2011-03-09T14:16:08.760 回答
0

不限于采用您的版本控制工具认为是 common base的内容,并且像 sbi建议的那样记录合并可能是一个好主意。如果所有其他方法都失败了,您始终可以通过签出文件的三个版本来手动进行合并,并直接在上面链接的答案中描述的那些版本上使用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. 然后你想在主干上完成其余的更改,所以mergeC'和. 那应该会给您一个新版本,您可以将其签入为 version 。CEF

我不太了解 svn,无法就您应该如何办理登机手续C'以及如何处理提供任何建议,但上述步骤至少应该为您提供所需的最终结果。

于 2011-03-10T09:13:44.517 回答