2011-03-09 85 views
1

我试图解决一个SVN项目中,以下事情发生了:重做与SVN手动合并合并

一个特性分支从树干 有定期提交到这个分支跳转。 当分支合并到主干时,开发人员并没有使用SVN合并,而是WinMerge(!),所以我们失去了所有的历史记录。 此外,还有一些在手动WinMerge中错过的小错误修复。 这发生在几个星期前,从那以后就有了定期提交主干,所以我们不能简单地恢复原状。

所以,我想回去重做正确的合并,但是这已经被证明比我想象的要更复杂...

如果我试图恢复到一个点在此之前,“BadMerge “然后进行适当的合并,我不能重新合并在BM之后发生的其他更改。

所以,我想我必须使用svnadmin转储和加载,类似于this,但我无法解决我需要做的事情。

  1. BM(ChangesetX)之前的转储更改。
  2. 自卸变化后BM(ChangesetY。
  3. 负载ChangesetX什么?一个新的回购?
  4. 做这个
  5. 负荷ChangesetY的适当合并

这可能吗?任何帮助将是很大的赞赏。

感谢

汤姆

回答

0

也许不是最优雅的方式,但可行的在客户端:躯干

  • SVN导出HEAD进入目录主干的
  • svn签BAD_COMMIT进入目录乙
  • 拷贝过来的文件,从A到B

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

现在:

主干
  • svn签BAD_COMMIT-1到目录ç
  • 做你的分支SVN合并,并开始在树干的分支点进入工作将C
  • 拷贝过来C到A

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

最后:

  • SVN更新B到HEAD
  • 解决冲突
  • 犯乙

此时,您已经COMMITED一个健全的合并和坏的合并后的所有更改。你放弃了一些历史,但是在服务器端使用转储时没有什么麻烦。

祝你好运!

1

你可以做的是:

  1. SVN book在那个开发者,最好在一些重型类型的纸张打印输出的形式。 (如果他成功地生存下来,解雇他。)

  2. 有一个选项,SVN经过合并和记录的模式该版本已经在文件和文件夹的属性被合并,但实际上没有更改任何文件。 (使用SVN咿:他们的“财产状况”“改变”,但他们的“文本状态”不是。)

我没有用的,而SVN命令行,所以我不知道如何与它这样做,但TortoiseSVN有这样的:

enter image description here

+0

查看http://svnbook.red-bean.com/en/1.7/svn-book.pdf的第140页svn命令... – 2012-06-07 06:26:34

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'以及如何处理该问题,但上述步骤至少应能为您提供所需的最终结果。