【问题标题】:Creating sub-projects of a big project in SVN在SVN中创建一个大项目的子项目
【发布时间】:2014-11-11 14:39:43
【问题描述】:

我有两个大项目 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。如何创建此项目结构?我正在寻找一种可以在任何层次结构(项目和子项目级别)上工作的结构。

【问题讨论】:

  • 我不会使用外部组件,大多数人会被它们弄糊涂,概念上很简单,但执行起来往往很复杂。做你所说的很诱人,但我发现你只需要遵守 SVN 想要你做的事情。有一个顶级结构(分支、标签、主干)和主干下的每个子项目。创建一个项目 X 分支和一个项目 Y 分支。有重复是的,但处理起来更简单。您所说的“集成”步骤现在是“合并到主干”

标签: svn version-control project project-management


【解决方案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/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 通过删除修订说明符来拉入最新的主干,并完全从您的 ProjectX 工作副本中工作。只是不要在没有修订说明符的情况下提交您的 externals 属性!

【讨论】:

  • 为什么当 subversion 有这个基本和强制性的功能时,GIT 会胜出?在 GIT 中,您必须安装一个只会增加认知负担的子模块。
【解决方案2】:

我不喜欢在单个 SVN 存储库中“嵌入”项目。他们制造问题

  1. 签入一个子项目会增加不相关项目的修订数量。
  2. 子项目的构建很少是独立的。您通常需要签出要构建的根目录。
  3. 从一个子项目进入另一个子项目而不专注于使用可交付成果的诱惑太大了。最终,您会遇到一些非常糟糕的源到源交互。

SVN 项目很便宜。运行svnadmin create几次,使用模板提供统一的密码访问方案。

【讨论】:

    【解决方案3】:

    不建议使用 Subversion 恕我直言。在您的情况下,您需要的是“分支分支”结构,我个人发现在与主干合并时会产生许多问题。在您的情况下,我建议您查看例如混帐。

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

    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

    为了让整个游戏保持正常运行,您需要通过合并定期更新您的项目分支(project_x/branches)以及子项目主干(project_x/subproject_ax/trunk)与主trunk 同步。保持子项目分支与子项目主干同步也是如此。

    总而言之,我希望你能看到光明,要么 a) 使用 git,要么 b) 不要使用这种过于复杂的结构,而是使用普通的 trunk/branches 布局来满足你的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多