博士先生,
您正在将苹果与橙子进行比较。git-submodules 类似于svn:externals,又名 svn-submodules。事实上,当您使用-r
svn 附加特定版本的 svn 子模块时,行为几乎相同。要使用 svn-submodules 提交,您必须分别在每个子模块目录中提交,就像使用 git-submodules 一样。
但是有一个很大的不同:大多数开发人员,至少在开发的某个阶段,更喜欢附加到每个子模块的分支,这是 git-submodules 不支持的。这对协调发展很有用。(Google 的Repo工具是Git的一个包装器,旨在与Gerrit(一种代码审查工具)一起使用,有点类似。但相信我:远离Repo。它解决了一个不同的问题。)最大的缺点是你无法恢复代码库的精确轮廓。暂时看起来还不错,但我听说过令人讨厌的战争故事。
您的替代方案不是Subversion,而只是一个单一的存储库,可以在Git、Subversion或其他任何地方。但是您实际上想要单个回购和多个回购的组合,对吗?你想要每个人的好处。所以你需要一个更复杂的解决方案。
一种想法是拥有一个项目存储库,您可以在其中进行大部分开发,加上几个单独的存储库,您可以从中分发模块:
proj/.git
proj/subA
proj/subB
subA/.git
subB/.git
您可以使用rsync在它们之间移动代码。美妙之处在于您在开发和分发之间做出了鲜明的区分。您可以正常开发大型项目,包括分支、合并等。当您准备将子目录作为库分发时,您可以准确确定所需的库版本,并将其复制到自己的存储库中。当您需要合并而不只是复制时,可以使用git subtree merge strategy。
还有另一个系统,建立在子树合并策略之上。它被称为git-subtrees,它是 git-1.7.11 的一部分。这是对其操作的一个很好的描述。您可以从图片中看到它的时间线看起来很混乱,但从功能上讲,它正是您想要的。这是最近的一篇文章,提供了很好的建议。
如果您不介意 git-submodules 的额外“更新”步骤,但您对它如何处理冲突感到不安,您可以尝试giternal。作者包含了一个脚本来显示它的行为与 git-submodules 和braid的比较(用于出售子模块,但不合并它们)。
就个人而言,我喜欢git-slave,它是一个简单的 git 包装器。基本上,它将您的gits
命令作为git
命令应用于您的所有存储库。这真的只是一种方便。它很容易理解,对单个 repos 的影响为零,并且非常适合分支切换(git-subtrees 尚不支持)。