Subversion:可以在单个修订中完成多个复制操作吗?

时间:2009-04-03 11:20:17

标签: svn transactions copy pvcs

根据我对Subversion中的事务的理解,原则上这应该是可能的,但我不知道任何支持它的工具。

背景是我们正在讨论从PVCS Dimensions到Subversion的迁移,Subversion中引用的主要特征是“设计部件”。设计部分是可以一起处理的任意文件集合,例如,子项目所需的所有源文件。

替换它的一个想法是通过Makefile中的复制操作,将相关文件复制到分支中。但如果所有文件都是单独复制的,这可能会导致很多修改,这可能会使历史变得混乱,所以最好避免这种情况。

修改: 更多背景信息:

该项目由几个(5-10个)子项目组成,这些子项目单独发布,但共享一些公共源文件和从其他项目导入的外部库。

设计部分引用的一个原因是限制对源文件的依赖性, 另一种是用于管理子项目的产品,以便在一次操作中可以在版本控制中更新所有这些产品。这两种文件都有点散布在各个目录中。

我们约有5名开发人员参与该项目。

8 个答案:

答案 0 :(得分:7)

有一个工具svnmucc就是这样做的,不需要工作副本:

http://subversion.tigris.org/tools_contrib.html#svnmucc_c

答案 1 :(得分:6)

您可以使用:svn copy FROM_URL1 FROM_URL2 URL_TO

例如:

svn copy svn://192.168.1.50/trunk/folder1 svn://192.168.1.50/trunk/folder2 svn://192.168.1.50/tags/MY_TAG

答案 2 :(得分:5)

您可以在工作副本中制作副本,并在以后立即提交所有副本。这只会创建一个版本。

使用命令行客户端,它可能看起来像这样:

svn copy file1 directory
svn copy file2 directory
svn copy file3 directory
svn commit

主要的缺点是你需要一个工作副本,这个工作副本必须包含源目录和目标目录。

答案 3 :(得分:3)

这是非常有趣的,我只是快速阅读设计部分,从我可以收集到的,通过有效地将文件分别分成任意结构,你将会走向一个痛苦的世界你开始将东西合并回原来的位置(合并可能不会在所有文件的单次提交中完成)。

但是我觉得你可以做一些类似的事情来设计颠覆中的部分:

首先,可以使用外部模拟设计部件(1.6允许外部指向文件和目录)。 要做到这一点,你可以设置你的项目heirarchy像这样:

/project1
 /trunk
  /doc
   /design1
   /release2
  /src
   /subproject1
   /subproject2
 /tags
 /branches
 /parts
  /part1
  /part2
  /part3

每个parts文件夹只包含一个“svn:externals”属性,该属性将该部分的相应文件引入适当的子位置,如:

svn:externals

../../trunk/src/subproject1       src/subproject1
../../trunk/doc/release2          doc/release2

然后检查部件而不是主干,并获得一个工作副本,其中只包含部件定义的结构中所需的文件,当您提交时,您将直接进入主干 - 无需合并这里。

您还可以通过首先分割整个行李箱(便宜和快速),然后将您的部件外部更改为指向分支而不是主干线来对您的部件进行基线。这不会增加存储库的大小,并且您的工作副本保持完全相同的结构,您只是从分支而不是主干获取所有文件。对该部分的任何更新也都违反了分支 - 合并部分的更改只是将分支重新整合到分支中的标准重新集成,这是标准的svn实践。

管理零件的定义变得更有趣,因为在上面的方案中,每个零件都是手动定义的,而且它们不是分层的。您需要某种形式的脚本(也许是makefile)知道零件层次结构并给出零件名称,可以构建适当的外部定义,然后将其应用于零件目录。

因此,虽然subversion没有明确提供部件的抽象层,但它可以相当准确地手动建模 - 你只受到svn:externals和用来管理它们的脚本的能力的限制。

答案 4 :(得分:0)

为什么不将子项目放入自己的子目录中。

Project
   |
   ---> Subproject 1
   ---> Subproject 2
   Files from project.

通过这种方式,您可以始终在完整的子项目上运行。

我们有:

Project
   |
   ---> common Files
   ---> Subprojects...

答案 5 :(得分:0)

如果所有项目都在他们自己的存储库中,那么svn externals可以做到这一点

答案 6 :(得分:0)

我遇到了类似的问题: 如何将多个文件复制,分散在存储库中的标签中,并在一个事务中快速进行一次修改。 最简单的方法是创建临时工作副本目录,在那里复制所有需要的文件,然后将本地工作副本复制到远程存储库并删除临时目录:

svn mkdir TMP_DIR
svn mkdir TMP_DIR\MY_TAG
svn cp --parents src\test\File.txt TMP_DIR\MY_TAG\src\test\File.txt
svn cp --parents src\test2\File2.txt TMP_DIR\MY_TAG\src\test2\File2.txt
svn cp -m "comment" TMP_DIR\MY_TAG "http://myrepohost/myrepo/tags/"
svn rm --force TMP_DIR
希望有所帮助。

答案 7 :(得分:0)

您的工作流程/代码组织错误:

如果您在不同的软件包之间共享代码,这显然属于 一个单独的。每个包装一棵树。

将几个包(特定版本)放在一起组成一些环境 (例如,一个更大的软件产品,包括几个,可能是可选的, 组件)属于上面的一个单独的层:发行版,并被处理 通过发行版的软件包管理基础架构。