SVN:必须与祖先有关

w00*_*977 4 svn version-control

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

  1. 在Repo-Browser中使用"复制到"选项
  2. 使用分支/标记选项(在Windows资源管理器中右键单击项目并选择TortoiseSVN/Branch/Tag)

我有三个问题:

  1. 为什么项目必须与祖先相关?这个问题表明,如果选择此选项,SVN只会进行文件比较:在SVN中合并一系列修订与重新整合之间有什么区别?.
  2. 上述两个选项是否使项目与祖先相关?
  3. 项目从Trunk到Branch的简单拖放是否使项目与祖先无关?

Dav*_* W. 13

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

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

假设你在trunk上有一个文件:

Line #1
Line #2
Line #3
Line #4
Run Code Online (Sandbox Code Playgroud)

您创建此文件的分支.

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

Line #1
Line #2
Line #3
Line #4 FOO FOO FOO
Run Code Online (Sandbox Code Playgroud)

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

Line #1
Line #2
Line #3 BAR BAR BAR
Line #4
Run Code Online (Sandbox Code Playgroud)

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

合并文件如下所示:

Line #1
Line #2
Line #3 BAR BAR BAR
Line #4 FOO FOO FOO
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

这两种选择(我认为--reintegrate没有这个选项,你正在考虑它)使得该项目与祖先有关.这来自于通过分支制作分支svn cp.在--reintegrate与W/O复兴合并与合并必须发生的方式做.当您从基本流(通常是主干)合并到分支流时,您正在将基本流上发生的更改合并到分支流上.这会创建新的修订版.当您合并回来时,Subversion会看到新版本,并希望将这些修订合并回您的基本流中,"重新整合"选项可以防止这种情况发生.

而且,当你重新融入社会,创建你的一个新版本的基本流这就是为什么你没有想从您的合并支流回到你的基本流,一旦你使用了--reintegrate.你可以做一个克服这个--record-only从您的合并支流到您的基本流之后--reintegrate.

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

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