当我使用maven-release-plugin发布一个分支时,为什么它会尝试从版本0创建该分支?

3

我正在使用 maven-release-plugin。我尝试发布一个分支,但是当它尝试执行此命令时失败了:

cmd.exe /X /C "svn --non-interactive copy --file C:\Users\USER~1\AppData\Local\Temp\maven-scm-711744598.commit --parents --revision 0 https://domain/svn/app/branches/2.4.8.x https://domain/svn/app/tags/App-2.4.8.1"

它会出现以下错误:
svn: E195012: Unable to find repository location for 'https://domain/svn/app/branches/2.4.8.x' in revision 0

我认为这是在准备目标中发生的,因为当它失败时会显示:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.5:prepare

我向一位svn专家询问了此事,他说:
等等,为什么它要从r0复制东西?根据定义,r0中没有任何内容。r0始终是一个空的存储库,第一个对象是在r1中添加的。这就是为什么它失败的原因。问题在于maven为什么会尝试这样做。如果您向'svn copy'提供修订参数,则创建的分支/标记基于您指定的修订源,因此该源必须存在于该修订版中(如果您未指定,则获取HEAD,即最新的修订版)。至于这一点,我不知道maven或其插件。
那么为什么maven要从修订版本0复制呢?这是我运行的maven命令:
mvn --batch-mode release:prepare release:perform

我的根POM文件中定义了以下Maven Release插件:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <autoVersionSubmodules>true</autoVersionSubmodules>
                <developmentVersion>2.4.8.2-SNAPSHOT</developmentVersion>
                <releaseVersion>2.4.8.1</releaseVersion>
                <branchBase>https://domain/svn/app/branches</branchBase>
                <tagBase>https://domain/svn/app/tags</tagBase>
            </configuration>
        </plugin>

此外,我的版本控制标签看起来像这样:

<scm>
    <connection>scm:svn:https://domain/svn/app/branches/2.4.8.x</connection>
</scm>

我的svn版本是1.8.5 (r1542147)


我清理了所有东西,只运行了release:prepare,并且它成功地完成了而没有问题。也许这是一个bug,同时运行release:prepare和release:perform会导致这种情况。 - Daniel Kaplan
3个回答

1
我也遇到了这个问题。在受影响的项目中,我在验证阶段对一些文件进行了自定义搜索和替换,并且我想在打标签之前将更改检入Svn,因此我添加了一个自定义检入操作,如下所示:
        <plugin>
            <artifactId>maven-release-plugin</artifactId>
            <configuration>
                <preparationGoals>clean verify scm:checkin -Dmessage="perform release"</preparationGoals>
            </configuration>
        </plugin>

这导致发布插件试图检入pom文件中的更改时,由于这些更改已经被自定义操作提交,因此没有更改可供检入。从而导致了这个错误。
我在我的自定义scm:checkin中添加了一个“includes”文件列表,只包括我所涉及的文件,这为我解决了问题。
最终的配置如下:
        <plugin>
            <artifactId>maven-release-plugin</artifactId>
            <configuration>
                <preparationGoals>clean verify scm:checkin -Dmessage="perform release" -Dincludes="TwogWebUtilsGrailsPlugin.groovy,plugin.xml" -DconnectionType="connection"</preparationGoals>
            </configuration>
        </plugin>

我的自定义替换操作的原因是因为这个项目是一个Grails插件,我正在遵循这篇博客文章中的指南。
晚些编辑:升级到maven 3.2后,这个解决方案似乎会出问题。我又回到了原点。

1

正如我在评论中所说:

我清理了所有内容,只运行了 release:prepare,它成功地运行了而没有出现问题。也许这是一个bug,同时运行 release:prepare 和 release:perform 会导致这种情况

自从我分别运行这些命令以来,我就没有遇到过这个问题。


1

如果有人遇到相同的问题,而评论中的解决方案不起作用,我想为此晚些时候添加一个答案。我们在一个多模块应用程序中遇到了同样的问题,只有我们的父POM有SCM标签(在我们的其他应用程序中完美地工作)。我们遇到了同样的错误,但通过将相应的SCM标签添加到每个子POM中解决了这个问题。我们从未找出原因为什么会这样...


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