git子模块和子树的区别

使用git子模块和子树有什么概念上的区别?

每个典型的场景是什么?

  • 子模块更适合基于组件的开发 ,其中您的主要项目取决于另一个组件(回购)的固定版本。
    您只保留在您的父回购( gitlinks , 索引中的特殊条目 )

如果我想要链接总是指向外部回购的头部?

您可以使子模块遵循子模块远程回购的分支的HEAD,其中:

o git submodule add -b <branch> <repository> [<path>] 。 (指定要遵循的分支)
o git submodule update --remote将默认的origin/master将子模块的内容从<repository>/<branch>更新到最新的HEAD。 即使使用了--remote您的主项目仍然会跟踪子模块HEAD的散列值。


  • 子树更像是一个基于系统的开发 ,您的所有回购一次包含所有内容,您可以修改任何部分。
    在这个答案中看到一个例子 。

子模块是链接;

子树是复制

概念上的差异是:

使用git子模块通常需要将大型存储库分成较小的存储库。 引用一个子模块的方法是maven风格 – 你从另一个(子模块)存储库引用一个提交。 如果您需要在子模块中进行更改,则必须在子模块中进行提交/推送,然后引用主存储库中的新提交,然后提交/推送主存储库的已更改引用。 这样,您必须有权访问这两个存储库的完整版本。

使用git子树,您可以在其中整合另一个存储库,包括其历史logging。 所以在集成之后,你的版本库的大小可能会更大(所以这不是保持版本库更小的策略)。 集成之后,没有连接到其他存储库,除非想获取更新,否则不需要访问它。 所以这个策略更多的是代码和历史的重用 – 我个人不使用它。

子模块
推一个主要的repo到远程不会推子模块的文件

子树
推一个主要的回购远程推子树的文件