如何使用Maven从SVN标签创建分支?

时间:2010-07-14 09:21:20

标签: svn maven-2 branch

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

我尝试了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. 

4 个答案:

答案 0 :(得分: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

  

首先,您需要从标记中签出的工作副本开始   如果标签是由release插件创建的,则起始scm url应该是正确的,并指向标签。

     

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

     

另一种方法是手动:

     
      
  • 从标签复制到新分支
  •   
  • 将工作副本切换到新分支(或从新分支中检出工作副本)
  •   
  • 更新pom以使用新分支的url-将更新提交到pom
  •   

答案 1 :(得分: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 Releases会为当前工作副本创建中间提交。我不确定原因,但我认为这是因为某些VCS不支持修改后的工作副本的分支/标记。此参数确保不会对工作副本进行中间提交。

<强> -DremoteTagging =假

使用SVN,默认情况下,标签是远程创建的。如果要省略中间提交,则必须将其设置为false。

<强> -DupdateBranchVersions =真

<强> -DupdateWorkingCopyVersions =假

分支时,您可以为当前工作副本或新分支定义新版本,或两者都定义。如此处设置,工作副本将保持不变,插件将要求分支的新版本。

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

答案 2 :(得分:0)

您正在运行的命令看起来不错,严格遵循Create a Branch中的示例:

  

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

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

注意:如果您愿意,这可能很有用   从标签

创建分支

然而,它似乎是一个'预先提交'的钩子失败和抱怨。所以我想知道:

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

答案 3 :(得分:0)

实际问题是release:branch目标提交标记,即unconscionable bug。没有解决方法。您的预提交挂钩可能会失败,因为它的设计 - 可能是正确的 - 以防止在标记目录中提交。

相关问题