据我所知,为了使用 maven-release-plugin,您必须将 scm 部分放入您的 POM 文件中。例如。:
<scm>
<connection>scm:hg:ssh://hg@bitbucket.org/my_account/my_project</connection>
<developerConnection>scm:hg:ssh://hg@bitbucket.org/my_account/my_project</developerConnection>
<url>ssh://hg@bitbucket.org/my_account/my_project</url>
<tag>HEAD</tag>
</scm>
我了解此数据用于确定要标记的内容以及将更改推送到何处。但是,如果您已克隆/ checkout 代码,这些信息是否已经可用?我对我需要告诉 maven 它需要标记什么代码的概念有点挣扎,至少在理论上,只要问 Git/HG/SVN/CVS 它正在处理什么代码。我怀疑我在细节上遗漏了一些东西,但我不确定是什么。是否可以更改 maven-release-plugin 代码以将其作为要求删除,或者至少将自动检测设为默认值?如果没有,有人可以提供一些关于为什么这不起作用的背景信息吗?
最佳答案
一方面,GIT 和 Subversion 可以有不同的 SCM URI 用于读写和只读访问。
这就是不同的<connection>
和 <developerConnection>
URI 应该被捕获。第一个是保证读取访问的 URI。第二个是保证写访问的URI。
很多时候,无法从 checkout 的存储库中推断出规范的 URI。
例如,我可以通过 svn:
查看内部的 Subversion 存储库。协议(protocol)和服务器的 IP 地址,但外部贡献者需要使用 https://
与主机名。
甚至使用 GIT 存储库,在 Github 上,您有不同的 URI 用于不同的访问机制,例如
https://github.com/stephenc/eaio-uuid.git
(使用用户名/密码或 OAuth 读写)git@github.com:stephenc/eaio-uuid.git
(使用 SSH 私钥识别读写)git://github.com/stephenc/eaio-uuid.git
(匿名只读)没关系,您可能已经 checkout
git://github.com/zznate/eaio-uuid.git
或克隆本地 checkout ,换句话说,您的本地 git 存储库可能“上游”是 ../eaio-uuid-from-nate
而不是 git@github.com:stephenc/eaio-uuid.git
我同意对于某些 SCM 工具,您可以自动检测...例如,如果您知道源已从中 checkout ,例如AccuRev,假设它的详细信息应该没问题...直到您将 Subversion 或 GIT 或 CVS 或其他代码模块 checkin 到 AccuRev 工作区(真实故事),以便可以更新被拉入的标签。
所以简而言之,检测代码必须确保您没有同时使用两个 SCM 系统来确定哪个是主 SCM……而另一个 SCM 甚至可能不会将标记文件留在磁盘上嗅出(例如,AccuRev 不...因此我选择了它)
唯一安全的方法是要求 pom 至少定义 SCM 系统,并且对于那些无法可靠推断 URI 的 SCM 系统(想想 CVS、Subversion、GIT、HG,实际上它们中的大多数)需要 URI被指定。
关于maven - 使用 maven-release-plugin 时,为什么不从本地 repo 中检测 scm 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674481/