Cloning a Project With Submodules

Learn to clone a project with submodules with the help of a “recursive” flag.

We'll cover the following

Submodules have a special status within Git repositories. Since they are both included within a repository and at the same time reference as a remote repository, a simple clone will not check out the included submodule. Let’s show that:

1   cd ../..
2   git clone bob_repo bob_repo_cloned
3   cd bob_repo_cloned
4   ls -1
5   cd alicelib
6   ls
7   cd ..
Terminal 1
Terminal

Click to Connect...

alicelib's content is not there. Confusingly, git submodule status gives you a little clue of what’s going on here.

8   git submodule status

The dash (or minus sign) at the front indicates the submodule is not checked out. Only by running a git submodule init and a git submodule update can you retrieve the appropriate submodule repository:

9   git submodule init
10  git submodule update
11  git submodule status

The submodule status has no dash, and a commit ID has been added to the output (969b840…).

The git clone --recursive flag#

Fortunately, there is an easier way. You can clone the repository with a --recursive flag to automatically init and update any submodules (and submodules of those submodules ad infinitum) within the cloned repository:

12  cd ..
13  git clone --recursive bob_repo bob_repo_cloned_recursive

In case you’re wondering if you clone a repository with --recursive and there are no submodules, then Git does not complain.

Terminal 1
Terminal

Click to Connect...

Git Tracks the Submodule’s State
What Are Pull Requests?
Mark as Completed
Report an Issue