有很多网页建议hackish ways to make svn externals look like git submodules。我已经阅读了some accounts的不同之处,但这似乎不是很基础:
Git子模块链接到另一个项目的存储库中的特定提交,而svn:externals总是获取最新版本。
为什么这种差异使它们根本不兼容?我们可以假设没有合理的默认值,例如大多数svn:externals指向永不移动的标签?
答案 0 :(得分:10)
根本区别在于构图规则。
在真正的基于组件的方法中,您可以定义 configuration ,即:
项目“工作”所需的标签列表(对于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:external
”SVN目录上的一堆calc
属性完全等效
答案 1 :(得分:3)
如果您使用SmartGit与svn:externalls一起使用SVN存储库,您将不会注意到任何真正的差异。
实际上,唯一真正的区别(至少是唯一的技术差异)是SVN允许外部指向HEAD修订版(不是固定值),Git子模块不允许。在我看来,所有其他差异都是微不足道的,所以你提出这个问题是正确的。