7

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

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

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

编辑: 更多背景信息:

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

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

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

4

8 回答 8

8

有一个工具 svnmucc 可以做到这一点,而不需要工作副本:

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

于 2009-04-03T11:47:09.940 回答
7

您可以使用: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
于 2011-06-24T19:36:12.530 回答
6

您可以在工作副本中制作副本,并在以后一次全部提交。这只会创建一个修订版。

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

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

主要缺点是您需要一个工作副本,并且该工作副本必须包含源目录和目标目录。

于 2009-04-03T11:39:54.793 回答
3

这很有趣,我刚刚快速阅读了设计部分,从我能收集到的内容中,通过有效地将文件单独分支到任意结构中,当你开始时你将走向一个痛苦的世界将事物合并回其原始位置(并且合并可能不会在所有文件的单个提交中完成)。

但我认为你可以做类似的事情来设计颠覆中的部分,并进行一些调整:

首先,可以使用外部对象模拟设计部分(1.6 版本允许外部对象指向文件和目录)。为此,您可以像这样设置项目层次结构:

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

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

svn:externals

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

然后,您检查零件,而不是主干,您会得到一个工作副本,其中仅包含零件定义的结构中所需的文件,当您提交时,您将直接进入主干 - 此处不需要合并。

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

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

因此,虽然 subversion 没有显式地提供部件的抽象层,但它可以相当准确地手动建模——您只受 svn:externals 的功能和用于管理它们的脚本的限制。

于 2009-04-03T13:35:38.697 回答
0

你为什么不把你的子项目放到一个自己的子目录中。

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

通过这种方式,您始终可以对完整的子项目进行操作。

在这里,我们有:

Project
   |
   ---> common Files
   ---> Subprojects...
于 2009-04-03T11:43:49.807 回答
0

如果所有项目都在他们自己的存储库中,svn externals 可能会解决问题

于 2009-04-03T11:45:45.293 回答
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

希望有帮助。

于 2011-07-26T14:31:22.280 回答
0

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

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

将几个包(特定版本)放在某个环境中(例如,由几个可能可选的组件组成的更大的软件产品)属于上面的单独层:发行版,并由发行版的包管理基础设施处理。

于 2014-05-30T11:44:54.233 回答