在子模块内添加 git 子模块(嵌套子模块)

Posted

技术标签:

【中文标题】在子模块内添加 git 子模块(嵌套子模块)【英文标题】:Adding a git submodule inside of a submodule (nested submodules) 【发布时间】:2015-03-22 12:05:03 【问题描述】:

As described in this Question

一个 git 子模块是否可以由几个其他 git 子模块组成,超级 git repo 可以获取每个子模块的内容?

作者假设 git 子模块层次结构如下:

回购1 子模块 xyz1 子模块 xyz2 repo2 子模块 repo1

这个问题是关于在子模块中嵌套子模块的可能性:

回购1 子模块 a 子模块 ab 子模块 ac

.gitmodules 的真实示例应如下所示:

[submodule "Source/V8"]
    path = Source/V8
    url = https://chromium.googlesource.com/v8/v8.git
[submodule "Source/V8/build/gyp"]
    path = Source/V8/build/gyp
    url =  https://chromium.googlesource.com/external/gyp
[submodule "Source/V8/third_party/cygwin"]
    path = Source/V8/third_party/cygwin
    url = https://chromium.googlesource.com/chromium/deps/cygwin
[submodule "Source/V8/third_party/python_26"]
    path = Source/V8/third_party/python_26
    url = https://chromium.googlesource.com/chromium/deps/python_26
[submodule "Source/V8/third_party/icu"]
    path = Source/V8/third_party/icu
    url = https://chromium.googlesource.com/chromium/deps/icu52
[submodule "Source/V8/testing/gtest"]
    path = Source/V8/testing/gtest
    url = https://chromium.googlesource.com/chromium/testing/gtest
[submodule "Source/V8/testing/gmock"]
    path = Source/V8/testing/gmock
    url = https://chromium.googlesource.com/chromium/testing/gtest

注意子模块的路径是嵌套的:

源/V8 源码/V8/build/gyp 来源/V8/third_party/cygwin

我尝试了以下示例,但没有成功:

 git submodule add https://chromium.googlesource.com/v8/v8.git   
 Source/V8
 git submodule add https://chromium.googlesource.com/external/gyp 
 Source/V8/build/gyp 

结果:

 The following path is ignored by one of your .gitignore files:
 Source/V8/build/gyp
 Use -f if you really want to add it.

使用 git submodule add -f 结果:

Cloning into 'Source/V8/build/gyp'...
remote: Sending approximately 10.28 MiB ...
remote: Total 16486 (delta 10444), reused 16486 (delta 10444)
Receiving objects: 100% (16486/16486), 10.28 MiB | 2.07 MiB/s, done.
Resolving deltas: 100% (10452/10452), done.
Checking connectivity... done.
fatal: Pathspec 'Source/V8/build/gyp' is in submodule 'Source/V8'
Failed to add submodule 'Source/V8/build/gyp'

如果这种情况可以实现,请告诉我。

更新:注意这个问题是关于创建一个子模块结构,而不是初始化它。

【问题讨论】:

你解决了吗? 这个用例没有解决方案 【参考方案1】:

应将子模块添加到存储库中,而不是添加到子模块中。 然后,在顶层存储库中跟踪它们后,顶层存储库可能会被用作另一个项目中的子模块,从而产生嵌套的子模块结构。 在您的示例中,您应该将 gyp 作为子模块添加到 V8 项目中。 如果不能影响顶层项目,那你应该问问自己,在这个项目中添加子模块是什么意思? 构建所需结构后,您可以使用@iclman 建议的命令将所有子模块放入:git submodule update --init --recursive

【讨论】:

欢迎来到 SO,我们感谢您的意见!您能否通过解释 iclman 所说的内容来编辑您的问题并使其独立?另见***.com/help/how-to-answer【参考方案2】:

是的,嵌套子模块是可能的,但不一定是可取的。 如果你真的想创建嵌套子模块,你必须使用以下命令:

git submodule update --init --recursive

其实之前也有人问过类似的问题。你应该看看here

【讨论】:

对不起,这是错误的答案,请仔细比较两个问题,我的问题是关于创建一个子模块结构,而不是初始化它。 @Karl2011,你有没有试过做 git submodule add chromium.googlesource.com/v8/v8.git Source/V8。然后进入 Source/V8 目录。然后在该目录中,您应该 git submodule add chromium.googlesource.com/external/gyp external/gyp。目录 external/gyp 将成为 Source/V8 中的子模块。 是的,我试过了,但这会将一个子模块添加到 v8 存储库而不是根存储库。 Source/V8 已经是根存储库的子模块。因此,您不能将 Source/V8/external/gyp 添加为根存储库的子模块。您只能将其添加为 Source/V8 的子模块。另一种选择是添加与 Source/V8 相同级别的 external/gyp,然后创建从 Source/V8/external/gyp 到 External/gyp 的符号链接。在这种情况下,External/gyp 将被创建为根 repo 的子模块。

以上是关于在子模块内添加 git 子模块(嵌套子模块)的主要内容,如果未能解决你的问题,请参考以下文章

如何让 git bash 在子模块中显示分支名称

Git在添加主存储库之前恢复主存储库后未删除子模块

使用 git 子模块时如何处理绝对导入

React 项目无法在 git 子模块中使用节点模块

git submodule update --init 给出错误致命:需要单个修订版无法在子模块路径中找到当前修订版

是否必须仅在子模块中添加 spring-boot-starter-* 依赖项?