Maven - Error Releasing Code to GitHub (Hangs After Push) Maven - Error Releasing Code to GitHub (Hangs After Push) git git

Maven - Error Releasing Code to GitHub (Hangs After Push)


I have run into the same problem and I traced this to the fact that git is requiring a passphrase, but Maven has no way to specify an appropriate passphrase, so the process essentially hangs. Note that this problem is limited to Windows.

The solution is to run ssh-agent. This can be found in C:\Program Files (x86)\Git\bin\. After you run it, it outputs some environment variables that you need to set. For example:

SSH_AUTH_SOCK=/tmp/ssh-LhiYjP7924/agent.7924; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2792; export SSH_AGENT_PID;
echo Agent pid 2792;

So, you need to place these in your environment:

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

Then, you will need to add a passphrase for your particular key file. Generally, if you issued a command like git fetch origin master for your project, you will get a passphrase prompt like: Enter passphrase for key '/c/Users/Anthony Whitford/.ssh/id_rsa' -- that is the file that you need to register with the agent. So, the command is:

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

It will prompt you for a passphrase, so enter it. You should see an Identity added message. Now, the agent knows the passphrase so that you will not be prompted to specify it anymore.

If you have multiple instances of command prompts, make sure that each command prompt has the appropriate SSH_AUTH_SOCK and SSH_AGENT_PID environment variables set. You can validate that this is working by running a command like ssh -v git@github.com and if you DO NOT get prompted for a passphrase, it is working!

Note that when you logoff, the ssh-agent will shut down and so when you log back in or restart your computer, you will need to repeat these steps. My understanding is that your passphrase is stored in memory, not persisted to disk, for security reasons.


The mvn release:prepare goal always runs in non-interactive mode, so you can't enter the ssh passphrase git is waiting for while pushing to the remote repository. You can use an SSH agent to manage that, but if this problem only appears during the release process, there is another solution : preparing the release locally, and pushing the tag afterwards.

For this you have to use version 2.1+ of maven-release-plugin that comes with the pushChanges parameter.

mvn -DpushChanges=false release:prepare 

By the way, your tag is created into your local GIT repository and you can then push it to the remote repository as usual, with a git push command.

This method is useful for Eclipse users because Eclipse comes with an embedded ssh-agent but this agent is not used by maven while performing a release:prepare, even when using eGit.


Considering the source of git builtin-push.c, that means that somehow, no remote are defined for the local Git repo used by the maven script.

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

As illustrated by this blog post, the maven config is not the all story.

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

A remote add is still required, before specifying the maven scm parameters:

Updating the POM

For Maven to function effectively, you should always ensure that you include project VCS information in your POM file.
Now that we’ve added the archetype to a Git repository we can include the appropriate <scm> configuration:

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

The same blog post adds:

It’s important to understand the meaning of each of the child elements of <scm>.

  • The <connection> element defines a read-only url and
  • the <developerConnection> element a read+write url.

For both of these elements the url must adhere to the following convention:

 scm:<scm implementation>:<scm implementation-specific path>
  • Finally, the <url> element content should point to a browsable location and for me this is the GitHub repository home page. Note that in all cases, I’m using an interpolated value which is my project artifactId.

One handy tip is that you can verify this configuration by using the maven-scm-plugin.
This plugin offers ‘vendor’ independent access to common VCS commands by offering a set of command mappings for the configured VCS. The validate goal should confirm all is well:

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