SVN常用代码与外部

时间:2011-04-15 07:42:34

标签: svn version-control

目前我正在尝试使用相同的代码为多个产品设置存储库。最好的解决方案是创建共享代码的真实库并以这种方式使用它们。然而,这需要花费很多时间。我们的想法是拥有一个包含以下树的单一存储库

-trunk-Project1
      -Project2
      -Shared

项目1和2都有一个外部包含共享代码。外部指向特定修订版,以便在处理project1和共享代码时不破坏project2构建。由此出现问题。

当对共享代码进行更改并且我进行提交(使用tortoise SVN)时,将为project1和共享代码选择更改,并且很好地将其作为单个修订提交给SVN。但是,当我或同事进行更新时,项目将无法构建,因为svn external指向“旧”修订版。

这可以通过更新外部并提交它来解决(让构建中断)。我们可以临时从外部删除特定修订,但是我们必须在开发结束时再次添加它。有没有办法自动执行此操作?

4 个答案:

答案 0 :(得分:2)

我认为你有几个选择。首先是像Martin提出的那样使用带分支的单个模块。您可以为每个活动项目或开发线程分支。当您合并回主干时,将会选择对共享代码的更改。

e.g。

Module
    |
    + trunk
    |   + Project1
    |   + Project2
    |   + Shared
    |
    + branches
        |
        + Project1Development
        |    + Project1 [active development here]
        |    + Project2 
        |    + Shared [active development here]
        |
        + Project2Development
             + Project1 
             + Project2 [active development here]
             + Shared [active development here] 

其次,您可以分支共享,这样您就不需要将外部固定到它。这就是您在存储库中的内容

Project1
    |
    + trunk [svn:external to a branch of Shared]

Project2
    |
    + trunk [svn:external to a branch of Shared]

Shared
    |
    + trunk
    |
    + branches
        |
        + Project1Development
        |
        + Project2Development

每个项目都会使用自己的主干视图。这里的危险是分支太长了 - 你可能需要遵守规则来合并它们并删除它们,也许是在每次发布之后。只有在需要对共享进行特定于项目的更改时,才应创建共享分支。

第三,你继续像现在一样使用外部,并承担修订的痛苦。如果你这样做的话,我会把你的回购重新排列成上面的第二个数字 - 你在项目中的外部有什么味道。

答案 1 :(得分:1)

当您有多个存储库并且需要混合来自所有存储库的源以构建项目时,您应该使用svn:external。基于你的问题,我会说你只有1个存储库,因此不需要svn:external。

你可以使用分支机构。 Project1和project2都对它们自己的分支中的共享进行了更改。您必须制定良好的工作协议,以便尽可能经常地将分支上的更改集成到主干(较小的差异更容易合并),并确保主干上的构建永远不会中断。

我可以推荐Henrik Kniberg's paper on Version Control,它很好地涵盖了这个主题。

答案 2 :(得分:0)

您的问题是Project1和Project 2需要特定版本的Shared。因此,您需要在布局中明确说明。

例如,你可以这样做:

-trunk    - 项目1      - Project1Share    - 项目2      - Project2Share    - 共享

将Project1Share和Project2Share作为版本化外部,指向Shared的特定修订版,“Shared”是该共享库代码的最新版本。

共享模块当然可以完全不同的存储库。

由于您的子项目依赖于共享代码的特定修订,因此您无法避免管理要针对子项目构建的特定版本:因此您需要将其明确化。

如果规则是Project1始终针对特定版本的最新版本的shared和project2构建,那么project1shared external可以是无版本的,project2可以是版本化的。

答案 3 :(得分:0)

到目前为止所有的好答案 - 但还有另一种选择:使用标签。 开发完成后,您希望将外部重新链接到P1和P2,并指向新的共享项目。在此之前,您希望P1和P2指向旧的,已知的共享版本。

因此,继续使用指向HEAD Shared修订版的externals继续工作。当你完成后,将整个分支分支到一个标签目录(例如,称之为ReleaseX),它将包含所有这些版本的工作代码。那么你可以继续在主干上工作,而不必担心你打破了已发布的“已完成”版本。

如果在不同时间释放P1和P2,您仍然可以使用此方法 - 当您将项目放入标记分支时,将其外部设置为共享项目的当前版本。当下一个项目被标记(并且共享项目得到更新)时,旧项目仍将指向正确版本的Shared,直到下一个版本被标记为止等等。