【问题标题】:SVN: Release branch and externals?SVN:发布分支和外部?
【发布时间】:2010-02-02 12:55:11
【问题描述】:

我们有两个网站用于同一个客户端(主 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 Kiln)进行源代码控制。 Mercurial 也有子回购的想法,所以我们在那里的项目也遵循了这条路线。然而,这是有代价的,分支变得非常困难,标签和简单地保持一切都是最新的。我们最新的方法是将两个项目合并到一个存储库中,包括所有共享存储库。这为我们提供了一个“大型项目”,它可以减慢克隆时间(在 SVN 中查看),但我们很少这样做,以至于不必处理子存储库的收益使其非常值得。我们现在使用功能切换/切换而不是分支,这也大大简化了我们的开发。

【问题讨论】:

    标签: svn release-management build-server


    【解决方案1】:

    如果我理解正确,您的结构类似于以下结构:

    • 项目1
      • 后备箱
        • 图书馆(通过svn:externals library svn://repo/library
      • 分支机构
        • 发布1
          • 图书馆(通过svn:externals library svn://repo/library
        • 发布2
          • 图书馆(通过svn:externals library svn://repo/library
    • 项目2
      • 后备箱
        • 图书馆(通过svn:externals library svn://repo/library
      • 分支机构
        • 发布1
          • 图书馆(通过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 链接,而不必担心共享库代码将永远更新,除非您手动更改 svn:externals

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

    • 项目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 library svn://repo/library/tags/version2
      • 分支机构
        • 发布1
          • 图书馆(通过svn:externals library svn://repo/library/tags/version1
      • 标签
        • 版本1
        • 版本2
        • 版本3

    【讨论】:

    • 啊,现在更像它了。顺便说一句,写得很好。谢谢。我想让主干引用外部的 HEAD 是安全的,但让我的发布指向一个标记的版本。我想知道那会安全吗?我最近一直在解决这个问题,并且让自己陷入困境。感谢您的澄清。
    • @Pete Duncanson:我已经对此进行了试验(让项目主干引用外部的 HEAD,但我的发布指向标记版本)并且没有发现任何重大问题。跨度>
    • 您是否会遇到问题将完全取决于您作为 svn:external 引用的代码。如果代码是向后兼容的(相同的方法、类、行为,只有新的东西不同),你就不会有任何问题。但是,如果您对类、方法或代码的一般行为进行了更改,那么即使您的项目能够编译,您也将是幸运的。
    【解决方案2】:

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

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

    还有一件事要考虑,如果你留在那个路径上 - 除非你的 svn 标签是原子的(通过预提交挂钩),你会想要指定修订以及标签。

    我目前因继承了一些 .NET 东西而感到震惊,这让我非常想念 maven。我什至会接受一堆蚂蚁/常春藤。

    您可能想查看https://www.nuget.org/

    【讨论】:

      【解决方案3】:

      如果您不想更新外部组件,可以使用svn update --ignore-externals

      【讨论】:

      • 我认为外部可能根本不是办法。我的麻烦是当我希望它们从外部更改为发布分支时,目前无论我们何时进行更新,它们都会被添加。当前设置的唯一解决方案是为每个外部设置发布分支,这很快就变成了管理的噩梦,太多的事情发生了。因此,在这种情况下,我认为外部因素是一个死胡同。
      【解决方案4】:

      是的,使用指向特定修订或标签的外部是要走的路。只需阅读有关外部设备的 svn 手册,您就可以很容易地发现这一点...... RFD!而且,只有一页长... :)

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

      【讨论】:

      • 我最近读了这么多书,一直在保证将项目推出,将我们的构建服务器更新到方便的发布分支,同时招募新员工(让我们总共3!),在中断两个站点之间,因为我们没有足够的程序到位。它很容易被所有信息烧毁。我在这里发帖不是出于懒惰,而是出于沮丧、疲惫和困惑。到目前为止,它值得赏金。感谢您的回答;)
      【解决方案5】:

      我通过复制外部文件来制作发布/稳定分支,以便分支完全独立于主干。外部使用 svn 复制

      svn 复制 --parent

      ... 到它们各自的挂载点。未修订的外部使用您想要根植您的分支的修订;修订后的外部在复制时使用了他们指定的修订。 然后必须在新分支中删除 svn:externals 属性。

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

      【讨论】:

      • 但这对我的问题没有帮助。作为我们在主要分支上工作的一部分,我们对外部进行了更改。这样,您将失去历史记录,并且无法在不手动比较的情况下计算出您更改的内容。我们使用我编辑中的方法解决了这个问题。
      • 好的,我以为您正在寻找与一切隔离并且可以独立于外部和主干发展的发布分支。顺便说一句,我不会丢失“svn copy”的历史记录,因此,自动合并仍然是可能的。很好,你还是找到了解决方案。
      猜你喜欢
      • 1970-01-01
      • 2011-07-27
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多