git submodule
With the git submodule command, you can include one Git repository inside another as a subdirectory. This is most useful when you want to reuse shared code — such as a library or framework — across multiple projects without copying it.
Adding a submodule
To add a submodule, run the following from the root of your repository:
$ git submodule add https://github.com/myotherproject/myotherrepository subfolder
Cloning into 'subfolder'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 11 (delta 0), reused 11 (delta 0)
Unpacking objects: 100% (11/11), done.
Checking connectivity... done.
By default, Git creates a folder named after the remote repository. You can override this by specifying a different folder name after the URL, as shown above.
This will create (or update) a .gitmodules file that records the submodule's local path and remote URL. Once you've added the submodule, commit and push the change:
$ git commit -am "Added myotherrepository submodule"
[main 1234abc] Added myotherrepository submodule
2 files changed, 4 insertions(+)
create mode 100644 .gitmodules
create mode 160000 subfolder
$ git push origin main
Cloning a repository with submodules
When you clone a repository that contains submodules, the submodule directories will be empty by default. To clone everything in one step, use the --recurse-submodules flag:
$ git clone --recurse-submodules https://github.com/myproject/myrepository
This clones the main repository and then automatically initialises and fetches all of its submodules.
Initialising submodules after cloning
If you've already cloned a repository without --recurse-submodules, you can set up the submodules afterwards with two commands:
$ git submodule init
$ git submodule update
git submodule init registers the submodule paths from .gitmodules into your local Git config. git submodule update then fetches the correct commit for each submodule and checks it out.
Updating a submodule
If the remote repository for a submodule has been updated and you want to pull the latest changes into your project:
$ git submodule update --remote --merge
This fetches the latest commit from each submodule's remote and merges it. You'll then need to commit and push the change so other collaborators pick it up.
Removing a submodule
Removing a submodule takes a few steps. First, unregister the submodule and remove its files:
$ git submodule deinit -f subfolder
$ git rm -f subfolder
Then clean up the leftover Git internal data:
$ rm -rf .git/modules/subfolder
Finally, commit the removal:
$ git commit -m "Removed subfolder submodule"
This fully removes the submodule entry from .gitmodules, your .git/config, and the working directory.
If you run into issues with submodule paths during deployment, see our FAQ on adding files at a submodule path.
DeployHQ supports deploying repositories that use submodules — it can automatically fetch and deploy submodule contents alongside your main project.