SVN:发布分支和外部?

时间:2010-02-02 12:55:12

标签: svn release-management build-server

我们有两个网站用于同一个客户端(主要的www站点和另一个用于电子商务网站,位于单独的服务器上),它们使用共享的代码部分(各种功能/样式/ javascript等)。我们目前通过在SVN中将共享代码作为单独的项目(在同一个存储库中)并使用svn:externals将每个项目的分支拉入两个网站项目来管理它。

我们刚刚创建了两个发布分支,每个分支对应两个站点。在工作时,一切都被正常地提交到每个站点的中继线,当“准备好直播”时,我们将它合并到该站点的发布分支中。除了今天我们修改了一些共享代码并注意到发布分支在我们对发布分支进行更新时立即将其拉出来。这不是我们想要的:(

所以我们可以解决这个问题。我们使用外部来干扰代码的共享,但还有另一种方法吗?请注意,在这个问题(How can I branch in SVN and have it branch my svn:external folders as well?)中,他们提到外部是不好的,我们应该使用不同的构建过程,但没有提到应该是什么。

我们有CruiseControl.net运行我们的构建,并渴望得到这个坚果破解。有没有人对更好的过程有任何想法?

干杯

皮特

更新:我们已经开始使用Mercurial(Fogcreek's Kiln)进行源代码控制。 Mercurial也有子回购的想法所以我们也跟着那条路线跟我们的项目。然而,它是有代价的,分支是非常困难的,因为标记和简单地保持一切都是最新的。我们最新的方法是将两个项目都纳入一个回购,包括所有共享回购。这给了我们一个“大型项目”,它减慢了克隆时间(在SVN中查看),但我们很少这样做,以至于不必处理子回购的收益使它非常值得。我们现在使用功能切换/切换而不是分支,这也极大地简化了我们的开发。

5 个答案:

答案 0 :(得分:19)

如果我理解正确,你会有以下结构:

  • PROJECT1
    • 躯干
      • 图书馆(通过svn:externals library svn://repo/library
    • 分支
      • release1
        • 图书馆(通过svn:externals library svn://repo/library
      • release2
        • 图书馆(通过svn:externals library svn://repo/library
  • 项目2
    • 躯干
      • 图书馆(通过svn:externals library svn://repo/library
    • 分支
      • release1
        • 图书馆(通过svn:externals library svn://repo/library
  • 文库

我假设你在/ project1 / trunk上设置svn:externals到/ library。如果您随后将修订版本与svn:externals合并到/ project1 / branches / release1并更新该分支,您将自动从库中获取最新版本。默认情况下,svn:externals将获得链接的HEAD修订版。

您可以定义svn:externals链接到特定修订版,如下所示:svn:externals -r123 library svn://repo/library。这意味着外部链接将始终指向该特定修订。因此,除非您手动更改svn:externals

可能更好的方法是使用共享库的标签并链接到特定标签。 在这种情况下,您将获得以下存储库结构:

  • PROJECT1
    • 躯干
      • 图书馆(通过svn:externals
    • 分支
      • release1
        • 图书馆(通过svn:externals library svn://repo/library/tags/version3
      • release2
        • 图书馆(通过svn:externals library svn://repo/library/tags/version1
  • 项目2
    • 躯干
      • 图书馆(通过svn:externals library svn://repo/library/tags/version2
    • 分支
      • release1
        • 图书馆(通过svn:externals library svn://repo/library/tags/version2
    • 标记
      • VERSION1
      • 版本2
      • 版本3

答案 1 :(得分:3)

其他人有一些很好的建议,但它确实使用svn:externals作为穷人的依赖管理系统。对于纪律严明的人来说,它正在使一个hacky反模式有点可行。

你绝对正确的说svn:externals不是路径。

还有一点需要考虑,如果你留在那条路上 - 除非你的svn标签是原子的(通过预提交钩子),你需要指定修订版本和标签。

我现在因为继承了一些.NET的东西而感到震惊,让我非常想念maven。我甚至会讨厌一堆蚂蚁/常春藤。

您可以查看https://www.nuget.org/

答案 2 :(得分:1)

如果您不希望更新外部,则可以svn update --ignore-externals

答案 3 :(得分:1)

是的,使用外部指向特定修订或标记是要走的路。你可以通过阅读外部的svn手册轻松找到这个... RFD!也是,只有一页长......:)

http://svnbook.red-bean.com/en/1.0/ch07s03.html

答案 4 :(得分:0)

我通过复制外部来制作释放/稳定分支,以便分支与主干完全独立。外部是使用

复制svn
  

svn copy --parent

...到各自的挂载点。未修订的外部使用修改,你想根据你的分支;修订版的外部代码在副本中使用了指定的修订版本。 svn:externals属性(ies)必须在新分支中删除。

有些脚本(perl对我来说)可能有助于自动执行此操作。如果您需要更多信息,请告诉我。