【问题标题】:SVN merge from trunk to branch results in tree conflictsSVN 从主干合并到分支导致树冲突
【发布时间】:2012-08-28 00:06:08
【问题描述】:

假设我们有一个 trunk 和一个分支 (COKE)。 (我在 SVN 上运行 Git,并从 trunk 合并到 COKE 与 svn,而不是 Git)

  1. FILE1 on trunk 发生了我们希望在 COKE 分支中进行的更改。
  2. 我们从 trunk 合并,我在 COKE branch 提交合并。
  3. 然后FILE1trunk中删除,我想要COKE中的那个变化。
  4. 我在FILE1 上合并并在COKE branch 上发生树冲突。

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

我可以做些什么来解决这三个冲突?

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

【问题讨论】:

    标签: svn merge svn-merge


    【解决方案1】:

    vadishev 的回答为我提供了创建此脚本的知识,它应该会自动为您添加缺少的合并信息。

    确保 pwd 是分支根目录,然后运行:

    trun="path/to/trunk/root"
    for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'`
    do 
      echo "working on $i"
      svn merge --record-only -c$i $trun
    done
    

    或者,作为单行者:

    trun="../../trunk/tetracosm"; for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'`; do echo "working on $i"; svn merge --record-only -c$i $trun; done
    

    【讨论】:

      【解决方案2】:

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

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

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

      这会打印从主干合并到 COKE 分支的修订列表。当您在主干修改 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 .
      

      当你第二次尝试将主干合并到 COKE 分支时,Subversion 检测到 FILE1 在主干被删除,同时它在 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 的修改。

      【讨论】:

      • 这是一个很好的答案,非常有启发性!感谢您的信息!
      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多