4

如果我没有进入这个页面,我就不会知道 svn:externals 。所以,我设置了我的工作文件夹。然后

mkdir lib/vendor
svn add --parents lib/vendor
svn ps svn:externals 'symfony http://svn.symfony-project.com/branches/1.4/' lib/vendor/
svn ci -m "add externals"
svn update

“svn update”会占用整个 symfony 文件夹,而且速度很慢。我以为那将是一次痛苦。但是,每次我输入“svn up”时,SVN 都会检查外部存储库。我必须使用 --ignore-externals 使“svn update”足够快。

我想知道 svn:externals 如果这么慢有什么好处。我宁愿将 symfony 复制到我自己的存储库中,这肯定是一个更快的解决方案。

4

3 回答 3

6

SVN 外部也与项目组织有很大关系。Externals 可以是完全不同的 SVN repos,这意味着你可以设置不同类型的安全、保护、访问、pre-commit hooks、post-commit hooks 等......很难为不同的文件夹内部做不同级别的访问单个 SVN 存储库(没有VisualSVN之类的帮助),并且尝试为单个 SVN 存储库中的不同文件夹执行不同的备份或安全方法非常困难(并且可能是不明智的)。Externals 允许我们将多个不同的存储库与单个svn up.

颠覆外部用例:

  1. 一个常见的用例是外部包含库或其他一些不可变代码。如果您有 .dll,您绝对可以将其放入您的 SVN 存储库并将其视为您的代码库的一部分,但是您已经掩盖了 .dll 应该被视为只读而不是只读的事实由您或您的团队开发。

  2. 另一个用例(您已经发现)是允许您的库保留在删除存储库中 - 可能由活动的开源项目维护。在这种情况下,您始终可以指向外部的特定版本,而不必担心自己存储它。

  3. 最后,外部可以引入主干、分支或标签,这意味着您可以使用它们来拼接一个由您自己的模块的不同标签版本组成的项目。这将更接近地模仿诸如 Rational ClearCase 或任何其他大型版本控制系统之类的东西。您可以通过为代码库的每个模块或组件维护一个 SVN 存储库来做到这一点,为每个模式/组件创建一个标签,然后使用主存储库的 externals 属性引用这些标签 - 它的存在只是为了将它们拉到一起进入一个工作项目。

于 2010-07-31T11:50:17.317 回答
4

你使用外部的方式是为那些想要对某些代码进行头部修订的人使用的,例如,如果你在一个内部项目中,所有类型的库和应用程序都是共同开发的。通常,您不应在没有充分理由的情况下这样做,因为外部代码修订可能会破坏您的代码 - 如果您无权修复外部代码,那么使用它会变得有点麻烦。

您可以将外部存储库的特定修订版提取到您自己的存储库的所谓供应商分支中,或者将修订版参数开关添加到您的外部定义中,如下所述:

http://thinkinging.com/2008/10/21/set-the-revision-of-your-svnexternals-or-else/

于 2010-07-31T10:01:53.573 回答
2

svn:externals 机制的行为与宣传的一样。问题是您在我认为是本地存储库的内部使用公共 subversion 存储库(通过 Internet 访问)。因此,您会看到更新内部存储库与外部引用存储库的时间存在显着差异。

复制到您的存储库当然是一个可行的解决方案。Subversion book中明确记录了如何执行此操作。

于 2010-07-31T10:02:39.130 回答