git submodule init什么也不做

38

我使用"git submodule init"遇到一个奇怪的问题。

当我使用"git submodule add url location"添加子模块时,它成功克隆了存储库,一切都很好。

当我将所有更改推回父存储库,添加.gitmodules文件等,并将存储库克隆回来后,我尝试使用"git submodule init"初始化所有子模块

但什么也没有发生:( 确切地说,没有输出,没有额外文件,实际上它甚至没有尝试做任何事情。

所以我想知道,我做错了什么?

.gitmodules:

bash$ cat .gitmodules
[submodule "projects/subprojectA"]
    path = projects/subprojectA
    url = ssh://user@bitbucket.company.com/test/projectA.git

[submodule "projects/subprojectB"]
    path = projects/subprojectB
    url = ssh://user@bitbucket.company.com/test/projectB.git
3个回答

45

好的,我已经弄清楚了我做错了什么。

当我添加git子模块时,我执行了git status命令,它告诉我有三个东西已经改变了。

.gitmodules
projects/subprojectA
projects/subprojectB

当我将所有更改推送到代码库时,我不想提交子模块,因为我认为这会添加我刚克隆的所有文件,所以我只做了一个git add .gitmodules并提交和推送它。

但这是错误的,你需要执行git commit并提交它告诉你的一切,然后当你这样做时,git会注册这些路径,当你克隆时,它就可以工作了。

但如果你不提交那些文件夹,它不会注册它们,并且在你克隆父代码库时也不会克隆它们。

所以那是我的错误,我误解了添加这些目录会将所有子模块代码添加到父代码库中,我试图回避它,结果停止工作了。

所以只需添加你的子模块并提交结果,它会完美地运行:D

感谢Protectators的帮助,无论如何!


3
谢谢!!!你救了我的命!!!抱歉但我太高兴了,需要感谢你,我已经调试了几个小时了! - Zennichimaro
2
完全同意!你不知道这让我有多疯狂了,哈哈。 - SolThoth
谢谢。我正在使用GitLab中的子模块,但他们的文档根本没有提到这一点。 - lostiniceland
谢谢!有人知道为什么git子模块这样做吗?在.gitmodules.git/modules之间需要像这样提交它们,子模块注册似乎非常冗余。 - Tau
所以如果发生这种情况,文件就会丢失,这指向子模块的提交ID。最简单的解决方法是重新添加子模块。 - Thomas

18

对于googletest子模块,以下方法适用于我:

git submodule add --force https://github.com/google/googletest.git googletest

所以,你需要手动添加子模块(注意--force标志)。


2
另外,你需要删除目标文件夹。至少这对我有效。 - cristhoper

7

克隆时请使用--recursive选项。此选项会初始化所有列出的子模块:

git clone --recursive

另外一种情况是,如果你想要初始化一个已经克隆过来的 git 仓库中的子模块,你可以使用

git submodule update --init --recursive

3
git submodule update --init --recursive 在这里没有任何作用,没有克隆,什么也没有,我现在要尝试 git clone --recursive。 - Christopher Thomas
2
git clone --recursive 命令也不会克隆子模块,我正在使用 git 版本 2.10.0。 - Christopher Thomas
1
是的,就是我在评论中提到的那个,在我克隆存储库时就已经有了,这就是为什么我有点困惑... - Christopher Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接