SVN:必须与祖先有血缘关系

SVN:必须与祖先有血缘关系,svn,version-control,Svn,Version Control,当我使用第二个SVN合并选项(即重新整合分支/自动合并)时,我收到上面的错误消息。我理解为什么会出现错误,也就是说,这是因为在创建分支时,我只是使用Repo浏览器将项目从主干拖放到新分支中,而不是使用以下技术之一: 在Repo浏览器中使用“复制到”选项 使用Branch/Tag选项在Windows资源管理器中右键单击项目,然后选择TortoiseSVN/Branch/Tag 我有三个问题: 为什么这些项目必须与祖先有关?此问题表明,如果选择此选项,SVN只需进行文件比较:。 上述两个选项是否使项

当我使用第二个SVN合并选项(即重新整合分支/自动合并)时,我收到上面的错误消息。我理解为什么会出现错误,也就是说,这是因为在创建分支时,我只是使用Repo浏览器将项目从主干拖放到新分支中,而不是使用以下技术之一:

在Repo浏览器中使用“复制到”选项 使用Branch/Tag选项在Windows资源管理器中右键单击项目,然后选择TortoiseSVN/Branch/Tag 我有三个问题:

为什么这些项目必须与祖先有关?此问题表明,如果选择此选项,SVN只需进行文件比较:。 上述两个选项是否使项目与祖先相关? 项目从主干到分支的简单拖放是否会使项目与祖先无关? 为什么这些项目必须与祖先有关?此问题表明,如果选择此选项,SVN只需进行文件比较:SVN合并一系列修订与重新整合

合并不仅仅是将文件更改从一个分支复制到另一个分支,它是将上一个公共祖先和正在合并的两个文件进行比较。这是一个三方合并

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

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将无法分辨主干上更改了哪些文件行,而分支上更改了哪些文件行。否则,它只是将文件从一个分支复制到另一个分支

你可以试试这个参数。这会导致Subversion将合并视为差异

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

这两种选择都不是你想的——重新整合与没有这个选项会使项目与祖先相关。这来自于通过svn cp进行分支。重新整合与w/o重新整合与合并必须发生的方式有关。当您从基本流(通常是主干流)合并到分支流时,您正在将基本流上发生的更改合并到分支流上。这将创建新的修订。当您重新合并时,Subversion会看到新的修订,并希望将这些修订合并回您的基本流中,reintegrate选项会阻止这种情况的发生

并且,当您重新整合时,您在基本流上创建了一个新版本,这就是为什么您不希望在使用-重新整合后从分支流合并回基本流的原因。您可以通过在重新集成之后立即从分支流到基流进行仅记录合并来克服这一问题

项目从主干到分支的简单拖放是否会使项目与祖先无关


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

感谢您的全面回答+1.我唯一的疑问是,复制到似乎使项目与历史无关?是的,如果你说的是svn cp。这让我们了解各种分支是如何相互关联的。使用操作系统版本的copy(即Windows拖放和复制)进行复制不会向Subversion发出分支关系警报。相反,Subversion将该分支上的文件视为一组完全不同的文件。其他版本控制系统不会遭受同样的命运,因为分支位于文件内部。如果您使用OrtoiseSVN,请在拖动时单击鼠标右键,然后在此处选择SVN Copy versioned items。谢谢。我假设在windows资源管理器中右键单击工作副本并选择Ortoise svn/branch相当于在repo浏览器中选择“复制到”?是的。我必须添加更多文本才能保存此评论