我们的项目在代码相当近的范围内工作(在代码的相当小的地理区域中并行发生了很多变化),而我们基于特征分支的git工作流对我们的java代码非常有用。
但是xml / html的东西效果不好。简单的无关更改(设计者添加了一个周围的div,一个开发人员更改了一个元素的id)给出了非常糟糕的合并。
我意识到如何处理这个问题可能有几种选择。一个好的git xml合并将是最佳的,或者限制重新格式化xml / html代码。不在如此紧密的地方工作将是另一个(不可接受的)选择。
您如何有效地解决这个问题?
答案 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现在必须显示“我们对基础”和“他们对基础”,而不仅仅是“经过最大努力的我们对他们的”。)