有很多网页建议使用骇人听闻的方法使 svn 外部看起来像 git submodules。我已经阅读了一些关于区别的说明,但这似乎不是很重要:
Git 子模块链接到另一个项目存储库中的特定提交,而 svn:externals 总是获取最新版本。
为什么这种差异使它们从根本上不相容?我们是否可以假设一个合理的默认值,例如大多数 svn:externals 指向永远不会移动的标签?
有很多网页建议使用骇人听闻的方法使 svn 外部看起来像 git submodules。我已经阅读了一些关于区别的说明,但这似乎不是很重要:
Git 子模块链接到另一个项目存储库中的特定提交,而 svn:externals 总是获取最新版本。
为什么这种差异使它们从根本上不相容?我们是否可以假设一个合理的默认值,例如大多数 svn:externals 指向永远不会移动的标签?
根本区别在于构图规则。
在真正的基于组件的方法中,您定义了一个配置,即:
您的项目“工作”所需的标签列表(Git 的 SHA1 提交)(即“开发”、“编译”、“部署”, ...)。
配置中引用的每个提交都可以帮助您获得所有树的确切版本。也不例外。该树的每个文件都是您定义的配置指定的确切版本。
git1.8.2 的注意事项
“git submodule”开始学习一种与远程分支的尖端集成的新模式(而不是与超级项目的 gitlink 中记录的提交集成)。
很快(2013 年 3 月),子模块可以引用上游 HEAD,而不仅仅是固定的 SHA1。
(1.8.2 之前)每个模块只能有一个标签/SHA1。从一个共同的父仓库中,您不能在一个模块中定义一个模块。
(但是一个模块,它只是对外部 Git 仓库的引用,可以有自己的子模块定义:父仓库只会引用第一级子模块,而第一级子模块又会引用它在自己内部提交的任何子模块)
在SVN external中不是这样:您可以定义目录外部和文件外部,无论是否有明确的修订。
您可以组合各种外部属性。例如:
$ svn propget svn:externals calc
third-party/sounds http://svn.example.com/repos/sounds
third-party/skins -r148 http://svn.example.com/skinproj
third-party/skins/toolkit -r21 http://svn.example.com/skin-maker
结果不是配置(' calc
' 的一个参考),而是选择规则的组合,这些规则定义了您在目录 ' calc
'中所需的确切“拼凑”
简而言之,您不能为 ' calc
' 子模块“计算”一个 SHA1,这将完全等同于 ' ' SVN 目录svn:external
上的一堆属性。calc
如果您使用SmartGit与 svn:externalls 一起使用 SVN 存储库,您将不会注意到任何真正的区别。
实际上,唯一真正的区别(至少唯一的技术区别)是 SVN 允许 external 指向 HEAD 修订版(不是固定值),Git 子模块不允许。在我看来,所有其他差异都是微不足道的,所以你问这个问题是对的。