使用Maven发布插件时出现“Git致命错误:ref HEAD不是符号引用”的错误。

129

我在运行Maven发布插件准备步骤时遇到以下错误输出,即从Atlassian Bamboo计划中运行mvn release:prepare --batch-mode -DreleaseVersion=1.1.2 -DdevelopmentVersion=1.2.0-SNAPSHOT -Dtag=v1.1.2 -X。但是在命令行中执行相同的命令可以正常工作。完整的错误堆栈如下。

有什么解决方法吗?

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.4.2:prepare (default-cli) on project hpcmom: An error is occurred in the checkin process: Exception while executing SCM command. Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref -> [Help 1]
    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.4.2:prepare (default-cli) on project hpcmom: An error is occurred in the checkin process: Exception while executing SCM command.
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoExecutionException: An error is occurred in the checkin process: Exception while executing SCM command.
    at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:281)
    at org.apache.maven.plugins.release.PrepareReleaseMojo.execute(PrepareReleaseMojo.java:232)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 more
Caused by: org.apache.maven.shared.release.ReleaseExecutionException: An error is occurred in the checkin process: Exception while executing SCM command.
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.checkin(AbstractScmCommitPhase.java:160)
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.performCheckins(AbstractScmCommitPhase.java:145)
    at org.apache.maven.shared.release.phase.ScmCommitPreparationPhase.runLogic(ScmCommitPreparationPhase.java:76)
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.execute(AbstractScmCommitPhase.java:78)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:234)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:169)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:146)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:107)
    at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:277)
    ... 22 more
Caused by: org.apache.maven.scm.ScmException: Exception while executing SCM command.
    at org.apache.maven.scm.command.AbstractCommand.execute(AbstractCommand.java:63)
    at org.apache.maven.scm.provider.git.AbstractGitScmProvider.executeCommand(AbstractGitScmProvider.java:291)
    at org.apache.maven.scm.provider.git.AbstractGitScmProvider.checkin(AbstractGitScmProvider.java:217)
    at org.apache.maven.scm.provider.AbstractScmProvider.checkIn(AbstractScmProvider.java:410)
    at org.apache.maven.shared.release.phase.AbstractScmCommitPhase.checkin(AbstractScmCommitPhase.java:156)
    ... 30 more
Caused by: org.apache.maven.scm.ScmException: Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref

    at org.apache.maven.scm.provider.git.gitexe.command.branch.GitBranchCommand.getCurrentBranch(GitBranchCommand.java:147)
    at org.apache.maven.scm.provider.git.gitexe.command.checkin.GitCheckInCommand.createPushCommandLine(GitCheckInCommand.java:192)
    at org.apache.maven.scm.provider.git.gitexe.command.checkin.GitCheckInCommand.executeCheckInCommand(GitCheckInCommand.java:132)
    at org.apache.maven.scm.command.checkin.AbstractCheckInCommand.executeCommand(AbstractCheckInCommand.java:54)
    at org.apache.maven.scm.command.AbstractCommand.execute(AbstractCommand.java:59)
    ... 34 more
