代码之家  ›  专栏  ›  技术社区  ›  Pete Duncanson

SVN:发布分支和外部?

  •  16
  • Pete Duncanson  · 技术社区  · 14 年前

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

    我们刚刚创建了两个发布分支,每个分支对应两个站点。在工作时,每一个站点的所有内容都像平常一样提交到主干,当“准备好上线”时,我们将其合并到该站点的发布分支中。除了今天,我们修改了一些共享代码,注意到当我们对发布分支进行更新时,发布分支会立即将其拉入。这不是我们想要的:(

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

    我们有CruiseControl.net来运行我们的构建,并且非常希望能破解这个难题。有人对更好的流程有什么想法吗?

    干杯

    皮特

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

    5 回复  |  直到 9 年前
        1
  •  19
  •   Otherside    14 年前

    如果我理解正确,您的结构如下:

    • 项目1
      • 大旅行箱
        • 图书馆(通过) svn:externals library svn://repo/library )
      • 分支机构
        • 释放1
          • 图书馆(通过) svn:externals库svn://repo/library )
        • 释放2
          • 图书馆(通过) svn:externals库svn://repo/library )
    • 项目2
      • 大旅行箱
        • 图书馆(VIA svn:externals库svn://repo/library )
      • 分支机构
        • 释放1
          • 图书馆(VIA svn:externals库svn://repo/library )
    • 图书馆

    我假设你是环境 svn:externals 打开/project1/中继到/library。如果然后将修订与 外部的 若要/project1/branches/release1并更新该分支,将自动从库中获取最新版本。默认情况下,svn:externals将获取链接的头部修订。

    你可以定义 外部的 要链接到特定修订,请执行以下操作: svn:externals -r123 library svn://repo/library . 这意味着外部链接将始终指向特定的修订。所以你可以安全地使用这种类型的 外部的 在您的发布分支中链接,不用担心共享库代码将永远更新,除非您手动更改 外部的

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

    • 项目1
      • 大旅行箱
        • 图书馆(通过) svn:externals library svn://repo/library/tags/version3 )
      • 分支机构
        • 释放1
          • 图书馆(通过) svn:externals library svn://repo/library/tags/version1 )
        • 释放2
          • 图书馆(通过) svn:externals library svn://repo/library/tags/version2 )
    • 项目2
      • 大旅行箱
        • 图书馆(通过) svn:externals库svn://repo/library/tags/version2 )
      • 分支机构
        • 释放1
          • 图书馆(VIA svn:externals库svn://repo/library/tags/version1 )
    • 图书馆
      • 标签
        • 版本1
        • 版本2
        • 版本3
        2
  •  3
  •   thekbb    9 年前

    另一方有一些很好的建议,但它确实在使用svn:externals作为穷人的依赖管理系统。这使得黑客反模式对纪律人员来说有些可行。

    您完全正确地认为svn:externals不是路径。

    还有一件事要考虑,如果您保持在这条路径上——除非您的SVN标记是原子的(通过预提交挂钩),否则您需要指定修订版和标记。

    我现在正为继承了一些.NET的东西而感到震惊,这让我非常想念Maven。我甚至愿意忍受一堆蚂蚁/常春藤。

    你可能想退房 https://www.nuget.org/

        3
  •  1
  •   Michael Hackner    14 年前

    你可以做到 svn update --ignore-externals 如果不想更新外部信息。

        4
  •  1
  •   Alienation    14 年前

    是的,使用指向特定修订或标记的外部符号是可行的。你可以通过阅读SVN外部手册很容易地发现这一点…RD!而且,只有一页长…:)

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

        5
  •  0
  •   bm842    13 年前

    我也通过复制外部来创建释放/稳定分支,以便分支完全独立于主干。外部的SVN复制使用

    SVN copy—父

    …到各自的安装点。未修订的外部使用要在其上创建分支的修订;修订的外部在复制时使用其指定的修订。 SVN:然后必须在新分支中删除外部属性。

    一些脚本(对我来说是Perl)可能有助于实现自动化。如果需要更多信息,请打电话给我。

    推荐文章