【问题标题】:How to handle xml/html in git feature branch workflow?如何在 git 功能分支工作流程中处理 xml/html?
【发布时间】:2018-12-19 02:16:42
【问题描述】:

我们的项目在代码方面相当接近(在代码的一个相当小的地理区域内并行发生了很多更改),我们基于功能分支的 git 工作流程非常适合我们的 java 代码。

但是 xml/html 的东西并不能很好地工作。简单的不相关更改(设计师添加周围的 div,开发人员更改其中元素的 id)会产生非常灾难性的合并。

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

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

【问题讨论】:

    标签: html xml git merge


    【解决方案1】:

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

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

    另一种解决方案是取消设置 XML 文件的合并属性(它们将被视为二进制文件并存在合并冲突),并使用一些图形合并工具来解决合并冲突,可能通过 @987654326 @。

    【讨论】:

    • 我不知何故认为,简单地忽略各种前导/尾随空格(换行符除外)的合并会表现得足够好。你知道我怎样才能做到这一点吗?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      在做:

      git config --global merge.conflictStyle diff3
      

      (如果您只希望它用于一个存储库,或者没有--global,但我更喜欢--global 我自己)可以使工作树副本更有用。请注意,如果您正在编写合并驱动程序,则不会将工作树副本作为输入。相反,您将获得三个文件,oursbasetheirs,作为您的三个输入。如果您尝试编写自己的合并驱动程序(而且编写自己的合并驱动程序很棘手:如果它很容易,XML 合并早就解决了),这主要是有用的。 p>

      示例

      以下是其他帖子的示例输入:

      $ 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>
      

      我们现在可以看到 Git 将如何合并这些文件,使用 git merge-file,它相当于来自 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>
      

      在这里,如您所见,Git 指出 ours(复制到 current)中的更改与 theirs 中的更改相冲突,与 base 相比。然而,冲突的某些部分很容易解决,所以 Git 这样做了,并且只标记了冲突的剩余部分。

      但是,当我们请求 diff3 样式合并时,我们会得到:

      $ 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
      

      两个不同。 Git 不仅添加了||||||| base 部分——在这种情况下,它是空的;合并基本输入中没有行,但它也停止ours/current 中的更改与theirs 中的更改进行部分解析。

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

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 2019-02-26
        • 1970-01-01
        相关资源
        最近更新 更多