git子模块和子树在概念上有什么区别?每种情况的典型场景是什么?
llew8vvj1#
子模块为链接;复制子树
agyaoht72#
*submodule更适合component-based development,因为主项目依赖于另一个组件(repo)的固定版本。
您只保留父存储库中的引用(gitlinks,special 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的哈希值。
git submodule add -b <branch> <repository> [<path>]
git submodule update --remote
<repository>/<branch>
origin/master
--remote
*子树更像是一个system-based development,你的all repo一次包含所有内容,你可以修改任何部分。
See an example in this answer。另外,正如philb在注解中所指出的,git subtree是contrib/,而不是git submodule(核心命令)。
git subtree
contrib/
git submodule
epggiuax3#
概念上的区别是:使用git submodules你通常希望将一个大的仓库分成几个小的仓库。引用子模块的方式是 * maven风格的 * -你引用的是另一个提交(子模块)存储库。如果您需要在子模块内进行更改,则必须在子模块内进行提交/推送,然后在主仓库中引用新的提交,然后提交/推送主仓库的更改引用。这样,您必须访问两个仓库才能完成构建。使用git subtree你可以在你的仓库中集成另一个仓库,包括它的历史。所以在集成它之后,你的仓库的大小可能会更大(所以这不是保持存储库更小的策略)。在集成之后,没有到其他存储库的连接,而且你不需要访问它,除非你想获得更新。所以这个策略更多的是为了代码和历史的重用--我个人不使用它。
g0czyy6m4#
子模块
将主存储库推送到远程存储库不会推送到子模块的文件
子树
将主存储库推送到远程推送子树的文件
5q4ezhmt5#
考虑子树和子模块的最简单方法是,子树是被拉入父存储库的存储库的副本,而子模块是指向另一个存储库中的特定提交的指针。
5条答案
按热度按时间llew8vvj1#
子模块为链接;
复制子树
agyaoht72#
*submodule更适合component-based development,因为主项目依赖于另一个组件(repo)的固定版本。
您只保留父存储库中的引用(gitlinks,special 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 subtree
是contrib/
,而不是git submodule
(核心命令)。epggiuax3#
概念上的区别是:
使用git submodules你通常希望将一个大的仓库分成几个小的仓库。引用子模块的方式是 * maven风格的 * -你引用的是另一个提交(子模块)存储库。如果您需要在子模块内进行更改,则必须在子模块内进行提交/推送,然后在主仓库中引用新的提交,然后提交/推送主仓库的更改引用。这样,您必须访问两个仓库才能完成构建。
使用git subtree你可以在你的仓库中集成另一个仓库,包括它的历史。所以在集成它之后,你的仓库的大小可能会更大(所以这不是保持存储库更小的策略)。在集成之后,没有到其他存储库的连接,而且你不需要访问它,除非你想获得更新。所以这个策略更多的是为了代码和历史的重用--我个人不使用它。
g0czyy6m4#
子模块
将主存储库推送到远程存储库不会推送到子模块的文件
子树
将主存储库推送到远程推送子树的文件
5q4ezhmt5#
考虑子树和子模块的最简单方法是,子树是被拉入父存储库的存储库的副本,而子模块是指向另一个存储库中的特定提交的指针。