代码之家  ›  专栏  ›  技术社区  ›  Coxy

帮助理解SVN外部

  •  5
  • Coxy  · 技术社区  · 15 年前

    我正在为我的公司研究SVN外部特性,这似乎是一个很好的特性供我们使用。我们有几个经常引用共享组件的产品,但是有一个坏习惯,就是落后于旧版本,有时甚至有不同的代码基分支。

    我已经读了一些关于它们现在如何工作的很好的文章,我认为我理解这个概念。我不完全确定的是多个存储库的不同修订如何链接在一起。

    假设我有一个产品和一个图书馆。该产品是针对库构建的,因此其repo具有svn:externals属性,该属性链接到库源。在svn:externals定义中没有特定版本的情况下,当我签出产品的头部时,也会得到库的头部。

    多年来,我构建了几个版本的产品,每次都引用库的最新版本。不过,有一天我必须回去查看产品版本1,手动选择正确的版本。当我这样做时,我会得到哪个版本的库,head还是我第一次构建它时使用的版本?

    希望我是一个优秀的开发人员,记得标记我发布的每一个产品版本。当我将标记'product-1-0-0'应用到存储库时,是否也对库存储库的正确修订进行了标记?如果我以后根据标签“product-1-0-0”签出产品,是否用它签出了库的正确版本?

    5 回复  |  直到 13 年前
        1
  •  6
  •   D.Shawley    15 年前

    你必须注意的是 svn:externals 如果需要除主干以外的其他内容,则需要显式指定修订。 Google "pinning svn:externals" 有关详细信息。如果您使用的是相当现代的版本,1.5或更新的IIRC,那么至少支持相对外部的。与我当前使用的版本一样,旧版本要求我们使用 -rNNNNN 选择权 外部的 属性为 每个该死的文件夹 .

    最后我们使用了一个名为 svncopy.pl 从tigris.org做我们所有的分支和标记。这没那么糟糕,但我希望在我们决定如此大量地使用它们之前,我们已经知道它有多少工作了。

        2
  •  5
  •   leander    15 年前

    你可以使用 date specifiers 以确保在更新时获得相应的修订。

    我们为一个运行pc lint的工具做了这项工作;我们喜欢在每个修订版上运行它,这样我们就可以区分结果了。

    它的实现有点令人讨厌——我们:

    • 确定工作副本的版本(使用 svnversion )
    • 确定头部的转速(使用 svn info )
    • 抓取所有修订的时间戳,包括头部(使用 svn log )
    • 将时间戳增加0.999秒以确保“确定”,我们得到rev(yay magic!)
    • 更新到每个版本(使用 svn update -r {sometimestamp} )
    • 在工作副本上运行pc lint,diff,mailout,trigger klaxons,随便什么

    (复杂度值得鲁比·戈德伯格,不是吗?对任何能提出更好解决方案的人都表示支持和感激。)

    您也可能对SVN图书中有关 Peg and Operative Revisions 这是我刚刚发现的——这似乎是一个相对新的添加。

        3
  •  2
  •   thekbb    14 年前

    您应该了解依赖关系管理器——我不确定您的平台是什么,但是Ivy和Maven以更干净的方式解决了这个问题。

    SVN:Subversion中没有外部版本。如果有人更改了某个外部版本或标签,您将无法知道更改之前是什么。

        4
  •  1
  •   si618    15 年前

    是的,它将,假设您在外部提供一个明确的修订号,如 docs . 否则,它将使用引用的外部的头部修订。

    注意1.6中基于文件的svn:externals。它们看起来很有用,但我只是 this bug 今日: