Git & GitHub ยท Chapter 39 of 42

Git Submodules

A submodule lets you include another Git repository as a subdirectory inside your own repository, while keeping its history completely separate. This is useful for sharing libraries across multiple projects.

Submodules pin a specific commit of the external repository, so your project always references an exact, reproducible version rather than always tracking its latest changes automatically.

Syntax
git submodule add <url> <path>
git submodule update --init --recursive

Adding a submodule

Run `git submodule add <url> path` to add another repository as a submodule at the given path. This records the submodule's URL and commit in a `.gitmodules` file.

Cloning projects with submodules

When cloning a repository that has submodules, use `git clone --recurse-submodules <url>`, or run `git submodule update --init --recursive` afterward.

Example 1 (bash)
git submodule add https://github.com/user/shared-lib.git libs/shared-lib
Output
Cloning into 'libs/shared-lib'...

Adds an external repository as a submodule inside the libs/shared-lib folder.

Example 2 (bash)
git clone --recurse-submodules https://github.com/user/main-project.git
Output
Cloning into 'main-project'...
Submodule 'libs/shared-lib' registered for path 'libs/shared-lib'

Clones a project and automatically initializes and fetches all its submodules.

Key points

  • A submodule embeds another Git repository inside your project.
  • Submodules pin an exact commit, not the latest branch automatically.
  • Submodule info is stored in a .gitmodules file.
  • Cloning requires --recurse-submodules to also fetch submodule content.
๐Ÿ’ก Note: Submodules add complexity โ€” for many teams, package managers (like npm) are a simpler alternative for sharing code.

๐Ÿ“ Quick Quiz

1. What is a Git submodule?

2. What does a submodule pin to your project?

3. What flag ensures submodules are fetched when cloning?