为什么';t svn merge——在这个场景中,当svn diff+;帕奇做了什么?
我正在尝试将我的svn合并工作流(通常是为什么';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 diff
)替换为实际的svn merge
,有时是手动编辑补丁,然后是patch
)。但我看到了一些意想不到的行为,我在任何SVN在线文档中都找不到解释。以下是我的设想:
file
的空白文件(rev.1)文件更改为“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相同的结果。有什么好处?