如何在切换git分支时切换maven本地存储库缓存

时间:2015-12-08 07:08:29

标签: git maven

我在项目中使用maven和git。 git存储库包含一个maven项目,该项目包含多个子项目,这些子项目位于具有自己的pom文件的不同目录中。我使用git本地分支,我经常在这些分支之间切换。每当我切换git本地分支时,我都需要调用mvn install来刷新$HOME/.m2中的本地maven存储库缓存。 git分支交换机很快,但本地本地maven缓存重建需要20多分钟。如果我不重建它,则子项目构建失败,因为子项目依赖于其他子项目。

我的目的是为合并后创建一个git钩子,并为每个分支创建一个单独的maven存储库缓存。然后git钩子可以调用类似ln -s branch-specific-cache $HOME/.m2的东西。

但我认为这样的解决方案必须已经存在,而且我不想发明轮子。是否存在允许跟随的现有机制?

  • 更改git分支时更改本地maven缓存
  • 创建git分支时创建本地maven缓存的副本

3 个答案:

答案 0 :(得分:2)

我将此作为单独的答案添加,因为我认为它确实是最干净,最简单的解决方案,而且没有"技巧"使用多个本地maven存储库。

简而言之 - 您需要在每个分支中使用不同的工件版本控制。一个简单的约定可能是:BRANCH-X.Y.Z[-SNAPSHOT]

例如:

  • develop分支:<version>0.0.1-SNAPSHOT</version>
  • abc分支:<version>ABC-0.0.1-SNAPSHOT</version>
  • xyz分支:<version>XYZ-0.0.1-SNAPSHOT</version>
  • (依此类推)

Maven非常有能力使用这样的版本操作,你可以在同一个repo中做到这一点,而不会让分支工件踩在彼此之上。脚趾。

请注意,我已在本地对此进行了测试,我的项目版本为1.16-SNAPSHOT,而SQLSERVER-1.16-SNAPSHOT位于sqlserver分支,它就像魅力一样。

答案 1 :(得分:1)

这真的很讨厌,但你可以尝试这样的事情(没有经过测试)。

  • 将您的$ M2_HOME设置为项目
  • 中的位置
  • 从那里添加conf/settings.xml文件
  • <localRepository>设置为 git项目
  • 之外的某个地方

通过这种方式,每次更改分支时,您都会更改settings.xml,并且当您运行mvn ...

时,maven会以不同的方式运行

请注意,我没有对它进行测试,而且它非常“hacky”,但它应该会给你一些想法。

答案 2 :(得分:1)

经过一些实验后,我创建了一个git post-checkout钩子。我在我家$HOME/.m2.branch-name/subproject的每个分支都有一个目录。根据我在git repository中看到的分支,maven缓存包含指向目录的符号链接。

如果新选择的分支的目录已存在,则post-checkout挂钩会创建符号链接,或者创建目录并从先前选定的分支复制数据。第一种情况很快。由于复制,第二种情况需要很长时间,但只有在创建和检出新分支时才会执行一次。

钩子脚本是:

#!/bin/sh

project=$HOME/.m2/repository/com/mycompany
subproject=mysubproject
newbranch=`git rev-parse --abbrev-ref HEAD`
m2newbranch=~/.m2.$newbranch

if [ -d "$m2newbranch" ]
then
    ln -sf "$m2newbranch/$subproject" "$project"
else
    mkdir -p "$m2newbranch/$subproject"
    cp -R "$project/$subproject/"* "$m2newbranch/$subproject"
    ln -sf "$m2newbranch/$subproject" "$project"
fi