2010-07-14 68 views
3

假设我在$SVNROOT/project/tags/1.0下标记了我们项目的发布版本。现在假设我需要从该标记创建一个分支,将其标记为SNAPSHOT,并更新scm配置。如何使用Maven从SVN标签创建分支?

我试图与release:prepare目标这样的:

$ svn co $SVNROOT/project/tags/1.0 project-1.0 
$ cd project-1.0 
$ mvn release:branch -DbranchName=project-1.0.X -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false 

但这种失败,并显示错误消息警告我说,我没有犯权利纳入$SVNROOT/project/tags/1.0 project-1.0路径(这是完全真实的---我们不允许提交标签)。

我在这里做错了什么,为什么Maven试图在标签中提交一些东西?

更新

只是为了澄清:我上午从进我已经签出了标签的目录运行此。我得到确切的错误是:

[INFO] Executing: /bin/sh -c cd xxx && svn --non-interactive commit --file /tmp/maven-scm-28755080.commit --targets /tmp/maven-scm-535803351230252749-targets 
[INFO] Working directory: xxx 
org.apache.maven.shared.release.scm.ReleaseScmCommandException: Unable to commit files 
Provider message: 
The svn command failed. 
Command output: 
svn: Commit failed (details follow): 
svn: 'pre-commit' hook failed with error output: 
you do not have the rights to access this file: xxx/tags/xxx. 


     at org.apache.maven.shared.release.phase.ScmCommitPhase.checkin(ScmCommitPhase.java:133) 
     at org.apache.maven.shared.release.phase.ScmCommitPhase.execute(ScmCommitPhase.java:109) 
     at org.apache.maven.shared.release.DefaultReleaseManager.branch(DefaultReleaseManager.java:379) 
     at org.apache.maven.shared.release.DefaultReleaseManager.branch(DefaultReleaseManager.java:350) 
     at org.apache.maven.plugins.release.BranchReleaseMojo.execute(BranchReleaseMojo.java:133) 
     at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:284) 
     at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 
     at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:616) 
     at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) 
     at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) 
     at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) 
     at org.codehaus.classworlds.Launcher.main(Launcher.java:375) 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Unable to commit files 
Provider message: 
The svn command failed. 
Command output: 
svn: Commit failed (details follow): 
svn: 'pre-commit' hook failed with error output: 
you do not have the rights to access this file: xxx/tags/xxx. 
+0

可用于通过Maven的过程是一个不同的用户,以获得问题的svn“'tags'”文件夹? – VonC 2010-07-14 14:23:52

回答

4

你在哪里执行该命令mvn release:branch

由于mentioned in this thread

什么插件DOCO并指定是release:branch目标应该是 从收银台位置调用与revision/tag要从分支 。 (即tags/<my_release_version>)。

我用下面的命令行来创建从现有标记位置的维护分支(branches/myapp-1.3.1)(tags/myapp-1.3):

mvn release:branch -DbranchName=myapp-1.3.1 -DupdateBranchVersions=true 
-DupdateWorkingCopyVersions=false 

-DupdateBranchVersions标志涉及版本在pom.xml - 而不是scm版本。
如果为false,它将保留与标签版本相同的版本;
如果为true,它会提示输入一个版本,默认为标签发布的快照,这可能是也可能不是你想要的。

this thread参见:

首先,你需要开始一个工作副本从标签签出。
如果标签是由发布插件创建的,则开始的scm url应该是正确的,并指向标签。

然后使用该插件来创建分支并将工作副本切换到分支。

另一种方法是手动:

  • 从标签复制到一个新的分支
  • 开关工作拷贝到新的分支(或签出从新的支路的工作副本)
  • 更新POM,以使用新分支的网址 - 提交更新到POM
+0

我已更新该问题以考虑您的答案。 – lindelof 2010-07-14 13:26:09

0

你正在运行的命令看起来不错,并严格按照例如,在Create a Branch给出:

默认情况下,在新的分支 的POM保持相同的版本作为本地 工作拷贝,和当地的POM是 递增到下一个版本。如果 要更新新 分支版本,而不是在工作副本, 运行:

mvn release:branch -DbranchName=my-branch -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false 

注:如果你想 从标签创建一个分支这可能是有用

但是,它似乎是'pre-commit'挂钩这是失败和抱怨。所以我想:

  • 你在这个钩子
  • 如果禁用此钩会发生什么做什么暂时
0

实际的问题是,release:branch目标承诺的标签,这是一个unconscionable bug。没有解决方法。你的预提交钩子可能会失败,因为它的设计(可能是正确的)是为了防止在一个标签目录内提交。

2
mvn release:branch 
    -DbranchName=${project.artifactId}_${project.version} 
    -Dusername=${username} 
    -Dpassword=${passwd} 
    -DupdateBranchVersions=true 
    -DupdateVersionsToSnapshot=true 
    -DremoteTagging=false 
    -DsuppressCommitBeforeBranch=true 
    -DupdateWorkingCopyVersions=false 

-DautoVersionSubmodules =真

当然,Maven会提示向分支中使用的版本。我提供了1.5.0-azuresupport-SNAPSHOT。由于autoVersionSubmodules设置为true,Maven Release将自动为所有子模块使用此版本,因此也将所有内部项目依赖项更新为该版本。

-DsuppressCommitBeforeBranch =真

默认情况下,Maven的发布创建中间提交到当前工作的副本。我不确定原因,但我认为这是因为某些VCS不支持修改后的工作副本的分支/标记。该参数确保没有对工作副本进行中间提交。

-DremoteTagging =假

随着SVN,默认情况下,被远程创建标签。如果您想省略中间提交,则必须将其设置为false。

-DupdateBranchVersions =真

-DupdateWorkingCopyVersions =假

转移时,您可以定义当前工作的副本,或者新的分支,或两者的新版本。如此处所设置的,工作副本将被单独保留,并且插件将要求分支的新版本。

这里你所有的-D参数解释 http://startbigthinksmall.wordpress.com/2011/11/29/create-branches-with-maven-release-plugin-svn/