SVN:必须与祖先有关

时间:2013-08-26 18:18:56

标签: svn version-control

当我使用第二个SVN合并选项,即“重新整合分支/自动合并”时,我收到上面的错误消息。我理解为什么我得到错误,即因为在创建分支时我只是将项目拖放到Trunk的新分支(使用Repo-Browser)而不是以下技术之一:

  1. 在Repo-Browser
  2. 中使用“复制到”选项
  3. 使用分支/标记选项(在Windows资源管理器中右键单击项目并选择TortoiseSVN /分支/标记)
  4. 我有三个问题:

    1. 为什么项目必须与祖先有关?这个问题表明,如果选择此选项,SVN只会进行文件比较:What are the differences between merging a range of revisions vs. reintegrate in SVN?
    2. 上述两个选项是否使项目与祖先有关?
    3. 项目从Trunk到Branch的简单拖放是否使项目与祖先无关?

1 个答案:

答案 0 :(得分:13)

  

为什么项目必须与祖先相关?这个问题表明,如果选择此选项,SVN只会进行文件比较:SVN合并一系列修订与重新整合。

合并不仅仅是将文件更改从一个分支复制到另一个分支,而是将最后一个共同祖先与要合并的两个文件进行比较。这是三向合并。

假设你在主干上有一个文件:

Line #1
Line #2
Line #3
Line #4

您创建此文件的分支。

在分支上,您将第4行更改为:

Line #1
Line #2
Line #3
Line #4 FOO FOO FOO

在主干上,您将第3行更改为

Line #1
Line #2
Line #3 BAR BAR BAR
Line #4

Subversion将最后一个共同祖先(任何更改前的文件版本)与您要合并的文件版本进行比较。如果我将主干合并到分支,Subversion看到我改变了主干上的第3行,但没有更改第4行。因此,第3行的变化需要结束,但第4行的差异是分支上的变化的结果,我不应该从主干上复制第4行

合并后的文件如下所示:

Line #1
Line #2
Line #3 BAR BAR BAR
Line #4 FOO FOO FOO

Subversion还会考虑以前合并的更改以及您要跳过的更改。它实际上是一个非常好的合并工具,除非你开始重命名文件并将它们移动批发。 (这可以在Subversion 1.9中得到纠正。)

因此,为了使合并工作,两个文件 必须 共享一个共同的祖先,可以用作合并的基础。没有它,Subversion将无法分辨主干上文件的哪些行与分支上的更改内容有关。否则,它只是将文件从一个分支复制到另一个分支。

您可以尝试--ignore-ancestry参数。这导致Subversion将合并视为差异。

  

上述两个选项是否使项目与祖先有关?

这两种选择(我认为--reintegrate与没有此选项相比)我认为该项目与祖先有关。这来自于通过svn cp创建分支。 --reintegrate与w / o重新整合的关系与合并必须发生的方式有关。当您从基本流(通常是主干)合并到分支流时,您正在合并基本流上发生的更改分支流。这会创建新的修订版。当您合并回来时,Subversion会看到新版本,并希望将这些修订合并到您的基本流中,reintegrate选项可以防止这种情况发生。

并且,当您重新集成时,您在基本流上创建了一个新版本,这就是为什么您不想将分支流合并回您的<使用--reintegrate后,使用em>基本流。您可以通过--record-only之后立即从分支流基本流进行--reintegrate合并来解决此问题。

  

项目从Trunk到Branch的简单拖放是否使项目与祖先无关?

取决于Subversion客户端。一些GUI Subversion客户端将拖放理解为svn cp,而不仅仅是将文件复制到另一个目录。但是,TortoiseSVN通过Windows资源管理器工作,因此默认情况下拖放是文件系统副本。右键单击拖放以执行svn cp而不是Windows文件系统副本时,有一个选项。