在SVN中创建大项目的子项目

时间:2014-11-08 05:20:44

标签: svn version-control project project-management

我有两个大项目X,Y和几个子项目。我想创建一个像这样的项目存储库结构

svnroot/
       |
       |
       Project X -------sub-project Ax (/brunch, /tag, /trunk)
       |           |--- sub-project Bx (/brunch, /tag, /trunk)
       |           |
       |           |--- sub-project Nx (/brunch, /tag, /trunk)
       |           
       Project Y ------sub-project Ay (/brunch, /tag, /trunk)
                  |--- sub-project By (/brunch, /tag, /trunk)
                  |
                  |--- sub-project Ny (/brunch, /tag, /trunk)

我希望项目下的子项目能够独立开发。所有子项目都集成在一起以生成项目X或Y.如何创建此项目结构?我正在寻找一个结构,以便我可以在任何层次结构(项目和子项目级别)上工作。

3 个答案:

答案 0 :(得分:1)

这看起来像svn:externals的工作!

通过在目录上设置svn:externals属性,您可以从SVN中的任何其他位置(甚至从不同的存储库)提取目录,它们将显示在您的工作副本中。然后,您可以单独开发这些子目录,并将它们拉入您需要的任何位置。

示例:

svn_root/
│ ProjectX/
│ │ branches/
│ │ tags/
│ │ trunk/
│ │ │ ProjectDir1/
│ │ │ ProjectDir2/
│ │ │ Subprojects/
│ │ │ project_file_1.txt
│ │ │ project_file_2.txt
│ ProjectY/
│ Subprojects/
│ │ SubprojectA/
│ │ │ branches/
│ │ │ tags/
│ │ │ trunk/
│ │ SubprojectB/
│ │ │ branches/
│ │ │ tags/
│ │ │ trunk/
│ │ SubprojectC/

在ProjectX和ProjectY中,“子项目”为空。在此目录中定义名为“svn:externals”的属性,以从顶级Subprojects目录中提取内容:

^/Subprojects/SubprojectA/trunk@123 Ax
^/Subprojects/SubprojectB/trunk@456 Bx
^/Subprojects/SubprojectC/trunk@789 Cx

请注意“@ 123”部分。这将设置SubprojectA的特定修订版。如果没有该说明符,您将无法看到在某个版本中使用哪个版本的SubprojectA来构建ProjectX。此外,使用此说明符允许决定何时在使用ProjectX时从SubprojectA获取更新。您不希望在发布前一天中断ProjectX,因为有人正在为ProjectY工作SubprojectA!

您也可以指定分支或标记,而不是在主干上指定子项目的特定修订版。

有关更多信息,请参阅SVN书籍:http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html

在开发子项目时,您可以从顶级Subprojects目录开始工作,也可以暂时设置svn:externals以通过删除修订说明符来引入最新的trunk,并完全使用ProjectX工作副本。如果没有修订说明符,请不要提交你的外部属性!

答案 1 :(得分:0)

这种设置不建议与Subversion恕我直言。你需要的是一个分支机构"分支机构"结构,我个人发现,当与主干进行合并时会产生许多问题。在您的情况下,我建议您查看例如GIT中。

但是,如果所描述的设置是您想要/需要做的,我会执行以下操作:

  1. 创建Project XProject Y个文件夹,每个文件夹包含子文件夹trunkbranchessubprojects
  2. 每当您需要直接处理项目的功能时,请创建项目分支svn cp path/to/svn/project_x/trunk path/to/svn/project_x/branches/myfeature。在myfeature分支上工作直到完成并直接重新集中到trunk
  3. 每当您开始处理子项目时,请创建一个新的空文件夹subproject_ax,然后将子项目主干创建为主项目主干的副本:svn cp path/to/svn/project_x/trunk path/to/svn/project_x/subproject_ax/trunk
  4. 当您需要子项目的分支时,请从子项目主干创建svn cp path/to/svn/project_x/subproject_ax/trunk path/to/svn/project_x/subproject_ax/branches/mysubfeature。在mysubfeature分支上工作直到完成,然后重新集成到子项目trunk
  5. 要保持整个游戏的正常运行,您需要定期更新项目分支(在project_x/branches)以及子项目中继(在project_x/subproject_ax/trunk中)与主{{1}同步通过合并来完成。保持子项目分支与子项目主干同步也是如此。

    总而言之,我希望你会看到光明,并且a)使用git或b)不要使用这个过于复杂的结构,而是使用正常的trunk / trunk布局需要。

答案 2 :(得分:0)

我不是"嵌入式"单个SVN存储库中的项目。他们创造了问题

  1. 检查一个子项目会增加不相关项目的修订号。
  2. 子项目的构建很少是独立的。您通常需要查看要构建的根。
  3. 从一个子项目到另一个子项目而不专注于使用可交付成果的诱惑太大了。最终你有一些非常糟糕的源 - 源交互。
  4. SVN项目很便宜。运行svnadmin create几次并使用模板提供统一的密码访问方案。