【问题标题】:Can git be made to mostly auto-merge XML order-insensitive files?可以让 git 自动合并 XML 顺序不敏感的文件吗?
【发布时间】:2016-06-16 04:12:33
【问题描述】:

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

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

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

【问题讨论】:

  • 谢谢,我看到了有关自定义合并驱动程序的答案,但想知道是否有更简单的方法。我想我要求的答案是联合合并,但这似乎表明灾难是使用它的唯一可能结果。
  • @Torek 如果您将您的评论作为答案,我会接受。
  • 实际上,我希望可能编写一个自定义驱动程序来执行某种 XML 联合合并。但我自己跟着链接,找到了一些关于树的字符串到字符串编辑算法的论文,以及 XML diff 的一个实际 Python 实现(Sylvian Thénault 的 xmldiff:pypi.python.org/pypi/xmldiff),然后在杂草中丢失了情节。 :-) 不过,我会在答案中给出这么多。

标签: xml git


【解决方案1】:

这通常很难。

Some have attempted to use Git's union merge(现在比早期更容易访问;在那个问题中,您只需在.gitattributes 文件中添加merge=union),但这通常不起作用。它可能有时会起作用。将其归结为很多,它可以工作如果您的 XML 始终是结构化的,以便天真的面向行的联合合并生成有效的 XML(基本上,将整个 XML 子元素都放在一行上),并且你总是添加全新的 XML 子元素。

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

首先,我们需要一个 XML 差异引擎,例如 Sylvain Thénault's xmldiff,为三个 XML 文件(合并基础、本地或 --ours 和其他或--theirs 文件:区分 base-vs-local 和 base-vs-ours)。这个特殊的看起来与 Python 的 difflib 类似。 (但是,由于参考的论文,它看起来像是产生了树移动/嵌套级别的操作以及简单的插入和删除。这对于树到树的编辑算法来说是自然而合理的事情,并且可能这里实际上是可取的。)

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

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

【讨论】:

  • 这听起来像每个人都需要的东西,所以可能已经解决了。有谁知道这方面的好开源?
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2016-01-29
相关资源
最近更新 更多