踩坑 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 !!