bashadvanced

Git Submodules — Add, Update, and Pin

Manage repository dependencies with submodules: add, update, pin versions, and handle nested repos.

bash
# Add a submodule
git submodule add https://github.com/org/shared-lib.git libs/shared

# Clone a repo WITH its submodules
git clone --recurse-submodules https://github.com/org/main-project.git

# Initialize submodules after clone (if --recurse was forgotten)
git submodule init
git submodule update
# or combined:
git submodule update --init --recursive

# Update submodule to latest remote commit
cd libs/shared
git checkout main
git pull
cd ../..
git add libs/shared
git commit -m "chore: update shared-lib submodule"

# Update all submodules at once
git submodule update --remote --merge

# Pin submodule to specific tag/commit
cd libs/shared
git checkout v2.1.0
cd ../..
git add libs/shared
git commit -m "chore: pin shared-lib to v2.1.0"

# View submodule status
git submodule status

# Deinit (remove from working tree, keep in .gitmodules)
git submodule deinit libs/shared

# Fully remove a submodule
git submodule deinit libs/shared
git rm libs/shared
rm -rf .git/modules/libs/shared
git commit -m "chore: remove shared-lib submodule"

Use Cases

  • Sharing code libraries across multiple repos
  • Pinning third-party dependencies to specific versions
  • Managing monorepo-style project structures

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.