Maven发布插件和Git标记风格

hof1towb  于 2023-10-17  发布在  Maven
关注(0)|答案(2)|浏览(116)

Maven Release Plugin是否在Git中执行轻量级或带注解的标记?(另外,如果默认为轻量级标签,是否支持带注解的标签?)

例如,我可以手工标记一个项目,使用:
git tag v1.0.0 #轻量级
或者,可选地,
git tag -a v1.0.0 #带注解
这些是非常不同类型的标签。第一个是轻量级的Git标签,第二个是带注解的Git标签。
(**注意:**我知道release:prepare目标执行带有POM更改的提交,这实际上 * 模拟了一个带注解的标签,因为它将标签绑定到一个新的特定提交 *,但我的问题是,无论如何,带注解的标签是否是结果。

**背景:**Maven 3.3.9和Git 2.7.4在一个Mavenized Java项目上。在Google或SO上找到这个答案并不容易。
更新:Maven Release Plugin的标签始终带注解。不支持轻量级标记。请看下面的答案和我的评论来证实它。

fhity93d

fhity93d1#

虽然我没有找到关于这个问题的文档(也许它存在于那里),但我做了一个试验。用一个简单的POM创建一个本地GIT仓库,然后执行maven release:prepare。当我在结果标签上运行git show $MYTAG时,git输出包含“Tagger”数据,这表明它是一个带注解的标签。
https://git-scm.com/book/en/v2/Git-Basics-Tagging
https://maven.apache.org/maven-release/maven-release-plugin/prepare-mojo.html

cqoc49vn

cqoc49vn2#

带注解的标记报告git cat-file -ttag,而轻量级标记报告commit
Maven Release Plugin版本3.0.1通过Maven SCM Plugin版本2.0.0支持two Git provider implementations

maven-scm@fb97fde,2008-04-05中的the inception of Git support开始,这似乎是正确的。
虽然看起来没有指定,但默认的SCM提供程序实现似乎是与SCM提供程序ID匹配的实现,在本例中表示git(而不是jgit)。运行mvn release:prepare可以简单地证明git是默认的提供程序实现。
具体来说,Release插件默认运行以下命令:

~/foo $ mvn release:prepare --batch-mode
...
[INFO] 12/17 prepare:scm-tag
[INFO] Tagging release with the label foo-project-1.0...
[INFO] Executing: /bin/sh -c cd '/.../maven-multi-module-demo' && 'git' 'tag' '-F' '/tmp/maven-scm-2066945070.commit' 'foo-project-1.0'
[INFO] Working directory: /.../maven-multi-module-demo
[INFO] Executing: /bin/sh -c cd '/.../maven-multi-module-demo' && 'git' 'push' 'file:///tmp/tmp.HoDbTO8Iel' 'refs/tags/foo-project-1.0'

请注意,git tag -F <file>意味着-a选项;见证人:

~/foo $ git cat-file -t foo-project-1.0
tag

很久以前,JGit只支持带注解的标签。从那时起,JGit也学会了支持轻量级标签,但带注解的标签仍然是默认的,并且Release插件没有采取必要的步骤来利用轻量级标签,因此不可能创建轻量级标签。这是相当明智的:轻量级标记不适合这种使用情况。

相关问题