所有项目共享组件,除了svn:externals,是否有更好的替代方案?

14

我的情况是:我有几个组件,它们有时会发生变化,并在许多不同的项目中共享。每个项目将这些组件放在一个名为/depends的子文件夹中。/depends包含了我们所有常见组件的一堆svn外部链接。

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

  • 在项目根文件夹上显示日志不会显示 svn:external 文件夹的更改(但有趣的是提交和更新与 svn:externals 一起工作)
  • 当你创建分支时,svn:externals 不会被分支。
  • 由于 svn:externals 没有分支,任何更改通常会破坏主干。
  • 标签不能冻结它们的外部链接。这真的违背了打标签的目的。

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

在我这种情况下是否有更好的替代方案?

5个回答

12

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

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

请注意,svn:externals 定义可以包括一个 特定版本号

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

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


6

我同意@Ken的看法。

强烈建议不要在没有特定版本的情况下使用svn:externals。没有版本,就无法重现旧的检出。如果只在标记时固定您的外部文件,则只能重新创建您已标记的内容。如果您想重新创建主干中的某个中间版本,则需要自己解决。

不将外部文件分支化的原因之一是不清楚该如何做。如果您将项目A中的外部文件指向tags/2.0.0,并为项目创建3.4.x分支,则项目A的外部文件应该指向什么?项目A是否也应该分支?如果是这样,它应该分支到哪个版本?

如果这些项目具有不同的发布周期,则通常无法定义外部文件在分支时的合理行为。

(如果您尚未了解svncopy.pl脚本,请查看一下(包含在Subversion源发行版中),该脚本允许您在标记期间固定外部文件。)

我们发现,当用于保持您正在积极开发的一组组件时,svn:externals的效果非常差。外部文件适用于引入很少移动且不存在分支问题的外部组件。


这并不是不可能的,只需要查看您的主要代码库中的提交日期,并将外部库还原到当时的修订版本号即可。 - nickf
1
s/impossible/prohibitively difficult/,然后。 - JesperE
4
你的回答中没有提供svn:externals的替代方案。 - Kugel
SVN 1.9引入了一个新选项--pin-externals,该选项用于svn copy命令,可以“将没有明确修订版本的外部内容固定到它们当前的版本(在打标签时建议使用)”。 - Elijah Lofgren

5
我在类似的问题上已经表明了这一点:问题: 你应该使用svn:externals作为来自不同存储库的external引用。因此,svn:externals应该指向位于不同存储库中的组件、模块、第三方工具等。
你不应该使用svn:externals通过使用外部引用来指向同一个存储库来模拟“符号链接”行为。 大多数情况下,您可以通过修改构建结构或使用检出脚本和稀疏检出功能来解决此类问题。 svn:externals存在很多问题,其中大多数难以看到、跟踪和修复: 在这里查看一个例子
  • 提交不能跨越外部(没有原子提交)
  • 分支不会分支它们的外部
  • 标签不会“冻结”它们的外部,所以后来的构建可能会导致不同/损坏的构建
  • 合并和重新集成合并将无法在外部工作
如果您使用外部引用指向其他存储库,大多数情况下不会遇到这些问题。

你确定在svn:externals支持相对路径的情况下,所有这些限制仍然适用吗?在将我的svn:externals切换为使用相对路径(例如:../../shared_dir)之后,我能够创建分支,也可以分支它们的外部引用。重新集成也没有任何问题。请参见:http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html - Avian00
@Avian00:相对外部仅在特定的版本库布局和单个版本库中工作。此外,如果您这样做并决定重新组织您的版本库(例如加入多个或使用dumpfilter将它们分开),您将遇到大麻烦。 - Peter Parker

2

0

svncopy.pl(在this question中提到)将重写分支中svn:externals的路径,使其指向新位置。


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