Maven – 将代码释放到GitHub时出错(推送后挂起)

我正在尝试运行mvn release:prepare目标并且它在推送后挂起。 知道我可能做错了吗?

 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] BUILD SUCCESSFUL [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Total time: 8 seconds [INFO] [INFO] Finished at: Tue Jul 13 23:54:59 PDT 2010 [INFO] [INFO] Final Memory: 55M/294M [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Checking in modified POMs... [INFO] Executing: cmd.exe /X /C "git add -- pom.xml" [INFO] Working directory: C:\development\taylor\my-app [INFO] Executing: cmd.exe /X /C "git status" [INFO] Working directory: C:\development\taylor\my-app [INFO] Executing: cmd.exe /X /C "git commit --verbose -FC:\Users\TAYLOR~1\AppData\Local\Temp\maven-scm-1932347225.commit pom.xml" [INFO] Working directory: C:\development\taylor\my-app [INFO] Executing: cmd.exe /X /C "git symbolic-ref HEAD" [INFO] Working directory: C:\development\taylor\my-app [INFO] Executing: cmd.exe /X /C "git push git@github.com:tleese22/my-app.git master:master" [INFO] Working directory: C:\development\taylor\my-app >>>> hangs here <<<< 

下面是我的pom.xml的SCM部分:

  scm:git:git://github.com/tleese22/my-app.git scm:git:git@github.com:tleese22/my-app.git http://github.com/tleese22/my-app  ...  org.apache.maven.plugins maven-release-plugin 2.0  

下面是我的.git / config:

 [core] repositoryformatversion = 0 filemode = true logallrefupdates = true bare = false [branch "master"] remote = origin merge = refs/heads/master [remote "origin"] url = git@github.com:tleese22/my-app.git fetch = +refs/heads/*:refs/remotes/origin/* pushurl = git@github.com:tleese22/my-app.git 

这是git show origin的结果:

 $ git remote show origin Enter passphrase for key '/c/Users/Taylor Leese/.ssh/id_rsa': * remote origin Fetch URL: git@github.com:tleese22/my-app.git Push URL: git@github.com:tleese22/my-app.git HEAD branch: master Remote branches: gh-pages new (next fetch will store in remotes/origin) master new (next fetch will store in remotes/origin) Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date) $ git status # On branch master nothing to commit (working directory clean) 

考虑到git builtin-push.c的来源,这意味着不知何故,没有为maven脚本使用的本地Git git builtin-push.c定义远程。

  static int do_push(const char *repo, int flags) { int i, errs; struct remote *remote = remote_get(repo); const char **url; int url_nr; if (!remote) { if (repo) die("bad repository '%s'", repo); die("No destination configured to push to."); } 

正如这篇博文所说明的那样,maven配置不是全部故事。

 ~/foo/mikeci-archetype-springmvc-webapp$ git remote add origin git@github.com:amleggett/mikeci-archetype-springmvc-webapp.git 

在指定maven scm参数之前,仍然需要remote add

更新POM

要使Maven有效运行,您应始终确保在POM文件中包含项目VCS信息。
现在我们已经将原型添加到Git存储库,我们可以包含相应的配置:

    scm:git:ssh://github.com/amleggett/${artifactId}.git   scm:git:ssh://git@github.com/amleggett/${artifactId}.git   http://github.com/amleggett/${artifactId}   

同一篇博客文章补充说:

理解的每个子元素的含义很重要。

  • 元素定义了一个只读url和
  • 元素是一个read + write url。

对于这两个元素,url必须遵循以下约定:

  scm:: 
  • 最后, 元素内容应该指向一个可浏览的位置,对我来说这是GitHub存储库主页。 请注意,在所有情况下,我使用的是插值,这是我的项目artifactId。

一个方便的提示是,您可以使用maven-scm-pluginvalidation此配置。
该插件通过为配置的VCS提供一组命令映射,为“供应商”提供对常见VCS命令的独立访问。 validation目标应确认一切正常:

 ~/foo/mikeci-archetype-springmvc-webapp$ mvn scm:validate [INFO] Preparing scm:validate [INFO] No goals needed for project - skipping [INFO] [scm:validate {execution: default-cli}] [INFO] connectionUrl scm connection string is valid. [INFO] project.scm.connection scm connection string is valid. [INFO] project.scm.developerConnection scm connection string is valid. [INFO] -------------------------------------------------------------- [INFO] BUILD SUCCESSFUL 

我遇到了同样的问题,我追溯到git需要密码的事实,但是Maven无法指定适当的密码,因此该过程基本上是挂起的。 请注意,此问题仅限于Windows。

解决方案是运行ssh-agent 。 这可以在C:\Program Files (x86)\Git\bin\ 。 运行后,它会输出您需要设置的一些环境变量。 例如:

SSH_AUTH_SOCK = / TMP / SSH-LhiYjP7924 / agent.7924; export SSH_AUTH_SOCK;
SSH_AGENT_PID = 2792; export SSH_AGENT_PID;
echo agent pid 2792;

因此,您需要将它们放在您的环境中:

C:\> set SSH_AUTH_SOCK=/tmp/ssh-LhiYjP7924/agent.7924
C:\> set SSH_AGENT_PID=2792

然后,您需要为特定密钥文件添加密码。 通常,如果你为你的项目发出了一个像git fetch origin master这样的命令,你会得到一个密码提示,例如: Enter passphrase for key '/c/Users/Anthony Whitford/.ssh/id_rsa' – 这是你的文件需要在代理商处注册。 所以,命令是:

C:\> ssh-add "/c/Users/Anthony Whitford/.ssh/id_rsa"

它会提示您输入密码,因此请输入密码。 您应该看到Identity addedIdentity added消息。 现在,代理知道密码短语,因此不会再提示您指定密码短语。

如果您有多个命令提示实例,请确保每个命令提示符都设置了相应的SSH_AUTH_SOCK和SSH_AGENT_PID环境变量。 您可以通过运行ssh -v git@github.com类的命令来validation这是否正常工作,如果您没有收到密码短语的提示,它就可以了!

请注意,当您注销时,ssh-agent将关闭,因此当您重新登录或重新启动计算机时,您需要重复这些步骤。 我的理解是,出于安全原因,您的密码存储在内存中,而不是保存到磁盘。

mvn release:prepare目标始终以非交互模式运行,因此您无法输入git passphrase git正在等待推送到远程存储库。 您可以使用SSH代理来管理它,但如果此问题仅在发布过程中出现,则还有另一种解决方案:在本地准备发布,然后推送标记。

为此,您必须使用pushChanges参数附带的2.1及更高版本的maven-release-plugin 。

 mvn -DpushChanges=false release:prepare 

顺便说一句,您的标记被创建到您的本地GIT存储库中,然后您可以像往常一样使用git push命令将其推送到远程存储库。

此方法对Eclipse用户很有用,因为Eclipse附带了一个嵌入式ssh-agent,但maven在执行发布时不会使用此代理:即使在使用eGit时也是如此。

这些是我为消除此错误而遵循的命令的确切顺序

 C:\Program Files (x86)\Git\bin>bash bash-3.1$ eval 'ssh-agent -s' SSH_AUTH_SOCK=/tmp/ssh-ZARFN11804/agent.11804; export SSH_AUTH_SOCK; SSH_AGENT_PID=10284; export SSH_AGENT_PID; echo Agent pid 10284; bash-3.1$ exec ssh-agent bash bash-3.1$ ssh-add "/c/Users/idntus/.ssh/id_rsa" Enter passphrase for /c/Users/idntus/.ssh/id_rsa: Identity added: /c/Users/idntus/.ssh/id_rsa (/c/Users/idntus/.ssh/id_rsa) bash-3.1$ mvn release:prepare release:perform 

唯一对我有用的是将GIT用户名和密码指定为maven参数:

 mvn -Dusername=jenkins -Dpassword=******** release:prepare release:perform 

要在Jenkins输出控制台中隐藏密码,我安装并配置了Mask Passwords插件。

它可能挂起的另一个原因是如果github.com不在known_hosts文件中。 因此,SSH将等待用户接受主机的真实性。

要将github.com添加到您的已知主机,只需快速SSH即可: ssh github.com 。 然后,SSH客户端将要求您确认主机的真实性。 输入“是”,它会说它将github.com永久添加到已知主机列表中。

我遇到过同样的问题。 我尝试了上述所有解决方案,但仍无效。

那是因为我仍然做错了一件事:对于ssh命令我使用git bash而对于maven命令我使用了命令提示符。 并且并不是所有的git命令都可用。

将完整的git bin文件夹添加到PATH变量后,一切都适合我。

我遇到了同样的问题,我尝试了很多方法但是通过以下步骤解决了这个问题:

1.你需要检查git origin

2.更新你的pom.xml,找到scm部分,

  change github ssh address the `:` to '/' before  scm:git:ssh://git@github.com:xxx/xxxin.git scm:git:ssh://git@github.com:xxx/xxxin.git https://github.com/xxx/jenkins-xxx-plugin HEAD  then  scm:git:ssh://git@github.com/xxx/xxxin.git scm:git:ssh://git@github.com/xxx/xxxin.git https://github.com/xxx/jenkins-xxx-plugin HEAD  

3.设置〜/ .m2 / settings.xml

     maven.jenkins-ci.org  your jenkins username your jenkins password   

4.然后提交并推送您的更改

5.运行mvn release:prepare release:perform