Java 感知合并命令

2022-09-01 21:24:57

每当我在SCM中看到导入或方法签名更改(例如变量重命名)之类的冲突时,我都会想知道是否有类似语言感知的diff/merge方法可以处理共享项目上可能发生的更烦人的小更改。有没有任何东西可以更顺利地处理冲突,在Unix环境中工作?


答案 1

我同意如果存在这样的工具会很棒,但是我所知道的没有。我相信没有的原因是因为每个SCM的合并算法(无论是git,hg,bzr,svn等)都在最低的公分母上工作,这只是纯文本。为了使这些SCM工具真正理解语言语法和语义,它们必须包括解析语言的能力。对于任何SCM来说,这似乎都是一项太大的任务,无法包括解析Java,C#,Python,Ruby,Groovy,C,C++等的能力,更不用说这些语言中的每一种在版本之间都有不同的语法(例如,Java泛型直到1.5才存在)。因此,SCM必须包括检测或配置的能力,以了解编写源代码的语言和语言版本。

我认为更有可能在第三方合并工具中找到任何依赖于语言的合并功能(例如,.gitconfig中的合并>工具设置和.hgrc中的ui>合并设置)。可以将此工具配置为知道项目中的任何.java文件都是用 Java 1.6 编写的,然后使用 JDK 中的解析功能生成 AST,并对更改在该语言的上下文中是否有意义执行一些“深入”分析。


答案 2

我正在寻找完全相同的东西。这些合并工具供应商可能应该解决这种语义,语言感知的合并。如果没有,我必须成为一个:)

现在,作为一个穷人的把戏,我有时会通过Eclipse的代码清理/组织导入/订单成员来将3个文件(base,ours,theirs)预处理为它们的“规范形式”。

虽然有限,但效果很好:上次它将冲突数量减少到~200,即2。我打算把它包装成一个脚本,并插入git的合并工具。

还编写了脚本自动解决java导入冲突,它只是保留了导入的两端,并添加了注释来解释正在发生的事情和要做什么:“组织导入”。