SVN从主干合并到分支会导致树冲突

标签 svn merge svn-merge

假设我们有一个主干和一个分支(COKE)。 (我通过 SVN 运行 Git,并使用 svn 从 trunk 合并到 COKE,而不是 Git)

  1. 主干上的 FILE1 发生了我们希望在 COKE 分支中发生的更改。
  2. 我们从主干合并,我在COKE分支上提交合并。
  3. 然后从 trunk 中删除 FILE1,我希望在 COKE 中进行更改。
  4. 我进行合并,COKE 分支 上的 FILE1 发生树冲突。

这个树冲突是否是因为(2)中的合并提交而发生的?

我该如何解决这三个冲突?

svn resolve --accept Theirs-full/path/FILE1 不起作用,表示只有“工作”才能工作。

最佳答案

除非缺少某些合并跟踪信息,否则在这种情况下不应出现树冲突。

为了检查这一点,请运行以下命令:

$ svn switch ^/branches/COKE
$ svn mergeinfo --show-revs=merged ^/trunk

这会打印从主干合并到 COKE 分支的修订列表。当你修改了trunk中的FILE1后,你能发现有修改吗?很可能没有该修订。

这是一种常见的情况,SVN 用户将修改从一个分支合并到另一个分支,但随后并不提交整个工作副本(即包括根目录),而只是提交通过合并修改的文件。

错误:

$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
M    file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit FILE1

问题是根目录存储了 svn:mergeinfo 属性。 Subversion 使用此属性来跟踪合并,因此您必须提交整个工作副本。

右:

$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
M    file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit .

当你第二次尝试将 trunk 合并到 COKE 分支时,Subversion 检测到 FILE1 在 trunk 处被删除,同时它在 COKE 分支处被修改(通过步骤 2)。结果,它将文件标记为树冲突(本地编辑,合并时传入的删除)。

如何解决这个问题?

现在您必须修复分支 COKE 的合并跟踪信息。为此,请使用 --record-only 选项重复步骤 2 并指定正确的修订版:

$ svn merge --record-only -cN ^/trunk
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit .

其中 N 是您尝试合并的主干中 FILE1 的修改。

关于SVN从主干合并到分支会导致树冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12244698/

相关文章:

svn - Subversion 服务器的比较(VisualSVN、CollabNet、uberSVN 等)?

svn - 最佳项目管理工具、源代码控制、构建器和 wiki

SVN - 管理修订的部分合并

svn - 使用SVN : "Secure Connection Truncated"将中继合并到分支中

svn - Subversion 将本地更改合并到分支

svn - 是否可以用 "better"替换 TortoiseSVN 的合并算法?

svn - TortoiseSVN 在哪里存储其设置(例如,全局忽略模式)?

windows - 如何调整 SVN 设置以在 Windows 上转换行尾?

svn - 重新整合到主干后,使用Subversion功能分支是否安全?

python - "The system cannot find the file specified"在 python 中调用 subprocess.Popen 时