Skip to content

Submodule Quick Recipe (Cheat Sheet)


Setup & Init

# Clone + submodules in one step
git clone --recurse-submodules URL

# Init after clone (if submodules not fetched)
git submodule update --init --recursive

Daily Workflow

# Check submodule status
git submodule status

# Update submodule to pinned SHA (after git pull)
git submodule update

# Update to latest tracked branch
git submodule update --remote libs/shared-lib
git add libs/shared-lib
git commit -m "chore(submodule): bump shared-lib"

CI / DevOps Patterns

# Shallow clone with submodules
git clone --depth 1 --recurse-submodules --shallow-submodules URL

# Get current submodule pins
jq -n '[inputs | split(" ") | {sha: .[0], path: .[1]}]' < <(git submodule status)

Troubleshoot

# Force submodule checkout to recorded SHA
git submodule update --init --force

# Deinit and re-add
git submodule deinit -f libs/shared-lib
git rm libs/shared-lib
rm -rf .git/modules/libs/shared-lib
git submodule add URL libs/shared-lib