我正在尝试修复发生以下情况的SVN项目:
功能分支取自主干 这个分支经常提交。 当将分支合并回主干时,开发人员不使用SVN合并,而是使用WinMerge(!),因此我们失去了所有历史记录。 此外,手动WinMerge中还有许多小错误修复。 这发生在几个星期前,从那时起经常提交到主干,所以我们不能简单地恢复。
所以,我试图回去并正确地重做合并,但事实证明这比我想象的要复杂得多......
如果我尝试恢复到“BadMerge”之前的某个点,然后进行正确的合并,我就无法重新合并BM之后发生的其他更改。
所以,我认为我必须使用svnadmin转储和加载,类似于this,但我无法确切地知道我需要做什么。
这可能吗?任何帮助将不胜感激。
谢谢
汤姆
答案 0 :(得分:1)
可能不是最优雅的方式,但在客户端可行:
B现在包含BAD_COMMIT之后的所有提交作为本地更改(您在这些提交之间失去区别)。
现在:
现在,您在目录A中具有正确的合并作为对HEAD的本地更改。提交A. Trunk现在具有正确的HEAD合并。
最后:
此时你提交了一个合理的合并,并且在合并错误后进行了所有更改。您丢失了一些历史记录,但在服务器端使用转储时麻烦较少。
祝你好运!答案 1 :(得分:1)
你能做的是:
将SVN book扔给该开发者,最好以打印输出的形式放在某种沉重的纸张上。 (如果他能够幸存下来,解雇他。)
SVN可以选择合并模式和 记录 哪些修订已合并到文件和文件夹属性中,但 实际上没有更改任何文件 。 (使用SVN babble:他们的“属性状态”是“已更改”,但他们的“文本状态”不是。)
我暂时没有使用SVN命令行,所以我不知道如何使用它,但是TortoiseSVN有这个:
答案 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
然后重做合并签出版本A
,Y
和B
并与kdiff3合并。这将为您提供一个新的C'版本,最好缺少C
中引入的错误。然后,您希望在主干上完成其余更改,因此合并C'
,C
和E
。这应该会为您提供一个新版本,您可以将其作为版本F
签入。
我不知道svn是否足以提供有关如何签入C'
以及如何处理的建议,但上述步骤至少应该为您提供所需的最终结果。