【问题标题】:Maven - Error Releasing Code to GitHub (Hangs After Push)Maven - 将代码发布到 GitHub 时出错(推送后挂起)
【发布时间】:2010-07-14 06:08:51
【问题描述】:

我正在尝试运行 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)

【问题讨论】:

  • 上述 URL 是否在命令行中工作?
  • 我也有这个问题;我认为它在等待密码时被卡住了。该问题仅限于 Windows,因为 Linux 可以缓存密码。我似乎无法找到为一般 scm 连接指定密码的方法。 (它清楚地记录了如何为站点分发之类的事情指定它们,但是该机制利用了一个 id - 并且 scm 标签没有一个 id。)
  • 我最终使用了没有密码的密钥。
  • 这对我有用:打开 git bash 并启动 ssh-agent:..&gt; eval $(ssh-agent -s) 添加本地 .ssh 的密码:..&gt; ssh-add 准备发布:..&gt; mvn release:prepare 推送生成的标签 'myApp-1.0.0 ' 到远程仓库:..&gt; git push origin myApp-1.0.0 运行发布:..&gt; mvn release:perform

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


【解决方案1】:

我遇到了同样的问题,我追踪到 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;
回声代理 pid 2792;

因此,您需要将这些放置在您的环境中:

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

然后,您需要为您的特定密钥文件添加密码。通常,如果您为您的项目发出类似git fetch origin master 的命令,您将收到类似的密码提示:Enter passphrase for key '/c/Users/Anthony Whitford/.ssh/id_rsa' - 这是您需要向代理注册的文件。所以,命令是:

C:\&gt; ssh-add "/c/Users/Anthony Whitford/.ssh/id_rsa"

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

如果您有多个命令提示符实例,请确保每个命令提示符都设置了适当的 SSH_AUTH_SOCK 和 SSH_AGENT_PID 环境变量。您可以通过运行ssh -v git@github.com 之类的命令来验证它是否有效,如果您没有收到输入密码的提示,则说明它有效!

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

【讨论】:

  • 这实际上是最好的答案,其中还包括 ss-agent 问题的解决方法。你为我节省了很多时间。非常感谢。
  • 我可以用选美来代替吗?还是只有腻子的选美?
  • Pageant 也应该可以工作,因为它支持 SSH。 the.earth.li/~sgtatham/putty/0.63/htmldoc/Chapter9.html#pageant
【解决方案2】:

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

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

mvn -DpushChanges=false release:prepare 

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

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

【讨论】:

  • 在 pom.xml 文件中添加 false 可能更容易。
【解决方案3】:

考虑到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 存储库,我们可以包含适当的 &lt;scm&gt; 配置:

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

同一篇博文补充道:

了解&lt;scm&gt; 的每个子元素的含义很重要。

  • &lt;connection&gt; 元素定义了一个只读 url 和
  • &lt;developerConnection&gt; 元素是一个读+写 URL。

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

 scm:<scm implementation>:<scm implementation-specific path>
  • 最后,&lt;url&gt; 元素内容应该指向一个可浏览的位置,对我来说这是 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

【讨论】:

  • 我认为我的问题更多地与 maven-release-plugin 和 git 的可能问题有关,而不是我错误地配置了 部分,但不是积极的。
  • @Taylor:我同意。我回答的重点是'git remote add'。答案的&lt;scm&gt; 部分在这里更多,用于向该主题添加一些一般信息。
  • 如果 CI 服务器上运行的项目较多怎么办?
  • @Brovoker 最好将这个问题作为一个新问题提出(这个问题已有 5 年历史,我没有足够的信息来回答您的评论)
【解决方案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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        1.你需要检查 git 来源

        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.然后提交并推送您的更改

        5.运行 mvn 发布:准备发布:执行

        【讨论】:

          【解决方案8】:

          我有同样的问题。 以上方法我都试过了,还是不行。

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

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

          【讨论】:

            猜你喜欢
            • 2013-05-30
            • 1970-01-01
            • 1970-01-01
            • 2019-11-30
            • 2020-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多