git --recursive doesn't clone submodule
Asked Answered
C

2

7

I learned that to download submodules with main repository we can use --recursive option when cloning main repository.

I did the same git clone --recursive [email protected]:passion/academy.git

I found that it only create a empty directory of submodule but not downloaded its code.

Do we need to do extra stuff like git submodule update --init --recursive ? If yes then what is the use of --recursive flag when cloning main repository ?

Characterize answered 22/12, 2015 at 4:22 Comment(1)
If you are using Git 1.6.5 or later your git clone --recursive should do as you are expecting. Are you using earlier than that version? That is a fairly old version but figured worth asking :DBanker
I
3

If you are using a recent enough git, and it still does not clone submodules, that means those empty folders are not submodules but nested git repo.

A nested repo is recorded in its parent repo as a gitlink, but there would not be any .gitmodules files associated to it.

health-check seem to be a nested git but not sure when cloning give me No submodule mapping found in .gitmodules for path for health-check .. is it necessary for nested git repos to have entry in .gitmodules ?

If you want your nested git repo to be recognized and managed as a submodule, yes.

As illustrated by your next question, it is possible that the lack of path entry in .gitmodules for health-check prevents hellospawn (which seems to be a legit submodule) to be checked out.

Inwards answered 22/12, 2015 at 5:21 Comment(14)
I found that I have two sub-directories one is hellospawn which is sub-module for sure (entry in .gitmodules ) and another folder health-check ( no entry in .gitmodules ). I suspect that health-check is a nested repo instead of 'sub-module' . Assume if this is the case then won't --recursive flag pull 'hellspawn' code ? .. I hope I am able to explain the things.Characterize
@Characterize yes, --recursive should clone hellospawn (just to be sure, what version of git are you using, on which OS?)Inwards
@Characterize also, what is the output of git ls-tree HEAD hellospawnInwards
Git version git version 2.6.4 .. I just did a clone of main repo again and last line gave me this Checking out files: 100% (40517/40517), done. No submodule mapping found in .gitmodules for path 'health-check' . I didn't get anything in hellspawnCharacterize
@Characterize that explains health-check for sure. What about git ls-tree HEAD hellospawn?Inwards
160000 commit 2e5c9cbd00652268ae3e61cde6705ff39aad9202 ./Characterize
Let us continue this discussion in chat.Characterize
@Characterize ok, so it is a gitlink alright. Maybe it refers to the hellospawn repo in its empty state? Does commit 2e5c9c points to a commit with content?Inwards
@Characterize so what was the issue with heath-check?Inwards
health-check seem to be a nested git but not sure when cloning give me No submodule mapping found in .gitmodules for path for health-check .. is it necessary for nested git repos to have entry in .gitmodules ?Characterize
I have created a new question which explain my current problem in better way. #34410524Characterize
@Characterize Great! Did you declare the submodule or remove its entry?Inwards
I will go by adding health-check to submodule.Characterize
@Characterize Excellent! No more "No submodule mapping found", and the git clone --recursive should complete its task.Inwards
H
2

I had a similar issue. A few things to check:

  1. Check your .gitmodules file:
% cat .gitmodules
[submodule "src/mysubmodule"]
    path = src/mysubmodule
    url = myurl/mysubmodule.git
  1. Check your .git/config file and make sure the submodule url listed is the same as in .gitmodules:
% cat .git/config
...
[submodule "src/mysubmodule"]
    url = myurl/mysubmodule.git
    active = true
  1. Finally, check the url and make sure this is the correct url (should be the same as what you type in a "git clone" of that submodule).
Humorous answered 23/10, 2020 at 23:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.