假设我的开发分支在v1.0.1-SNAPSHOT上,我的master在1.0.0上。我必须创建一个热修复程序。使用SourceTree的Git Flow菜单(或任何其他工具),我从master创建热修复分支,将pom更新到v1.0.0.1(使用mvn versions:set -DnewVersion=1.0.0.1),然后进行修复。
当我使用Git-Flow完成热修复时,我必须合并回开发分支。这意味着pom文件将发生冲突。在我有一个带有大模块树的多模块项目的情况下,所有的pom都必须解决。在两个分支中更改的其他文件也将发生冲突。
考虑到在热修复期间没有对pom进行任何更改,只需使用开发分支上的版本即可解决这些问题。
这必须为每个热修复程序做,但例如使用SourceTree,很难在视觉上区分pom和其他冲突的文件。我可以以某种方式分离这些文件,通过接受开发分支上已经存在的文件,我可以安全地忽略和合并这些文件。
最好的方法是什么?
发布于 2017-06-16 19:52:58
我所知道的最简单的解决方案是使用属性来表示版本,而不是在pom文件中定义文本。这是从Maven 3.5.0开始提供的。
你可以这样做:
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>18</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<version>${revision}</version>
...
</project>现在您可以通过以下方式构建它:
mvn -Drevision=1.2.0-SNAPSHOT clean package但这意味着每次通过命令行调用Maven时都要定义修订,这有点麻烦。因此,您可以通过包含以下内容的.mvn/maven.config文件使用解决方案:
-D修订=1.2.0-快照
您可以在Maven pom本身中定义属性,如下所示:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>18</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<version>${revision}</version>
...
<properties>
<revision>1.0.0-SNAPSHOT</revision>
</properties>
</project>这意味着您只有一个定义版本的位置,而不是在每个模块中。
多模块设置也是这样工作的,上面的父级的子级可能如下所示:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<version>${revision}</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-child</artifactId>
...
</project>但请注意,在您喜欢使用deploy such artifacts to a repository或只是想使用mvn install的情况下,您必须使用flatten-maven-plugin。它需要看起来像这样:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>18</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<version>${revision}</version>
...
<properties>
<revision>1.0.0-SNAPSHOT</revision>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<modules>
<module>child1</module>
..
</modules>
</project>这意味着最终您只需要一行代码来定义项目的版本,这将大大减少合并问题。
请仔细阅读文档!
请仅使用${revision}、${changelist}或${sha1}其他属性当前不受支持。
发布于 2017-06-16 19:28:43
对于git flow来说,这是一个很好的问题。
在您的场景中,您没有提到在版本之外对Pom进行更改,但这在热修复中是有可能的。除了一些非常巧妙的git技巧之外,我们还手动解决了这个问题。
在我们的工作流程中,我们进行手动合并解析,然后使用maven来确保我们设置了正确的快照版本。
mvn versions:set -DnewVersion=1.0.1-SNAPSHOT -DgenerateBackupPoms=false然后我们运行我们的测试,今天就到此为止。
我一直在阅读有关git rerere的文章,我认为它在这里可能会非常有帮助。
这个名字代表“重用记录的解决方案”,顾名思义,它允许你让Git记住你是如何解决块冲突的,这样下次它看到同样的冲突时,Git就可以自动为你解决它。More here
对于大多数开发团队来说,这是一个非常恼人的问题,我很有兴趣看到其他的解决方案!
https://stackoverflow.com/questions/44587798
复制相似问题