在pom.xml文件中,Git合并冲突仅发生在版本标签上。

21

在将主分支合并到一个分支时,是否有避免pom.xml版本标签冲突的方法?我有相当多的pom文件(80个),它们都有相同的版本,但与主分支中的版本不同。仅为版本标签执行80次git mergetool非常费力和耗时。


我也建议,在使用Maven时,为您的版本拥有一个特定的pom文件,这样当您更改版本时,就不必更新所有文件。 - Vince
3
前面的评论并未回答问题。这与“依赖项”的版本无关,而是与正在构建的软件版本在“pom.xml”文件中有关。这是一个问题,因为我们正在存储有关版本的元数据,并且任何源代码管理工具都必须处理该文件。合并操作变得更加复杂。 - Stephen Harrison
7个回答

10

我总是使用Maven版本插件在从另一个分支合并(带有不同版本)之前更改模块的版本:

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

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


8
您可能有几个选项,但都不完美 :-/
1)您可以使用“git merge -s ours”,但只有在您知道您不需要其他更改时才应这样做。
2)您还可以使用git rerere来解决冲突,它通过记忆上次的操作帮助您解决冲突。您可以全局启用它以便它总是“即插即用”,通过设置rerere.enabled。或者您也可以阅读手册并手动操作。

rerere 真是太棒了。事实上,它如此出色,以至于你经常会忘记自己在使用它。 - Wes Hardaker
1
如果版本发生任何更改,选项2)将无法工作,因为git rerere记录了合并冲突的解决方案。所以在我看来不是一个真正的选择。 - DarVar

2

你还可以使用自定义的合并驱动程序,例如pom-merge-driver

根据您的工作流程,您可能希望将pom作为普通文件合并,但对项目版本进行不同处理:始终采用合并分支版本,或在合并到develop分支时做出例外...


1
我曾遇到同样的问题,但我找到的所有解决方案都无法正确解决。最后,我编写了一个合并驱动程序,仅处理项目/父版本及其内容。没有更改任何依赖项版本,也没有更改xml文件的格式。
我刚刚在https://github.com/cecom/pomutils发布了它。如有任何问题,请告诉我。

1
这个工具现在有了更多的改进。现在你可以自动解决属性值,并且可以编写自己的冲突解决规则。来看看吧 :-) - Sven Oppermann

1

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


1
在我的情况下,我有一些未来的开发需要合并到develop分支中:
  • 例如:mybranch中的一些功能
  • pom.xml中mybranch的版本是:3.11.0-SNAPSHOT
  • mybranch是在版本3.10.0-SNAPSHOT之前创建的
为了将新功能合并到develop分支,并强制使用特性分支中的pom.xml:
git checkout develop
  • pom.xml中的develop版本仍为3.10.0-SNAPSHOT

    git合并mybranch

所有的pom.xml都有冲突,最终可能会有其他文件也存在冲突。

获取所有的pom.xml文件(假设只有版本存在冲突)

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

在运行查找命令之前,我需要解决一些其他的冲突,例如新分支中已删除的子项目。

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


0

既然你所有的版本都相同,那么通配符匹配pom.xml不应该很简单吗?

git checkout --ours *pom.xml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接