【问题标题】:SVN how to resolve new tree conflicts when file is added on two branchesSVN如何在两个分支上添加文件时解决新树冲突
【发布时间】:2010-10-20 13:06:39
【问题描述】:

当合并几个分支(使用 SVN 1.6.1)时,在两个分支上都添加了一个文件(然后在这些单独的分支中处理),我遇到了一个新的树冲突:

      C foo.txt
  >   local obstruction, incoming add upon merge

我需要两个分支的更改,但树冲突并没有给我通常的 .working、.merge-left 和 .merge-right 文件——由于冲突的性质,这是可以理解的。这种冲突有很多,并且在每个分支上都发生了对同一文件的删除,但它们很容易解决。

我该如何解决这个问题? SVN redbean book (for 1.6) 没有涵盖这种情况。

【问题讨论】:

    标签: svn merge tree-conflict


    【解决方案1】:

    我找到了post suggesting a solution for that。它即将运行:

    svn resolve --accept working <YourPath>
    

    它将声称本地版本文件正常。
    您可以为单个文件或整个项目目录运行它。

    【讨论】:

    • 谢谢,这也解决了:C foo.txt > 本地添加,更新时传入添加
    • 感谢它也对我有用,但我必须这样做:svn resolve --accept working FILENAME
    • 是的,你需要一个文件名。它接受“。” (当前目录)。我还需要递归地执行此操作:“svn resolve --accept working --recursive”。解决所有有利于您的工作副本的事情(危险!当您这样做时,您可能会吹走其他人的更改,就像解决冲突时一样)
    • 我使用我创建的别名来列出所有与树冲突的文件:alias mtc='stat | awk "BEGIN { FS=\" \" } /^.{6}C/ { print \$NF }"' 然后我可以将其用作解析命令的参数,如下所示:svn resolve --accept working $(mtc)跨度>
    • 事实上你还需要指定资源例如:svn resolve --accept working path/index.html
    【解决方案2】:

    正如"Tree Conflict" design 文档的旧版本 (2009) 中所述:

    XFAIL 冲突来自添加版本控制文件的合并

    此测试执行合并,将没有历史记录的文件添加到 现有版本化文件
    这应该是“local obstruction, incoming add upon merge”品种文件上的树冲突。修复了 r35341 中的预期。

    (顺便说一下,这在 ClearCase 中也被称为“邪恶双胞胎”):
    一个文件在两个不同的分支中创建了两次(这里“添加”了两次),为两个不同的元素创建了两个不同的历史记录,但名称相同。

    理论上的解决方案是在目标分支“B2”中手动合并这些文件(使用外部差异工具)。

    如果您仍在源分支上工作,理想的情况是从源分支B1 中删除该文件,然后从B2 合并回B1 以使该文件在@987654327 上可见@(然后您将处理相同的元素)。
    如果由于仅从 B1B2 发生合并而无法返回合并,则每个 B1-&gt;B2 合并都需要手动合并。

    【讨论】:

    • “树冲突”设计文档链接失效:(
    • 有趣的是,即使添加的两个文件相同,它们仍然显示为冲突。这确实不应该被标记为冲突。
    • @SantiBailors 真有趣,我现在快死了。为我的老朋友 git 而死……
    【解决方案3】:

    如果传入的更改是您想要的,该怎么办?我无法运行 svn resolve --accept theirs-full

    svn resolve --accept base

    【讨论】:

    • 我想我误解了这个问题。使用 'svn resolve' 时,'base' 确实等同于 'theirs-full',但它不能解决您的问题。相反,我所做的是将其分为两部分:1)删除我的本地冲突目录(或文件),2)合并。这应该在没有冲突的情况下运行,并且由于“传入的更改是您想要的”,我不会关心已删除的项目
    【解决方案4】:

    我只是设法让自己非常彻底地尝试遵循上面 user619330 的建议。情况是:(1):我在我的初始分支branch1上工作时添加了一些文件; (2) 我创建了一个新的分支,branch2 用于进一步开发,将它从主干分支出来,然后合并我从 branch1 的更改 (3) 一位同事将我的 mods 从 branch1 复制到他自己的分支,添加了更多的 mods,然后合并回主干; (4) 我现在想将来自主干的最新更改合并到我当前的工作分支 branch2 中。这是 svn 1.6.17。

    合并与新文件有树冲突,我想要来自它们不同的主干的新版本,所以从 branch2 的干净副本中,我对冲突文件进行了 svn 删除,提交了这些 branch2 更改(因此创建一个没有相关文件的临时版本的 branch2),然后从主干进行合并。我这样做是因为我希望历史记录与主干版本相匹配,这样以后在尝试合并回主干时就不会遇到更多问题。合并进行得很好,我得到了文件的主干版本,svn st 显示一切正常,然后我在尝试提交更改时遇到了更多的树冲突,在我之前所做的删除和合并中的添加之间。是否有一个 svn 解决了有利于我的工作副本(现在有文件的主干版本)的冲突,并让它提交。一切都应该很好,对吧?

    嗯,不。更新 branch2 的另一个副本导致文件的旧版本(主干合并前)。所以现在我有两个不同的 branch2 工作副本,据说更新到相同的版本,有两个不同版本的文件,并且都坚持认为它们是完全最新的!签出 branch2 的干净副本会导致文件的旧(主干前)版本。我手动将这些更新到主干版本并提交更改,回到我的第一个工作副本(我最初提交主干更改的地方),尝试更新它,现在在有问题的文件上出现校验和错误。把有问题的目录吹走,通过更新获得一个新版本,最后我有了一个好的分支 2 版本,主干发生了变化。我希望。警告开发者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 2022-10-14
      • 2011-05-08
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多