Subversion用于标记或提交多个项目的相同修订版

时间:2010-03-17 11:39:42

标签: svn

如何在一个修订版中为多个项目制作标签? 例如,如果需要使用相同的名称进行标记:

svn copy svn://localhost/BigProject/Project1/trunk svn://localhost/BigProject/Project1/tags/1.0.0 --message "1.0.0"
svn copy svn://localhost/BigProject/Project2/trunk svn://localhost/BigProject/Project2/tags/1.0.0 --message "1.0.0"
...
svn copy svn://localhost/BigProject/ProjectX/trunk svn://localhost/BigProject/ProjectX/tags/1.0.0 --message "1.0.0"

但该代码段会进行 X 修订。那么,如何只进行一次修改或如何将所有内容整合在一起呢? 另一个问题是,如何在一个修订版中进行类似的修改? TIA

版本为了更好地理解原因:

  • 标签修订号用于项目版本。因此,在上述情况下,所有项目都有不同的版本,标签相同。
  • 仅在针对一个项目进行特定修改时才需要不同的版本。强制将第四个八位字节添加到版本号。
  • 渴望减少重复 X 次整个BigProject的日志消息。

6 个答案:

答案 0 :(得分:1)

你将在Eclipse中使用Subversive获得一个非常类似于cubanacan帖子的解决方案。

有这样的项目设置:

subproject1
  trunk
  tags
  branches
subproject2
  trunk
  tags
  branches
masterproject
  trunk
    svn:externals to subproject1/trunk
                 and subproject2/trunk
    masterthings
  tags
  branches

拥有masterproject Subversive的工作副本将使用当前的外部版本创建一个标记,他们称之为冻结svn:externals。例如:

masterproject
  trunk
    svn:externals to subproject1/trunk
                 and subproject2/trunk
    masterthings
  tags
    v1.0
      svn:externals to subproject1/trunk at rev. 123
                   and subproject2/trunk at rev. 234
      masterthings at rev. 12345
  branches

您只能获得一个标记主项目的修订版。稍后您可以使用修订信息在需要时创建外部分支。

对于指向没有写访问权限的存储库的外部,这也是一个很好的解决方案。

答案 1 :(得分:1)

您可以使用结帐深度较浅的本地工作副本中的svn cp执行此操作。

您无法使用基于URL的复制命令执行此操作,正如其他答案所指出的那样。 您需要使用工作副本提交来在一个修订版中获取所有这些更改。

以下命令应达到您的目的:

svn co svn://localhost/BigProject --depth=immediates shallow-checkout
cd shallow-checkout
ls   # you will have one empty dir for each project: Project1, Project2, ...
svn update --set-depth=immediates *
  # Each project dir will now have a "trunk" and a "tags" dir, with no content.
  # You do not need to check out all the 'trunk' content, the 'copy' command will still work
  # now make the copies in the WC:
svn cp Project1/trunk Project1/tags/1.0.0
svn cp Project2/trunk Project2/tags/1.0.0
svn cp Project3/trunk Project3/tags/1.0.0
svn cp Project4/trunk Project4/tags/1.0.0
  # make all the tags in one atomic commit:
svn ci -m 'create 1.0.0 tag for projects 1-4'

虽然正如其他答案所指出的那样,更好的解决方案是使用更传统的SVN布局。

答案 2 :(得分:0)

svn帮助说:

usage: copy SRC[@REV]... DST                                             

When copying multiple sources, they will be added as children of DST,
which must be a directory.                                           

  SRC and DST can each be either a working copy (WC) path or URL:
    WC  -> WC:   copy and schedule for addition (with history)
    WC  -> URL:  immediately commit a copy of WC to URL
    URL -> WC:   check out URL into WC, schedule for addition
    URL -> URL:  complete server-side copy;  used to branch and tag
  All the SRCs must be of the same type.

你可以试试WC - > WC复制然后提交。


修改
WC/dir WC/dir2 -> URL似乎也在起作用 因此,您只需trunk结帐。

svn copy dir1 dir2 https://mysvnserver/svn/dy_test/tags/1.0.0 -m "tag 1.0.0."


修改2:添加了--parents : make intermediate directories

svn copy --parents dir1 dir2 https://mysvnserver/svn/dy_test/tags/1.0.0 -m "tag 1.0.0."

答案 3 :(得分:0)

我不相信你可以做你想做的事,至少不是在一个版本中。这是您的设置的副作用,它在项目级别而不是在BigProject级别进行分支。您无法以这种方式为整个事物创建一个发布标记。不过,我猜你真正关心的是将所有项目捆绑在一起的简单方法,而不是单一版本。

这是我的建议:

首先执行上面已经显示的内容(一组SVN Copy命令),在所有项目上创建1.0.0标记。然后创建一个您选择的区域(BigProject / tags可能不会产生感觉,给定您已经获得的布局 - 只需选择一个位置。)

为了我自己的目的,我将使用svn:// localhost / Releases / BigProject /,因为你可能希望它与'BigProject'文件夹层次结构不同,否则我只选择/ BigProject / tags。

在其中,创建一个文件夹,其中包含您正在使用的标记的名称,1.0.0。

现在你有:

svn://localhost/Releases/BigProject/1.0.0

结帐该文件夹。添加一个svn属性,svn:externals,内容为:

svn://localhost/BigProject/Project1/tags/1.0.0
svn://localhost/BigProject/Project2/tags/1.0.0
svn://localhost/BigProject/ProjectX/tags/1.0.0

现在您可以签出svn://localhost/Releases/BigProject/1.0.0,让所有项目都在1.0.0标签上。

答案 4 :(得分:-1)

我的感觉是这是不可能的。说实话,我不明白它为什么要这样做。你想要实现什么(除了在同一版本中创建N标签)?或者措辞不同:为什么你需要这个?标签(在某种程度上)的想法是让你不用记住修订版号并允许你“混合”混合版本我认为确实表明你不需要实现你正在尝试的东西。

要获得“标签1.0.0”,您只需结帐Project1..N/tags/1.0.0,不用担心修订号。

另一方面:您可以为所有项目创建一个标记。那会给你一个修订号。为此,您首先必须以您希望标记的形式创建(本地)工作副本。然后标记这个。但我不确定这是不是你想要的......

不幸的是我不太明白第二个问题。 类似修改是什么意思?彼此相似或类似于第一个问题?

答案 5 :(得分:-1)

基于 Joshua McKinnon 的帖子,我找到了第二个问题的解决方案(关于在一个修订版中提交):

  1. 创建一个文件夹,例如trunk
  2. svn://localhost/BigProject/trunk
  3. 查看该文件夹
  4. 添加svn属性svn:externals,内容为:

    svn://localhost/BigProject/Project1/trunk Project1
    svn://localhost/BigProject/Project2/trunk Project2
    ...
    svn://localhost/BigProject/ProjectX/trunk ProjectX
    
  5. 更新trunk以使您项目的所有中继位于同一工作副本中。

  6. 现在,具有类似修改的捆绑包可以在同一修订版中提交给所有项目。
  7. 用于解决第一个问题的版本(在一个版本中标记)。

    我研究了许多方法,最简单的解决方案似乎是回购的重组:

    BigProject
        tags
        trunk
            Project1
                branches
                trunk
            Project2
                branches
                trunk
            ProjectX
                branches
                trunk
    

    现在可以使用简单的svn copy行:

    svn copy svn://localhost/BigProject/trunk svn://localhost/BigProject/tags/1.0.0