为什么';t svn merge——在这个场景中,当svn diff+;帕奇做了什么?

为什么';t svn merge——在这个场景中,当svn diff+;帕奇做了什么?,svn,version-control,project-management,diff,patch,Svn,Version Control,Project Management,Diff,Patch,我正在尝试将我的svn合并工作流(通常是svn diff)替换为实际的svn merge,有时是手动编辑补丁,然后是patch)。但我看到了一些意想不到的行为,我在任何SVN在线文档中都找不到解释。以下是我的设想: 新存储库(版本0) 在主干中创建了一个名为file的空白文件(rev.1) 将主干复制到分支/分支1(第2版) 在branch1中,将文件更改为“abcdefg”并提交(第3版) 回到后备箱,跑: svn合并-c3^/branchs/branch1--忽略祖先 到目前为止,一切顺利中

我正在尝试将我的svn合并工作流(通常是
svn diff
)替换为实际的
svn merge
,有时是手动编辑补丁,然后是
patch
)。但我看到了一些意想不到的行为,我在任何SVN在线文档中都找不到解释。以下是我的设想:

  • 新存储库(版本0)
  • 在主干中创建了一个名为
    file
    的空白文件(rev.1)
  • 将主干复制到分支/分支1(第2版)
  • 在branch1中,将
    文件更改为“abcdefg”并提交(第3版)
  • 回到后备箱,跑:
  • svn合并-c3^/branchs/branch1--忽略祖先

    到目前为止,一切顺利<代码>中继中的文件
    包含“abcdefg”。trunk并没有得到任何mergeinfo的更新,因为我使用了——忽略祖先。为了验证,我运行:

    svn pg svn:mergeinfo.

    什么也没印出来。伟大的现在我想再次应用r3中的变化。所以我跑:

    svn合并-c3^/branchs/branch1--忽略祖先

    此命令不起任何作用。不打印输出,不更改
    文件
    ,也不添加任何合并信息。如果我对旧的diff和patch工作流执行相同的操作,例如:

    svn diff-c3^/branch/branch1| patch

    然后,文件将再次使用更改进行更新。由于这一变化仅仅是:

        --- file    (revision 2)
        +++ file    (revision 3)
        @@ -0,0 +1 @@
        +abcdefg
    
    再次应用它只会使
    文件
    按预期包含两行“abcdefg”

    ~~~

    我知道这不应该是一个常见的工作流程,但我觉得我需要了解
    svn merge
    在这种情况下实际上在做什么,然后才能轻松地采用它。(无需支持svn合并的好处,我已经加入了。)


    谢谢

    Merge通过比较两个文件来进行合并,并强制您协调差异(当使用祖先时,当文件相关时,这当然要容易得多)。如果文件相同,则不会发生任何情况。Subversion似乎认为“旧文件”和“后续文件”之间的冲突是由后续文件赢得的。在任何没有连续性的真实内容上,您将得到一个需要使用合并工具修复的冲突<代码>--忽略祖先可能确实会忽略svn:mergeinfo属性,同时保留隐式的基于路径的历史记录信息。当它帮助不大时,文档在这一点上并不明确


    另一方面,您的修补程序工作流是流动的,这就是为什么它将文本内容加倍:在没有上下文的情况下(虽然希望上下文采用统一的修补程序格式,但在您的情况下实际上没有),修补程序认为再次应用修补程序是一个好主意,尽管在这种情况下正确的方法通常是SubVersion。另一个补丁工具可能已经注意到上下文的缺失,并认为这是“文件启动”/“文件结束”上下文强制执行的必要条件,然后补丁就失败了。

    我认为这可能与DIF3和DIFF之间的差异有关,但甚至使用DIF3,我不能得到与使用svn merge相同的结果。有什么好处?