Tay*_*ese 18 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 <<<<
Run Code Online (Sandbox Code Playgroud)
下面是我的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>
Run Code Online (Sandbox Code Playgroud)
下面是我的.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
Run Code Online (Sandbox Code Playgroud)
这是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)
Run Code Online (Sandbox Code Playgroud)
AWh*_*ord 27
我遇到了同样的问题,我追溯到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 added
消息.现在,代理知道密码短语,因此不会再提示您指定密码短语.
如果您有多个命令提示实例,请确保每个命令提示符都设置了相应的SSH_AUTH_SOCK和SSH_AGENT_PID环境变量.您可以通过运行命令验证这是否正常工作ssh -v git@github.com
,如果您没有收到提示输入密码,它就可以了!
请注意,当您注销时,ssh-agent将关闭,因此当您重新登录或重新启动计算机时,您需要重复这些步骤.我的理解是,出于安全原因,您的密码存储在内存中,而不是保存到磁盘.
小智 8
该mvn release:prepare
目标始终运行在非交互模式,这样你就不能进入SSH密码Git是等待,而推到远程存储库.您可以使用SSH代理来管理它,但如果此问题仅在发布过程中出现,则还有另一种解决方案:在本地准备发布,然后推送标记.
为此,您必须使用参数附带的2.1及更高版本的maven-release-pluginpushChanges
.
mvn -DpushChanges=false release:prepare
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您的标记被创建到您的本地GIT存储库中,然后您可以像往常一样使用git push
命令将其推送到远程存储库.
此方法对Eclipse用户很有用,因为Eclipse附带了一个嵌入式ssh-agent,但maven在执行发布时不使用此代理:即使在使用eGit时也是如此.
考虑到源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.");
}
Run Code Online (Sandbox Code Playgroud)
正如这篇博文所说明的那样,maven配置不是全部故事.
~/foo/mikeci-archetype-springmvc-webapp$ git remote add origin git@github.com:amleggett/mikeci-archetype-springmvc-webapp.git
Run Code Online (Sandbox Code Playgroud)
remote add
在指定maven scm参数之前,仍然需要A :
更新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>
Run Code Online (Sandbox Code Playgroud)
同一篇博客文章补充道:
理解每个子元素的含义很重要
<scm>
.
- 该
<connection>
元素定义了一个只读的URL和- 该
<developerConnection>
元素的读+写网址.对于这两个元素,url必须遵循以下约定:
scm:<scm implementation>:<scm implementation-specific path>
Run Code Online (Sandbox Code Playgroud)
- 最后,
<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
Run Code Online (Sandbox Code Playgroud)