clone git repos with submodules

踩坑 git submodules。

写在前面

当你需要clone的repos中,含有submodules时,我们会用到git clone —recursive这个命令,我今个也遇到了,然后很不幸地掉坑了,一直无法成功clone,Google后,搞定!现附上解答细节。

正文

先来认识下git中的子模块submodule。

A submodule in a git repository is like a sub-directory which is really a separate git repository in its own right. This is a useful feature when you have a project in git which depends on a particular versions of other projects。

我的理解是当你的repos需要依赖于第三方的repos时,可以用submodule的方式,把这些repos作为你的子模块引入进来使用,而这些repos本身仍是独立的。

「添加submodule可以使用命令:git submodule add 后面加上URL即可。」

以clonehowitzer_example_cucumber为例。可以看到有四个文件长得不大一样,这些其实就是submodule。

如果你直接clone, 使用命令:

git clone [email protected]:strongqa/howitzer_example_cucumber.git

你会发现clone到本地后,那些submodule的文件存在,但里面没有任何文件。

这时就需要添加–recursive这个选项,howitzer_example_cucumber文档下也列出了命令:

git clone --recursive [email protected]:strongqa/howitzer_example_cucumber.git

终端输入后,报错:

没有clone成功,显示Permission denied (publickey)

google了一下,大部分人都是说修改你的ssh, 可我发现clone其他的repos没问题啊,说明我的ssh没毛病,clone带有submodule的却出问题,被拒绝,肯定跟submodule有关, 应该有其他方法。在stack overflow: git clone –recursive fails上找到了最方便的解答。

非常直接:使用https格式

终端输入:

git clone --recursive https://github.com/strongqa/howitzer_example_cucumber

搞定!

PS. 看了其他文档,发现还有个方法,使用git submodule init , git submodule update.

亲测有效,一并附上:

还是clone上面的repos,终端输入:

git clone https://github.com/strongqa/howitzer_example_cucumber
cd howitzer_example_cucumber
git submodule init
git submodule update

OK !!

参考

Git 工具 - 子模块

git clone –recursive fails