git子模块和子树的区别

wbrvyc0a  于 2023-04-19  发布在  Git
关注(0)|答案(5)|浏览(161)

git子模块和子树在概念上有什么区别?
每种情况的典型场景是什么?

llew8vvj

llew8vvj1#

子模块为链接;
复制子树

agyaoht7

agyaoht72#

*submodule更适合component-based development,因为主项目依赖于另一个组件(repo)的固定版本。

您只保留父存储库中的引用(gitlinksspecial entries in the index
如果我希望链接总是指向外部存储库的HEAD,该怎么办?
你可以让一个子模块跟随一个子模块远程仓库分支的HEAD,使用:
o git submodule add -b <branch> <repository> [<path>] .(指定要遵循的分支)
o git submodule update --remote将子模块的内容从<repository>/<branch>更新到最新的HEAD,默认为origin/master。即使使用--remote,您的主项目仍然会跟踪子模块的HEAD的哈希值。

*子树更像是一个system-based development,你的all repo一次包含所有内容,你可以修改任何部分。

See an example in this answer
另外,正如philb在注解中所指出的,git subtreecontrib/,而不是git submodule(核心命令)。

epggiuax

epggiuax3#

概念上的区别是:
使用git submodules你通常希望将一个大的仓库分成几个小的仓库。引用子模块的方式是 * maven风格的 * -你引用的是另一个提交(子模块)存储库。如果您需要在子模块内进行更改,则必须在子模块内进行提交/推送,然后在主仓库中引用新的提交,然后提交/推送主仓库的更改引用。这样,您必须访问两个仓库才能完成构建。
使用git subtree你可以在你的仓库中集成另一个仓库,包括它的历史。所以在集成它之后,你的仓库的大小可能会更大(所以这不是保持存储库更小的策略)。在集成之后,没有到其他存储库的连接,而且你不需要访问它,除非你想获得更新。所以这个策略更多的是为了代码和历史的重用--我个人不使用它。

g0czyy6m

g0czyy6m4#

子模块

将主存储库推送到远程存储库不会推送到子模块的文件

子树

将主存储库推送到远程推送子树的文件

5q4ezhmt

5q4ezhmt5#

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

相关问题