git子模块和子树之间的区别


300

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

每种情况的典型场景是什么?


2
这可能不是回答你所有的问题,但关于这个问题的有趣的阅读:blogs.atlassian.com/2013/05/...
印章


“ Git子模块的替代方案?”:stackoverflow.com/questions/6500524/…–
brillout

Answers:


177

如果我希望链接始终指向外部仓库的HEAD怎么办?

您可以使一个子模块跟随子模块远程仓库的分支的HEAD,方法是:

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



你的答案似乎违背了这里投票的答案:stackoverflow.com/questions/10443627/...
弥敦道^ h

@NathanH这个(跟踪HEAD的可能性)已在一年后添加(2013年3月,git 1.8.2:github.com/git/git/blob/…
VonC

我看到您的其他回答中也提到了子模块的关注行为。在那种情况下,我想您的意思是说,始终指向子模块的HEAD是通过同时使用二者add -b以及--remote随后在update命令上完成的,这都是按照子模块update documentation进行的。在那种情况下,-b跟随母版HEAD真的还需要吗?
matanster,2015年

@matt -b用于为子模块生成正确的.gitmodule元数据(等效于git config -f .gitmodules submodule.<path>.branch <branch>)。
VonC 2015年

然后与启用几乎没有关系--remote- --remote如果-b尚未使用的话,也可以使用add。在这两种情况下,更新都将在父子存储库中提交子模块的提交,因此链接并不会真的以一种非常自动的方式“总是指向HEAD” ....我没有得到它,或者声称最好从原始答案(?)中删除
matanster,2015年

351

子模块是链接;

子树是副本


121

概念上的区别是:

使用git子模块,您通常希望将大型存储库分成较小的存储库。引用子模块的方式是maven样式 -您引用的是来自其他(子模块)存储库的单个提交。如果需要在子模块中进行更改,则必须在子模块中进行提交/推送,然后在主存储库中引用新的提交,然后提交/推送主存储库中已更改的引用。这样,您必须有权访问两个存储库才能完整构建。

使用git子树,您可以将另一个存储库集成到其中,包括其历史记录。因此,在集成之后,您的存储库的大小可能会更大(因此,这不是保持存储库较小的策略)。集成之后,便没有与其他存储库的连接,除非您想要获取更新,否则您无需访问它。因此,该策略更多地用于代码和历史记录重用-我个人不使用它。


但是git subtree如果您愿意的话,您仍然可以推动-对吗?
Ixx

@lxx如果您知道存储库URL…
Franklin Yu

@FranklinYu他为什么不知道呢?无法从本地git元数据中获取该信息?
adi518 '18

@ adi518是的,如果您是创建子树的人。但是,如果您将存储库推送到GitHub,而其他人将其克隆下来,则我认为他/她不会自动知道子树URL。
Franklin Yu

@NiklasP-您能否详细说明“在主存储库中引用新提交”?这是我不清楚如何执行的第一步,因此我也不了解“更改引用”。
罗伯特·奥施勒

21

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

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


3
“将主存储库推送到远程推送子树的文件”不,不是。
J布兰堡

@JBramble我可能应该提到它是通过SourceTree应用程序完成的,例如:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.