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

SVN从主干合并到分支会导致树冲突,svn,merge,svn-merge,Svn,Merge,Svn Merge,假设我们有一个主干和一个分支(可口可乐)。(我在SVN上运行Git,并从trunk合并到COKE与SVN,而不是Git) 主干上的FILE1发生了更改,我们希望在COKE分支中进行更改 我们从trunk合并,我在COKE branch提交合并 然后将FILE1从trunk中删除,我希望在COKE中进行更改 我合并,在可口可乐分公司的文件1上发生树冲突 此树冲突是否是由于(2)中的提交与合并导致的? 我能做些什么来解决这三个冲突? svn resolve——接受他们的完整/path/FILE1不起

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

  • 主干上的
    FILE1发生了更改,我们希望在
    COKE
    分支中进行更改
  • 我们从
    trunk
    合并,我在
    COKE branch
    提交合并
  • 然后将
    FILE1
    trunk
    中删除,我希望在
    COKE
    中进行更改
  • 我合并,在可口可乐分公司的
    文件1
    上发生树冲突
  • 此树冲突是否是由于(2)中的提交与合并导致的?

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


    svn resolve——接受他们的完整/path/FILE1
    不起作用,表示只有“工作”起作用。

    除非缺少某些合并跟踪信息,否则在此场景中不应存在树冲突

    要检查此情况,请运行以下命令:

    $ svn switch ^/branches/COKE
    $ svn mergeinfo --show-revs=merged ^/trunk
    
    这将打印从主干合并到可口可乐分支的修订列表。当您在主干上修改文件1时,是否可以找到修订版?很可能没有那个修订

    当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 merge ^/trunk
    --- Merging r5 through r6 into '.':
    M    file.txt
    --- Recording mergeinfo for merge of r5 through r6 into '.':
     U   .
    $ svn commit .
    
    问题是根目录存储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 FILE1
    
    $ 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)。结果,它将文件标记为树冲突(本地编辑、合并时传入删除)

    如何解决这个问题?

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

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

    其中N是您试图合并的主干中对文件1的修改。

    瓦迪舍夫的回答让我知道如何创建此脚本,它会自动为您添加缺少的合并信息

    确保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
    

    这是一个很好的答案,非常有启发性!谢谢你的信息!