git可以主要自动合并XML顺序不敏感的文件吗?

时间:2016-06-16 04:12:34

标签: xml git

合并Lightswitch分支时,同事通常会向我也修改过的实体添加属性,这会导致合并冲突,因为新的XML条目会添加到lsml文件中的相同位置。

我可以有效地总是通过不按特定顺序接受左右来解决这些问题,因此一个在另一个之上,因为在这些特定情况下顺序并不重要。在极少数情况下,这是无效的,无论如何这会在项目中产生错误,我接受这是一种风险(但没有遇到)。

有没有办法(最好是文件扩展名)让git自动接受同一位置的源和目标更改,只需将一个放在另一个下面?

1 个答案:

答案 0 :(得分:11)

这一般来说非常难。

Some have attempted to use Git's union merge(现在比以前更容易访问;在该问题中,您只需在merge=union文件中添加.gitattributes,但这不起作用一般。 可能有时会工作。如果你的XML总是被构造成使得天真的面向行的联合合并产生有效的XML(基本上,将整个XML子元素全部保存在一行上), 你总是添加全新的XML子元素。

可以在Git中编写自定义合并驱动程序。为XML编写有用的文件很难。

首先,我们需要一个XML diff引擎,例如Sylvain Thénault's xmldiff,为三个XML文件构建两个字符串到字符串(或树到树)编辑(合并基础,本地或{{1 }和其他或--ours个文件:diff base-vs-local和base-vs-ours)。这个特殊的一个看起来与Python的difflib类似。 (但是,由于引用的文章,它看起来像生成树移动/嵌套级操作以及简单的插入和删除。这对于树到树编辑算法来说是一个自然而合理的事情,并且可能这里真的很可取。)

然后,给定两个这样的差异,我们需要代码来组合它们。 union 方法是忽略所有删除:只需将所有添加添加到基本版本(或者,等效地,将“其他”添加添加到“本地”或“本地”添加到“其他”)。我们还可以将树插入/删除操作与“真实”(非联合样式)合并相结合,甚至可以声明冲突。 (并且允许不同的树嵌套级别更改处理可能会很好,这可能会像DTD一样模糊不清。)

据我所知,这些最后的部分不是在任何地方完成的。除此之外,我在这里链接的Python xmldiff是一个相当大的代码块(我没有仔细阅读它,也没有尝试安装它,我只是下载并浏览 - 它实现了类似Myers的算法,并且来自the Stanford paper的发烧友“快速匹配/编辑脚本”算法。