GitHub Action环境下Maven构建失败求助(涉及buildnumber-maven-plugin与templating-maven-plugin)
这个问题的核心是buildnumber-maven-plugin在执行时默认会尝试git pull同步远程代码,但GitHub Action环境里的Git仓库默认配置没有指定分支分歧时的合并策略,导致pull命令抛出"Need to specify how to reconcile divergent branches"错误。
下面提供两种可行的修复方案:
方案一:修改buildnumber-maven-plugin配置,跳过不必要的git pull
既然你本地构建不需要pull就能正常生成版本号,说明我们可以在插件配置里禁用自动pull的行为,只获取当前本地仓库的提交信息。
打开jave-core模块的pom.xml,找到buildnumber-maven-plugin的配置,添加<pullChanges>false</pullChanges>参数:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>buildnumber-maven-plugin</artifactId> <version>...</version> <executions> <execution> <phase>validate</phase> <goals> <goal>create</goal> </goals> </execution> </executions> <configuration> <!-- 添加这一行,禁用自动pull --> <pullChanges>false</pullChanges> <revisionOnScmFailure>unknown</revisionOnScmFailure> <scmBranch>develop</scmBranch> <!-- 其他原有配置 --> </configuration> </plugin>
这个配置会让插件只使用本地仓库的提交记录生成build number,不再执行git pull,从根源避免分支分歧的问题。
方案二:在GitHub Action中预先配置Git的pull策略
如果需要保留插件的pull行为,可以在GitHub Action的maven构建步骤前,添加Git配置命令,指定默认的合并策略:
打开你的GitHub Action配置文件(.github/workflows/maven.yml),在run: mvn ...步骤之前,添加:
- name: Configure Git pull strategy run: | git config pull.ff only
这样后续的git pull命令会默认使用fast-forward only模式,不会因为分支分歧而报错。
另外补充一点:GitHub Action的默认checkout是浅克隆(--depth 1),如果buildnumber插件需要完整的提交历史,你还需要修改checkout步骤,添加fetch-depth: 0来拉取完整仓库:
- uses: actions/checkout@v4 with: fetch-depth: 0
验证修复
选择其中一种方案修改后,提交代码到GitHub,重新触发Action构建,应该就能解决这个git pull失败的问题了。
内容的提问来源于stack exchange,提问作者André Schild

