14

我的情况:我有几个组件,它们有时会发生变化,并且在许多不同的项目中共享。每个项目都将它们放在一个名为 /depends 的子文件夹中。依赖项为我们所有的常用组件保存了一堆 svn 外部组件。

svn:externals 给我带来了很多时间和痛苦。

  • 在项目根文件夹上显示日志不会显示 svn:external 文件夹的更改(但有趣的是,提交和更新将适用于 svn:externals)
  • 分支时, svn:externals 不会分支。
  • 由于 svn:externals 上没有分支,任何更改通常都会破坏主干。
  • 标签不会冻结它们的外部。这确实违背了标记的目的。

请记住,我有几个项目(假设有 10 个用于本次讨论,每个都使用相同的外部),因此为每个项目保留正常的提交目录将花费我大量的合并时间。

我的情况有更好的选择吗?

4

5 回答 5

12

我认为部分问题在于共享组件的发布周期不一定与项目的发布周期相匹配。

此处描述的共享组件有自己的发布周期。换句话说,每个项目都可以作为一个单独的项目进行管理(或者可能将它们的集合作为一个单独的项目进行管理),并拥有自己的发布/版本号。

请注意,svn:externals定义可以包括特定的修订

这允许每个使用共享组件的项目针对该共享组件(或共享组件的集合)的特定版本/修订进行开发,从而为项目提供一组稳定的依赖项。对组件的更改不会破坏项目,因为每个项目都在查看组件的特定版本,而这不一定HEADtrunk.

虽然这似乎需要更多的前期工作,但我相信从长远来看,这种做法为这种情况提供了更好的变更管理流程。

于 2008-10-30T02:48:39.407 回答
6

我同意@Ken。

我强烈建议不要svn:externals在没有特定修订的情况下使用。如果没有修订,就不可能重新创建旧的结帐。如果您只在标记时固定您的外部,您将只能重新创建您已标记的内容。如果你想在主干中重新创建一些中间版本,你就靠你自己了。

不分支外部的一个原因是不清楚应该如何做。如果您的项目 A 的外部指向 tags/2.0.0 并且您正在为您的项目创建一个 3.4.x 分支,那么项目 A 的外部应该指向什么?也应该项目A分支吗?如果是这样,是什么版本?

如果项目有不同的发布周期,通常不可能在分支时为外部定义合理的行为。

svncopy.pl(如果您还没有(包含在 Subversion 源代码分发中)允许您在标记期间固定外部的脚本,您可能需要查看该脚本。)

我们发现 svn:externals 在用于将您正在积极开发的一组组件放在一起时效果很差。Externals 可以很好地引入移动不大并且没有分支问题的外部组件。

于 2008-10-30T07:56:28.207 回答
5

我在一个类似的问题上说明了这一点:您应该将svn:externals其用作来自不同存储库的外部引用。所以svn:externals应该指位于不同存储库中的组件、模块、3rd 方工具等。

您不应该通过使用svn:externals外部指向同一个存储库来模拟“符号链接”行为。

大多数情况下,您可以通过修改构建结构或使用签出脚本和稀疏签出功能来解决此类问题。

svn:externals 有很多问题,其中大部分都很难看到、跟踪和修复: 请参见此处的示例

  • 提交不能跨越外部(没有原子提交)
  • 分支不会分支它们的外部
  • 标签不会“冻结”它们的外部,因此后面的构建可能会导致不同/损坏的构建
  • 合并和重新整合合并不适用于外部

如果您使用 externals 指向其他存储库,则大多数时候您不会遇到这些问题。

于 2008-10-30T15:59:56.970 回答
2

您可以尝试使用所谓的供应商分支:

http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.advanced.vendorbr

当您处理第三方库时,这是一个有用的策略,但在像您这样的情况下它也很有用。

于 2008-11-03T17:59:22.090 回答
0

svncopy.pl(在这个问题中提到)会将路径中的路径重写svn:externals到它们在分支中的新位置。

于 2011-07-12T18:07:29.983 回答