5

我正在为我的公司寻找 svn externals,它似乎对我们来说是一个很好的功能。我们有几个产品经常引用共享组件,但有一个坏习惯,即有时会落后于旧版本甚至不同分支的代码库。

我已经阅读了一些关于它们现在如何工作的内容,我想我理解这个概念还可以。我不能 100% 确定多个存储库的不同版本如何链接在一起。

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

多年来,我构建了多个版本的产品,每次都引用最新版本的库。有一天,尽管我必须通过手动选择正确的修订版返回并检查产品版本 1。当我这样做时,我会得到哪个版本的库,HEAD 还是我第一次构建它时使用的修订版?

希望我是一名优秀的开发人员,并记得标记我发布的每个产品版本。当我将标签“Product-1-0-0”应用于存储库时,库存储库的正确修订版是否也会被标记?如果我稍后根据标签“Product-1-0-0”检出产品,是否会检出库的正确版本?

4

5 回答 5

6

您需要注意的svn:externals是,如果您想要除主干以外的其他内容,则需要明确指定修订版。 谷歌“pinning svn:externals”了解详情。如果您使用的是相当现代的版本,1.5 或更新的 IIRC,那么至少支持相对外部。较旧的版本,例如我目前使用的版本,要求我们使用属性-rNNNNN上的选项为每个该死的文件夹显式固定修订。svn:externals

我们最终使用了一个名为svncopy.pltigris.org 的 perl 脚本的修改来完成我们所有的分支和标记。这还不错,但我希望我们在决定如此大量地使用它们之前就知道它做了多少工作。

于 2009-10-08T03:40:18.690 回答
5

您可以使用日期说明符来确保在更新时获得相应的修订。

我们已经为运行 PC-Lint 的工具完成了它;我们喜欢在每个修订版上运行它,以便我们可以区分结果。

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

  • 确定工作副本的版本(使用svnversion
  • 确定 HEAD 的转速(使用svn info
  • 获取所有修订的时间戳,包括 head(使用svn log
  • 将时间戳提高 0.999 秒,以“确定”我们得到了转速(是的魔法!)
  • 更新每个修订版(使用svn update -r {sometimestamp}
  • 在工作副本上运行 PC-Lint、diff、mailout、触发 klaxons 等

(值得鲁布戈德堡的复杂性,不是吗?对任何可以提出更好解决方案的人表示支持和永恒的感激。)

您可能还对我刚刚发现的 svn book 的Peg and Operative Revisions部分感兴趣——这似乎是一个相对较新的补充。

于 2009-10-08T04:16:23.097 回答
2

您应该阅读依赖管理器 - 我不确定您的平台是什么,但 ivy 和 maven 以更简洁的方式解决了这个问题。

svn:externals 在 subversion 中没有版本控制。如果有人更改了您的某个外部文件的修订版或标签,您将无法知道更改之前的内容。

于 2010-11-12T00:28:32.237 回答
1

是的,假设您在外部文件中提供了明确的修订号,如docs中所建议的那样。否则,它将使用所引用外部的 HEAD 修订。

只需注意 1.6 中基于文件的 svn:externals。它们看起来非常有用,但我今天刚刚遇到了这个错误:(

于 2009-10-08T04:34:28.677 回答
0

这篇文章很好地解决了这个问题......

http://www.simple-talk.com/dotnet/.net-framework/tortoisesvn-and-subversion-cookbook-part-4-sharing-common-code/

赛斯

于 2012-03-08T16:40:31.013 回答