如何在git功能分支工作流中处理xml / html?

时间:2009-11-05 16:25:12

标签: html xml git merge

我们的项目在代码相当近的范围内工作(在代码的相当小的地理区域中并行发生了很多变化),而我们基于特征分支的git工作流对我们的java代码非常有用。

但是xml / html的东西效果不好。简单的无关更改(设计者添加了一个周围的div,一个开发人员更改了一个元素的id)给出了非常糟糕的合并。

我意识到如何处理这个问题可能有几种选择。一个好的git xml合并将是最佳的,或者限制重新格式化xml / html代码。不在如此紧密的地方工作将是另一个(不可接受的)选择。

您如何有效地解决这个问题?

3 个答案:

答案 0 :(得分:18)

Git允许自定义合并驱动程序,通过每个路径gitattributes选择(例如,所有*.xml个文件)。

您需要找到的是一个支持XML的合并驱动程序,还可能编写一个简单的脚本来转换Git约定和所说的合并驱动程序约定。例如XML::Merge Perl模块。有XyDiff,但看起来它缺乏三向合并(我想,对于XML构建,如A Formal Investigation of Diff3论文(PDF)中所描述的差异的三向合并将不起作用)。您还可以阅读Matching, diffing and merging XML博文(或其中引用的文章)。

另一个解决方案是取消设置XML文件的合并属性(它们会被视为二进制文件和合并冲突),并使用一些图形合并工具来解决合并冲突,可能是通过{{ 3}}

答案 1 :(得分:5)

如果您知道可以自动执行某些与xml文件合并的合并问题,则可以编写这些解决方案的脚本。
如果有脚本,您可以从为xml / xhtml文件定制的合并驱动程序中调用它们,仅在某些目录中。

请参阅here了解(非常简单的)合并驱动程序。

这样,任何仍然存在的冲突(因为合并驱动程序脚本没有解决它)都是需要解决的合法合并问题。

答案 2 :(得分:1)

在另一个问题的注释中提到了一个项目,该项目现在重定向到此处(How to setup git merge / git pull for xml files?)。从逻辑上讲,这也应该是注释,但这确实是需要格式。所以,这是关于这个问题的答案:

merge.conflictStyle设置为diff3会有所帮助

正在做

git config --global merge.conflictStyle diff3

(或者如果没有,仅使用--global,而没有--global的话,我自己更喜欢ours)可以使工作树副本更加有用。请注意,如果您正在编写合并驱动程序,则不会获得工作树副本作为输入。相反,您将获得三个文件base theirs$ cat base <li> <span>BA</span> </li> $ cat ours <li> <span>BA</span> </li> <li> <span>CE</span> </li> $ cat theirs <li> <span>BA</span> </li> <li> <span>DF</span> </li> 作为三个输入。如果您尝试编写自己的合并驱动程序(并且编写自己的合并驱动程序很棘手:如果很容易,XML合并将在很早以前就解决了),这将非常有用。

示例

这是其他帖子的示例输入:

git merge-file

我们现在可以看到Git如何使用git merge合并这些文件,这与$ cp ours current $ git merge-file current base theirs $ cat current <li> <span>BA</span> </li> <li> <<<<<<< curr <span>CE</span> ======= <span>DF</span> >>>>>>> theirs </li> 中的一个低级(文件级)操作等效:

ours

在这里,如您所见,Git指出current中的更改(复制到theirs)与base中的更改相较于diff3 。但是,冲突的某些部分很容易解决,因此Git做到了,只标记了冲突的剩余部分。

但是,当我们请求$ cp ours current $ git merge --diff3 current base theirs $ cat current <li> <span>BA</span> </li> <<<<<<< curr <li> <span>CE</span> </li> ||||||| base ======= <li> <span>DF</span> </li> >>>>>>> theirs 样式合并时,会得到以下信息:

||||||| base

两个差异。 Git不仅添加ours部分,在本例中为空;合并基础输入中没有行,但是停止current / theirs中的更改和<{1} <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> Test Body <s:select list="CountryCodes2" name="countryCd" /> <!-- This one does not work, see Action class for details--> <s:select list="searchEngine" name="yourSearchEngine" /> <!-- This one works fine, see Action class for details -->

(这是必要的,因为Git现在必须显示“我们对基础”和“他们对基础”,而不仅仅是“经过最大努力的我们对他们的”。)