Maven Release Plugin 在 Git 中执行轻量级或带注释的标签吗?(另外,如果默认为轻量级标签,它是否支持带注释的标签?)
例如,我可以使用以下任一方法手动标记项目:
git tag v1.0.0
#轻量级
或者,交替地,
git tag -a v1.0.0
#已注释
这些是非常不同类型的标签。第一个是轻量级的 Git 标签,第二个是带注释的 Git 标签。
(注意:我知道
release:prepare
目标通过POM更改执行提交,这实际上模拟了带注释的标签,因为它将标签与新的特定提交联系在一起,但我的问题是带注释的标签是否是无论如何,结果。)
背景: Mavenized Java 项目上的 Maven 3.3.9 和 Git 2.7.4。在 Google 或 SO 中找到这个答案并不容易。
更新:Maven 发布插件的标签始终带有注释。不支持轻量级标签。请参阅下面的答案和我的评论来证实它。
虽然我没有找到关于这个问题的文档(也许它存在),但我进行了试运行。使用简单的 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
带注释的标签报告
tag
为 git cat-file -t
,而轻量级标签报告 commit
。
Maven Release Plugin 版本 3.0.1 通过 Maven SCM 插件版本 2.0.0 支持两个 Git 提供程序实现:
jgit
,它使用 Eclipse JGit,它支持带注释和轻量级标签。git
,委托给提供的 Git 可执行文件(git
或 git.exe
),它自然支持带注释和轻量级标签。自从 2008 年 4 月 5 日maven-scm@fb97fde
开始支持 Git 以来,这似乎就是事实。
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 插件没有采取必要的步骤来利用轻量级标签,因此不可能创建轻量级标签。这是相当明智的:轻量级标签不适合此用例。