首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为多模块maven项目合并Git flow hotfix的最佳工具

为多模块maven项目合并Git flow hotfix的最佳工具
EN

Stack Overflow用户
提问于 2017-06-16 19:09:47
回答 2查看 880关注 0票数 4

假设我的开发分支在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和其他冲突的文件。我可以以某种方式分离这些文件,通过接受开发分支上已经存在的文件,我可以安全地忽略和合并这些文件。

最好的方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2017-06-16 19:52:58

我所知道的最简单的解决方案是使用属性来表示版本,而不是在pom文件中定义文本。这是从Maven 3.5.0开始提供的。

你可以这样做:

代码语言:javascript
复制
<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>

现在您可以通过以下方式构建它:

代码语言:javascript
复制
mvn -Drevision=1.2.0-SNAPSHOT clean package

但这意味着每次通过命令行调用Maven时都要定义修订,这有点麻烦。因此,您可以通过包含以下内容的.mvn/maven.config文件使用解决方案:

-D修订=1.2.0-快照

您可以在Maven pom本身中定义属性,如下所示:

代码语言:javascript
复制
<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>

这意味着您只有一个定义版本的位置,而不是在每个模块中。

多模块设置也是这样工作的,上面的父级的子级可能如下所示:

代码语言:javascript
复制
<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。它需要看起来像这样:

代码语言:javascript
复制
<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}其他属性当前不受支持。

票数 2
EN

Stack Overflow用户

发布于 2017-06-16 19:28:43

对于git flow来说,这是一个很好的问题。

在您的场景中,您没有提到在版本之外对Pom进行更改,但这在热修复中是有可能的。除了一些非常巧妙的git技巧之外,我们还手动解决了这个问题。

在我们的工作流程中,我们进行手动合并解析,然后使用maven来确保我们设置了正确的快照版本。

代码语言:javascript
复制
 mvn versions:set -DnewVersion=1.0.1-SNAPSHOT -DgenerateBackupPoms=false

然后我们运行我们的测试,今天就到此为止。

我一直在阅读有关git rerere的文章,我认为它在这里可能会非常有帮助。

这个名字代表“重用记录的解决方案”,顾名思义,它允许你让Git记住你是如何解决块冲突的,这样下次它看到同样的冲突时,Git就可以自动为你解决它。More here

对于大多数开发团队来说,这是一个非常恼人的问题,我很有兴趣看到其他的解决方案!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44587798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档