[ERROR] 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
simple  02-Dec-2013 17:18:09    Failing task since return code of [/opt/dev/apache-maven/3.0.5//bin/mvn -Djava.io.tmpdir=/opt/atlassian/bamboo/5.2.1/temp/HPCMOM-RELEASE-JOB1 release:prepare --batch-mode -DignoreSnapshots=false -DreleaseVersion=1.1.2 -DdevelopmentVersion=1.2.0-SNAPSHOT -Dtag=v1.1.2 -X] was 1 while expected 0

更新:

在本地工作区克隆上执行git ls-remote .会产生以下结果:

azg@olympus:~/code/hpcmom$ git ls-remote .
7894eea08a0afecb99515d1339623be63a7539d4    HEAD
7894eea08a0afecb99515d1339623be63a7539d4    refs/heads/master
7894eea08a0afecb99515d1339623be63a7539d4    refs/remotes/origin/HEAD
7894eea08a0afecb99515d1339623be63a7539d4    refs/remotes/origin/master
6a7095b86cccdfd4b28e4dea633d0930809ae9ac    refs/tags/v1.0
1a53462b1ecf0abfea8245016304cda9c78b420d    refs/tags/v1.0^{}
5113a7cbcf35c47b680a9c36e15e5fa01ef1d2e6    refs/tags/v1.1
79a3073ecabe65d3c8051520f8007d9e49a65a06    refs/tags/v1.1^{}
a00249209597ea1214d80ee38f228c40db7022c2    refs/tags/v1.1.0
e892bce8d25d87368ab557fee0d30810bef7e31e    refs/tags/v1.1.0^{}
b491a312c39088533cb069e4ab1ae8a00d1f6bfe    refs/tags/v1.1.2
a3f7618dada7ed60d8190426152ffd90e0e40a86    refs/tags/v1.1.2^{}

在 Bamboo 克隆上执行 git ls-remote . 将产生:

azg@olympus:/var/atlassian/application-data/bamboo/xml-data/build-dir/HPCMOM-RELEASE-JOB1$ git ls-remote .
2422ce066ac35dae3c54f1435ef8dae5008a9a14    HEAD
57c08d581c0fd9e788049733fbdc9c22b9a6ae00    refs/heads/master
57c08d581c0fd9e788049733fbdc9c22b9a6ae00    refs/remotes/origin/HEAD
57c08d581c0fd9e788049733fbdc9c22b9a6ae00    refs/remotes/origin/master
7539f9700d78a1b766fca7ed9f409914f1ea9d08    refs/tags/vnull
6bfa8c3fdb1f8f56a385035f01b1b77b6e88da8b    refs/tags/vnull^{}

为什么本地开发克隆的输出结果与Bamboo(一种CI/CD工具)的输出结果非常不同,这非常奇怪?


4
问题在于Bamboo下的结账处于“分离HEAD”状态。看起来Maven试图解析当前分支名称并失败,因为在分离HEAD状态下,“HEAD”参考不再指向分支名称,而是SHA1。您可以通过运行“git checkout SHA1”或在引用名称后附加“^{}`'来本地模拟此操作。看起来Bamboo git插件尝试在可能的情况下检出分支。因此,在构建运行之前,已经出现了新内容,这似乎是一个竞赛条件。目前还不清楚如何修复它。 - John Szakmeister
可能是Active Git branch is "(no branch)" on hudson CI的重复问题。 - Alberto
12个回答

179

在使用Maven发行插件时,我在Jenkins上遇到了相同的错误。我们通过进入“附加行为”,检查特定的本地分支并输入“master”来解决它。

我意识到这不是一个解决方案,但它可能会给你一些方向去寻找解决方法。


5
只有在使用主分支进行构建时才有效。如果你的分支不同,即使将其更改为特定的分支名称,也不起作用。 - siddhusingh
33
我在一个不同于主分支的分支上,它也能正常工作。我认为问题在于Jenkins git插件通常以分离头状态检出分支,所以 git symbolic-ref 命令失败了。通过添加“检出特定本地分支”来解决这个问题。 - René Link
21
使用 ** 代替 master,将会把本地分支名称与远程分支名称进行匹配。 - neXus
3
根据 Git插件 - Jenkins - Jenkins Wiki 的说明,将该字段留空也可以使用:“如果选中,并且它的值为空字符串或 **,则分支名称会从远程分支计算而来,不包括 origin。” - evgeny9
在我的情况下,这是一个共享的流水线,因此所有设置都来自于pom.xml。我该如何在代码中编写此指令:附加行为,检出到特定的本地分支并输入“master”。 - arielma
点击字段旁边的“?”按钮,以查看“**”的解释。 - cambunctious

42

对于Jenkins和GIT,添加附加行为检出到特定的本地分支并使用Workspace Cleanup Plugin清理您的工作区以开始CI作业。


2
谢谢,这对我有用。我还需要添加-Darguments="-Dmaven.deploy.skip=true" - timbru31
@toschneck您好,我正在使用Jenkins和Git时遇到了完全相同的问题。请问您能否在此处扩展您的答案,包括所提到的插件的命令和配置?谢谢。 - Jeremy
另外清理工作区的原因是什么? - kap
目前我已经转向使用maven-jgitflow插件。它支持特性和错误修复分支,并且具有我见过的最好的发布功能。https://bitbucket.org/atlassian/jgit-flow/wiki/Home - toschneck
“将“检出到特定本地分支”添加”对我也有效。 - johnlinp

14
在Atlassian Bamboo中的问题通过取消默认设置 使用浅克隆 来解决,其描述为 获取可能的最浅的提交历史记录。如果您的构建依赖于完整的存储库历史记录,则不要使用该选项。此复选框位于 Plan Configuration -> Repositories 选项卡 -> Git -> 高级选项 下方。
之后,所有的发布都正常工作了。

7
我的做法是在执行“mvn release”之前先执行“git checkout -f master”。

7

对于GitHub Actions,您可以使用actions/checkout@v2并设置ref:master

steps:
  - uses: actions/checkout@v2
    with:
      ref: master

6

在我的情况下(我使用的是Bamboo 5.7.2),取消选中 使用浅层克隆 是不够的。我还需要在源代码检出任务中启用 强制清除构建。启用 使用浅层克隆 可以在下一次作业执行时起作用,但所有后续执行都会导致相同的错误。


6

我正在使用 Jenkins 团队项目,采用多分支项目设置。

以前我使用了 checkout scm 命令。

现在我正在使用以下代码:

checkout([
                 $class: 'GitSCM',
                 branches: scm.branches,
                 extensions: scm.extensions + [[$class: 'CleanCheckout'], [$class: 'LocalBranch', localBranch: 'new']],
                 userRemoteConfigs: scm.userRemoteConfigs
            ])

3
看起来这个方法可行,我点了个赞。但在进一步的尝试中,我发现它实际上创建了一个名为“new”的新分支(当与Maven发布插件一起使用时)。更正确的方法是将new改为**,这样本地分支名称就与远程分支相同了。 - Tobb

4

我曾在使用Maven Release插件的Bamboo中遇到过这个问题。通过启用“Source Checkout”任务中的“Force Clean Build”选项,我已经解决了这个问题。Bamboo表示这可能会使构建变慢,但它确实有效,并且我没有看到任何显着的时间增加。


你使用的Bamboo版本是哪个?我之前尝试过这个,但是没有成功。 - SkyWalker
1
我正在使用5.3版本的构建4101 - 2013年12月9日。 - zakmck

2
这是我的解决方法:
  • 进入 Jenkins 任务 → 配置
  • 源代码管理 → 其他行为
  • 添加 → 检出到特定的本地分支
  • 分支名称:${GIT_LOCAL_BRANCH}
  • 保存

jenkins config


1
这创建了一个名为${GIT_LOCAL_BRANCH}的新分支,而不是mainmaster - Ivan dal Bosco
我遇到了同样的问题。我建议不要使用这个技巧,因为Git仓库中会出现一个新分支。 - Jesper Rønn-Jensen
这个方法没有起作用,但它帮助我找到了一个对我有效的类似解决方案 - not2savvy

1
问题在于它没有获取到分支,因此在执行mvn release:prepare --batch-mode -DreleaseVersion=1.1.2 -DdevelopmentVersion=1.2.0-SNAPSHOT -Dtag=v1.1.2 -X之前,请先执行git checkout master或所需的分支。

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