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