【问题标题】:Git merge conflict only on version tag in pom.xmlGit 合并冲突仅在 pom.xml 中的版本标记上
【发布时间】:2012-08-25 04:48:02
【问题描述】:

在将 master 合并到分支时,有没有办法避免 pom.xml 中的版本标记中的合并冲突?我有很多 pom 文件,80 个,它们都有相同的版本,与 master 中的不同。仅仅为了一个版本标签,对 80 个 pom 文件执行git mergetool 既费力又费时。

【问题讨论】:

  • 我还建议,关于 maven,为您的版本提供一个特定的 pom,这样当您更改版本时,您不必更新所有文件。
  • 前面的评论没有解决这个问题。这与 dependency 版本无关。这与您在 pom.xml 文件中构建的软件版本有关。这是一个问题,因为我们将有关版本的元数据存储在任何 SCM 都必须处理的文件中。然后合并变得复杂。

标签: git pom.xml git-merge merge-conflict-resolution git-merge-conflict


【解决方案1】:

我总是使用maven versions plugin 更改模块的版本,然后从另一个分支(使用不同的版本)合并:

mvn versions:set -DnewVersion=1.1 -DgenerateBackupPoms=false

这会将所有当前模块(父模块和子模块)的版本更改为您指定为 newVersion 参数的版本。更改版本后,进行新的提交(git commit ...),然后进行合并。我已经使用 Jenkins 任务将所有这些自动化,但以其他方式(例如 sh 脚本)实现它应该不难。

【讨论】:

    【解决方案2】:

    您可能有几个选择。没有一个是完美的:-/

    1) 您可以使用 'git merge -s ours',但只有在您知道不需要其他更改时才应该这样做。

    2) 您也可以使用 git rerere,它通过记住您上次所做的事情来帮助解决冲突。您可以通过设置 rerere.enabled 来全局启用它,使其始终“正常工作”。或者您也可以阅读手册页并手动操作。

    【讨论】:

    • 这里有岩石。事实上,它非常震撼,以至于你经常忘记自己在使用它。
    • 选项 2) 如果版本发生任何变化,则将不起作用,因为 git rerere 记录了合并冲突解决方案。因此,IMO 并不是一个真正的选择。
    【解决方案3】:

    您也可以使用自定义合并驱动程序,如pom-merge-driver。 根据您的工作流程,您可能希望将 pom 合并为普通文件,但以不同方式处理项目版本:始终采用合并分支版本,或在合并到开发分支时异常...

    【讨论】:

      【解决方案4】:

      看看resolve-maven-version-conflicts.pl。它是专门用于解决 pom 冲突的合并工具。它会忽略双方都是-SNAPSHOT 版本的任何更改,但留下任何其他冲突以供进一步解决。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,我发现的所有解决方案都没有,imo,正确。最后我写了一个合并驱动程序,它只处理项目/父版本并且只处理它们。没有更改依赖版本,也没有更改 xml 文件的格式。

        我在几分钟前发布了它@@https://github.com/cecom/pomutils。如果您有任何问题,请告诉我。

        【讨论】:

        • 该工具现在有了更多改进。现在您还可以自动解析属性值,并且可以编写自己的冲突解决规则。看看:-)
        【解决方案6】:

        在我的情况下,我有一些未来的发展要合并到发展中:

        • 示例:mybranch 中的一些功能
        • pom.xml 中的 mybranch 版本为:3.11.0-SNAPSHOT
        • mybranch 是在 3.10.0-SNAPSHOT 版本之前分叉的

        将新特性合并到develop并从特性分支强制pom.xml:

        git checkout develop
        
        • pom.xml 中的开发版本仍然是:3.10.0-SNAPSHOT

          git 合并我的分支

        所有 pom.xml 都存在冲突 + 最终还有一些其他文件。

        获取所有pom.xml 文件(假设除了版本没有冲突)

        find -name pom.xml -not -path "**/target*" -exec git co --theirs {} +
        

        我必须解决其他一些冲突,例如在运行 find 命令之前,在我的新分支中删除了一个子项目。

        在那之后,我所有的 pom.xml 都是新版本并且编译没有任何问题。

        【讨论】:

          【解决方案7】:

          不应该像通配符 pom.xml 一样简单,因为你所有的版本都是一样的吗?

          git checkout --ours *pom.xml
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-29
            • 1970-01-01
            • 1970-01-01
            • 2017-07-24
            • 1970-01-01
            • 2016-12-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多