帮助理解SVN Externals

5
我正在为我们公司研究svn外部引用,这似乎是一个很好的功能。我们有几个产品经常引用共享组件,但它们经常滞后于旧版本,甚至是不同分支的代码库。
现在我已经了解了它们的工作原理,我认为我基本明白概念了。但是我不确定的是多个存储库的不同版本如何链接在一起。
假设我有一个产品和一个库。该产品构建在库之上,因此其存储库具有svn:externals属性,链接到库源代码。如果在svn:externals定义中没有指定特定版本,则在检出Product HEAD时,还会获取Library HEAD。
多年来,我构建了几个版本的产品,每次都引用最新版本的库。但有一天,我必须回到并手动选择正确的版本以检出Product的第一个版本。那么我会得到哪个版本的Library,HEAD还是我第一次构建时使用的版本?
希望我是一个好的开发人员,并记得标记我发布的每个产品版本。当我将我的标记“Product-1-0-0”应用于存储库时,是否也会标记Library存储库的正确版本?如果以后根据标记“Product-1-0-0”检出Product,是否会与之一起检出Library的正确版本?
5个回答

6
使用 svn:externals 时需要注意的是,如果您想使用其他内容而不是主干,则需要明确指定版本。有关详细信息,请谷歌“固定 svn:externals”。如果您使用的是相当现代的版本(1.5或更高版本),则至少支持相对外部引用。旧版本(例如我目前正在使用的版本)要求我们对每个该死的文件夹的 svn:externals 属性使用 -rNNNNN 选项明确固定版本。
我们最终使用了来自 tigris.org 的名为 svncopy.pl 的 Perl 脚本的修改版来完成所有分支和标记。这并不那么糟糕,但我希望在我们决定如此大量使用它们之前知道这需要多少工作。

对于svn:externals,你几乎总是应该固定版本。否则,如果你更改了外部引用的内容,你就无法将项目回滚到以前的状态。此外,你可能会在不知情的情况下破坏一些东西。请参见http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-externals.html,“使用显式版本号”。 - cp.engr

5

您可以使用date specifiers来确保在更新时获取相应的修订版本。

我们已经为运行PC-Lint的工具做到了这一点;我们喜欢在每个修订版本上运行它,以便我们可以对比结果。

它的实现有点令人不快 -- 我们:

  • 确定工作副本所在的版本(使用svnversion
  • 确定HEAD所在的版本(使用svn info
  • 获取包括HEAD在内的所有版本的时间戳(使用svn log
  • 将时间戳增加0.999秒以“确保”我们获得修订版本(哎呀,神奇!)
  • 更新到每个版本(使用svn update -r {sometimestamp}
  • 在工作副本上运行PC-Lint,进行对比、邮件发送、触发警报等操作

(这种复杂度堪比Rube Goldberg,不是吗?任何能提出更好解决方案的人都会得到赞扬和感激。)

您可能也会对svn书中关于Peg and Operative Revisions的章节感兴趣,我刚刚发现这似乎是一个相对较新的补充内容。


2
你应该了解依赖管理器 - 我不确定你的平台是什么,但是ivy和maven以更加清晰的方式解决了这个问题。
svn:externals在子版本中没有版本控制。如果有人更改了你的外部版本库之一的版本或标签,那么你就无法知道更改前它是什么样子的。

1

是的,只要您在外部引用中提供了明确的修订版本号,就会生效,建议参考文档。否则它将使用所引用的外部文件的HEAD修订版本。

但是请注意,在1.6版本中使用基于文件的svn:externals。它们看起来非常有用,但我今天遇到了这个错误 :(



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接