7

目前我们有一个具有标准颠覆存储库布局的项目:

./trunk
./branches
./tags

然而,随着我们沿着 OSGi 和模块化项目的道路前进,我们最终得到了:

./trunk/bundle/main
./trunk/bundle/modulea
./trunk/bundle/moduleb ./tags/bundle/main-1.0.0
./tags/bundle/main-1.0.1
./tags/bundle/modulea -1.0.0

“构建”仍然非常单一,因为它按顺序构建所有模块,尽管我开始怀疑我们是否应该将构建/存储库重构为更像:

./bundle/main/trunk
./bundle/main/tags/main-1.0.0
./bundle/main/tags/main-1.0.1
./bundle/modulea/trunk
./bundle/modulea/tags/modulea- 1.0.0

在这种模式下,我会想象每个模块都构建自己,并将其二进制文件存储在存储库中(maven、ivy 或 subversion 存储库本身的其他路径)。

一旦模块化,是否有关于项目布局的指导方针或“最佳实践”?

4

4 回答 4

7

Subversion 书包含两个部分:

关于主题的博客条目:“Subversion Repository Layout”

不过,简短的回答是:虽然您的里程会有所不同(每种情况都是单独的),但您的/bundle/<project>/(trunk|tags|branches)方案相当普遍,并且可能对您很有效。

于 2008-08-18T10:45:46.640 回答
6

这在很大程度上取决于个人喜好,但我发现以下结构适合由许多模块组成的大型项目:

分支机构
  项目名
    模块1
      分店名称
    模块2   
      可能是另一个分支名称
    更高级别的分支名称,包括两个模块
      模块1
      模块2
标签
  ...(与分支相同)
树干
  项目名
    模块1
    模块2

我还经常在包含许多项目的大型存储库中使用这种结构,因为将所有项目保存在同一个存储库中可以更轻松地交叉引用项目并在它们之间共享代码(带有历史记录)。

我喜欢从一开始就使用带有根主干、标签和分支文件夹的结构,因为根据我的经验(包含许多项目的大型存储库),许多子项目和模块永远不会有单独的标签或分支,所以没有必要为他们创建文件夹结构。它还使开发人员更容易检查存储库的整个主干,而不是获取所有标签和分支(他们大部分时间都不需要)。

我想这是项目或公司政策的问题。如果每个项目都有一个存储库,或者给定的开发人员一次只可能在存储库中处理一个项目,那么有根主干可能没有多大意义。

于 2008-08-18T10:27:55.473 回答
3

就我的两分钱...

我只想强调 SVN 文档中的评论(已在另一个答案中引用,同一线程)http://svnbook.red-bean.com/en/1.4/svn.reposadmin.planning.html#svn.reposadmin.projects .chooselayout

摘录引用了以下结构:/trunk/calc/calendar/电子表格/……标签/calc/日历/电子表格/……分支/calc/日历/电子表格/

“这种布局没有什么特别不正确的地方,但它对您的用户来说可能看起来那么直观,也可能不那么直观。尤其是在有许多用户的大型多项目情况下,这些用户可能往往只熟悉其中的一两个项目在存储库中。但是项目作为分支兄弟往往不强调项目的个性,而是将整个项目集作为一个整体来关注。不过,这是一个社会问题。我们喜欢我们最初建议的安排,纯粹是出于实际原因——当有一个单一的存储库路径保存该项目和该项目的整个历史(过去、现在、标记和分支)时,更容易询问(或修改或迁移到其他地方)单个项目的整个历史。”

就我自己而言,我倾向于非常同意这一点,并更喜欢以下布局:/utils/calc/trunk/tags/branches/calendar/trunk/tags/branches/…office/电子表格/trunk/tags/branches/

原因很简单,当人们只想标记一个特定的子集时,标记一个完整的项目集是不切实际的。

让我们举个例子:如果 project-1 依赖于 moduleA v1.1 和 moduleB v2.3,我不希望更新的 moduleA v2.x 出现在标签中。事实上,当几天/几周/几个月后回到这个标记版本时,我将被迫打开 project-1 标记版本中的包描述符以读取实际需要的 moduleA 版本。

此外,如果我必须将此版本的源代码特定备份到 CD 上,我只想导出此标签,而不需要下载数百兆字节的无关内容。

这只是我的两分钱。

于 2009-03-04T12:04:35.207 回答
0

我在 StackOverflow版本控制结构问题中回答了类似的问题。它实际上更适合这里,因为我们进行了大量的 OSGi 开发并且有很多捆绑包。我必须回应 Anders Sandvig 的评论:将主干/标签/分支保持在根级别,因为您只会分支一组有限的模块。它也不会干扰单独构建的模块。

我不会复制我之前做出的答案,但它与这个问题完全相关。

于 2008-08-20T08:13:59.340 回答