【问题标题】:SVN merge between two branches - "path not found"两个分支之间的 SVN 合并 - “找不到路径”
【发布时间】:2012-09-24 00:20:56
【问题描述】:

我有两个分支(主干的子级)需要合并到一个分支中进行测试,但它们不能进入主干。两个分支都是最新的trunk@HEAD。所以我想从这个出发:

__________________trunk
  \___duck   \
              \___beaver

到这里:

__________________________trunk
  \
   \______________platypus

我从最新版本的主干创建了分支鸭嘴兽,并试图将鸭子和海狸合并到这个新的主干副本中:

svn copy ^/trunk ^/branches/platypus;
svn switch ^/branches/platypus;
svn merge --reintegrate ^/branches/duck;
svn merge --reintegrate ^/branches/beaver;

但合并操作失败

svn: '/blah/!svn/bc/12047/repo/branches/duck' path not found

如果我尝试将鸭子(或海狸)重新整合到树干中,它可以正常工作。我在这里错过了什么?

【问题讨论】:

  • 鸭子、海狸、普鲁蒂普斯 - 很有趣

标签: svn version-control merge


【解决方案1】:

我遇到了同样的错误,并且能够通过手动指定我想要合并的所有修订号来解决它,而不是让 SVN 决定。这允许合并继续并提示我合并冲突,正如预期的那样。

我使用 TortoiseSVN 手动选择修订,但我认为使用 SVN 命令行会是这样的:

svn log --stop-on-copy https://svn.blah/svn/proj1/branches/xyz

然后记下所有修订号并一次性合并它们,例如:

svn merge -c123,124,156,159 https://svn.blah/svn/proj1/branches/xyz

【讨论】:

  • 我喜欢这个解决方案,它让我摆脱了麻烦。为了让它更加自动化,可以使用:` for i in $(svn log --stop-on-copy site/svn/branch -q | grep -v '\-\-' | awk '{ print $1 ;} ' | perl -e '打印反向 ' | sed -e 's/r//g' );做 svn merge -c $i site/svn/branch --accept 推迟;完成`
  • TortoiseSVN 用户注意事项:您可以在源分支 (beaver/duck) 上打开日志,选择要合并的修订版,然后使用上下文菜单将修订版号复制到剪贴板。这样您就不必在某处手动提取数字
  • svn log --stop-on-copy 不会在从trunk 分支后再次复制(或分支)分支时为您提供所有修订。在这种情况下,您别无选择,只能比较日志。见stackoverflow.com/a/51933172/2279059
【解决方案2】:

我在重新集成从另一个分支合并的分支时遇到了类似的问题(它现在已重新集成)。像这样:

-----------------------------r7------------------
  \                         /             /ERROR !svn/bc/4/repo/branches/duck' path not found
   r1----dinosaur--r5-------             /
                    \---duck------------r9

似乎无法重新集成鸭子,找不到路径错误抱怨 r4 - 但我可以将特定修订版 (r5-r9) 从鸭子合并回主干。

【讨论】:

    【解决方案3】:

    出现这种情况是因为 SVN 不知道要合并哪些修订,可能是因为合并信息丢失或损坏。

    通过比较日志找到两个分支之间的共同祖先(最高版本 X 的共同提交):

    svn log duck > dlog.txt
    svn log beaver > blog.txt
    

    将该修订版 X 的所有更改合并到当前头:

    svn switch duck    # if you are not already on it
    svn merge -r X:HEAD beaver
    # Merge conflicts
    svn commit
    

    注意:接受的答案建议使用--stop-on-copy 来查找共同祖先。虽然这有时可能会找到正确的修订版(例如,分支 duckbeaver 是从 trunk 分支的,但如果在任何分支创建后。如果您知道这从未发生过,那么您可以使用--stop-on-copy

    【讨论】:

      【解决方案4】:

      我解决了这个问题:

      1. 将有问题的分支合并到主干

      2. 从主干创建新的“合并”分支

      3. 将主干恢复到步骤 1 之前的状态并提交恢复

      4. 仅将第 3 步中的记录合并到分支中

      5. 通过将新的合并分支合并回主干进行测试,但当然没有提交

      最终结果是一个新分支,其中包含功能分支和主干的更改未更改(但遗憾的是日志中有一些新条目)。

      【讨论】:

        【解决方案5】:

        在进行合并时尝试使用--ignore-ancestry 选项。可能是合并历史记录不完整(可能是由于乌龟或任何客户对此事实),并且当您进行“正常”合并时,在分支上所做的某些事情正试图应用于工作副本。

        【讨论】:

        • 谢谢,但这不起作用。您不能同时使用 --reintegrate 和 --ignore-ancestry 并且没有 --reintegrate 的合并只会产生大量冲突,因为两个分支具有相同的主干
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        • 2013-05-23
        • 2014-02-01
        • 2017-02-25
        • 2010-11-25
        • 1970-01-01
        • 2013-08-20
        相关资源
        最近更新 更多