2010-09-29 91 views
14

这是一个讨厌的Subversion bug还是我以错误的方式接近它?Subversion:合并,还原,再次合并。为什么它默默地失败?

将分支合并到主干中。 - > HelloWorld.txt更新

还原HelloWorld.txt

做同样的合并。 - >没有文件更新。

为什么第二次不会再次更新HelloWorld?它的行为就好像这个变化已经被复制了一样。不应该恢复重置吗?

如果您恢复整个文件夹HelloWorld所在,则第二次合并会再次正确应用更改。只有当你恢复一个失败的文件。

这有点吓人。如果我现在需要恢复一些文件,该怎么办?任何未来的合并都将默默无法复制关键代码。

颠覆1.6 OS X 10.6.4

+0

感谢所有回复! – Stephen 2011-02-25 12:09:20

+0

我正要问同样的问题。请注意,如果你留在主干上,也会发生这种情况,在r42中编辑,在r43中回滚,并且想要重新申请r42。你需要忽略祖先,否则什么都不做。 – rds 2011-11-09 11:33:28

回答

6

颠覆合并执行跟踪,这意味着它会记录已经合并了什么修改。合并信息记录在合并根目录(即,在svn merge之后作为目标输入的任何内容)上名为svn:mergeinfo的属性中。您还原了该文件,但可能没有还原包含修改或添加的svn:mergeinfo属性的合并根目录。

3

桑德斯是对的。

不要认为你好像在复制状态。您“采取”更改并将其应用于不同的目标(理想情况下是相对于合并源)。

在svn 1.5之前,我们必须在合并时手动跟踪这些更改。 “嗯,我才从这个分支合并r28445到r28501我不想重新申请,我做到了媒体链接的变化: - /”

这是一个令人头痛的机器;),因为1.5

svn的跟踪你在过去做过,只会将相同的历史更改一次应用到一个独特的目的地。

你应该可以在你的svn merge命令中使用“--ignore-ancestry”来禁用这个友好的检查。准备好在你申请的所有准备中获得很多变化。通过陈述修订来缩小你想得到的结果。

svn merge --ignore-ancestry -c REVISION_WITH_CHANGE http://mysvn/path/to/mergeorigin 
19

此行为举止在SVN文档Advanced Merging节中(见注23)。当您第一次合并您的更改时,将合并版本号在svn:mergeinfo属性中进行跟踪。如果撤销更改,修订仍会标记为合并,以防止您错误地再次合并它。事实是,如果你删除它,几乎没有机会你想要它回来...

如果然而你真的想再次合并它,那么你可以使用--ignore-ancestry选项,将不检查svn:mergeinfo如果修订版本之前已合并过。另一个解决方案是故意从svn:mergeinfo中删除此修订版,以便将来可以再次合并。但不要手动完成,请使用svn merge命令的--record-only选项。

+0

发生在这一点上,我很高兴了解“忽略祖先”的含义。我希望他们会把它称为“忽略mergeinfo”! – 2013-08-23 08:39:07

+0

我会给你一瓶啤酒! – juanmf 2014-09-28 23:03:14