git子模块和子树的区别

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

它们的典型场景是什么?

112529 次浏览

概念上的区别是:

使用git子,你通常想把一个大的存储库分离成小的存储库。引用子模块的方法是maven-style——你引用了来自另一个(子模块)存储库的单个提交。如果需要在子模块中进行更改,则必须在子模块中进行提交/推送,然后在主存储库中引用新的提交,然后在主存储库中提交/推送已更改的引用。通过这种方式,您必须能够访问完整构建的两个存储库。

使用git子树,你可以在你的存储库中集成另一个存储库,包括它的历史。所以在集成它之后,存储库的大小可能会更大(所以这不是保持存储库更小的策略)。 在集成之后,就没有到其他存储库的连接了,除非您想获得更新,否则您不需要访问它。所以这个策略更多的是为了代码和历史重用——我个人不使用它
    子模块更适合基于组件的开发,其中你的主项目依赖于另一个组件(repo)的固定版本。
    你只在你的父repo (< a href = " https://stackoverflow.com/a/16581096/6309 " > gitlinks < / >索引中的特殊条目)中保留引用

如果我想链接总是指向外部回购的HEAD怎么办?

你可以让一个子模块遵循子模块远程回购分支的HEAD,使用:

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

另外,正如的评论中的philb所指出的,git subtree是一个contrib/,而不是git submodule(核心命令)

子模块为link;

子树是复制的

< p > sub-module < br > 将主repo推到远程不会推子模块的文件

< p > 子树 < br > 将主repo推到远程将子树的文件

考虑子树和子模块的最简单方法是,子树是一个存储库的副本,它被拉入父存储库,而子模块是指向另一个存储库中特定提交的指针。