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

时间:2010-07-14 06:08:52

标签: java git maven-2 github maven-release-plugin

我正在尝试运行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 -F C:\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>
    <connection>scm:git:git://github.com/tleese22/my-app.git</connection>
    <developerConnection>scm:git:git@github.com:tleese22/my-app.git</developerConnection>
    <url>http://github.com/tleese22/my-app</url>
</scm>

...

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.0</version>
</plugin>

以下是我的.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)

8 个答案:

答案 0 :(得分:27)

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

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

  

SSH_AUTH_SOCK = / TMP / SSH-LhiYjP7924 / agent.7924;导出SSH_AUTH_SOCK;
  SSH_AGENT_PID = 2792;导出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 added消息。现在,代理知道密码短语,因此不会再提示您指定密码短语。

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

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

答案 1 :(得分:8)

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

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

mvn -DpushChanges=false release:prepare 

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

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

答案 2 :(得分:5)

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

    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.");
        }

如此blog post所示,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>配置:

  <scm>
   <connection>
   scm:git:ssh://github.com/amleggett/${artifactId}.git
   </connection>
   <developerConnection>
   scm:git:ssh://git@github.com/amleggett/${artifactId}.git
   </developerConnection>
   <url>
   http://github.com/amleggett/${artifactId}
   </url>
  </scm>

同一篇博客文章补充道:

  

了解<scm>的每个子元素的含义非常重要。

     
      
  • <connection>元素定义了只读网址和
  •   
  • <developerConnection>元素是一个读+写网址。
  •   
     

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

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

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

~/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

答案 3 :(得分:4)

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

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

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

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

<强> 1。你需要检查git origin

<强> 2。更新你的pom.xml,找到scm部分,

 change github ssh address the `:` to '/'

  before 

   <scm>
    <connection>scm:git:ssh://git@github.com:xxx/xxxin.git</connection>
    <developerConnection>scm:git:ssh://git@github.com:xxx/xxxin.git</developerConnection>
    <url>https://github.com/xxx/jenkins-xxx-plugin</url>
    <tag>HEAD</tag>
   </scm>

then

   <scm>
    <connection>scm:git:ssh://git@github.com/xxx/xxxin.git</connection>
    <developerConnection>scm:git:ssh://git@github.com/xxx/xxxin.git</developerConnection>
    <url>https://github.com/xxx/jenkins-xxx-plugin</url>
    <tag>HEAD</tag>
   </scm>

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

<?xml version="1.0" encoding="UTF-8"?>
 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                  http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
        <id>maven.jenkins-ci.org</id> <!-- For parent 1.397 or newer; before   this use id java.net-m2-repository -->
        <username>your jenkins username</username>
        <password>your jenkins password</password>
    </server>
</servers>

<强> 4。然后提交&amp;推动您的更改

<强> 5。运行mvn release:prepare release:perform