使用git子模块和子树之间有什么概念上的区别?
每种情况的典型情况是什么?
答案 0 :(得分:277)
子模块是链接;
子树是副本
答案 1 :(得分:153)
如果我希望链接始终指向外部仓库的HEAD怎么办?
您可以使子模块跟随子模块远程仓库的分支的HEAD,其中包含:
o git submodule add -b <branch> <repository> [<path>]
。 (指定要遵循的分支)
o git submodule update --remote
,它将从<repository>/<branch>
更新子模块的内容到最新的HEAD,默认为origin/master
。即使使用--remote
,您的主项目仍将跟踪子模块的HEAD的哈希值。
答案 2 :(得分:103)
概念上的区别是:
使用 git子模块,您通常希望将大型存储库分隔为较小的存储库。引用子模块的方式是 maven-style - 您正在引用来自另一个(子模块)存储库的单个提交。如果您需要在子模块中进行更改,则必须在子模块中进行提交/推送,然后在主存储库中引用新提交,然后提交/推送更改的主存储库引用。这样,您必须能够访问两个存储库以进行完整构建。
使用 git子树,您可以在其中集成另一个存储库,包括其历史记录。因此,在集成它之后,存储库的大小可能更大(因此这不是保持存储库更小的策略)。 集成后,没有与其他存储库的连接,除非您想获得更新,否则您不需要访问它。因此,这种策略更适用于代码和历史重用 - 我个人不会使用它。
答案 3 :(得分:20)
<强>子模块强>
将主回购推送到远程不会推送子模块的文件
<强>子树强>
将主仓库推送到远程推送子树的文件