#!/bin/bash # Checkout and update source for all registered submodules (.gitmodules). # Optionally 'git pull' on each submodule to check for updates. # Change to root directory cd $(git rev-parse --show-toplevel) # Ensure all submodules (and child submodules) are checked-out git submodule update --init --checkout --recursive # Update submodules' remotes based on .gitmodules git submodule sync # Forcibly update each submodule's "master" branch to be the current revision # in case HEAD is detached (e.g. due to "git submodule update --checkout") git submodule foreach --recursive 'git checkout --quiet -B master' if [ "$1" = "pull" ]; then # Fetch & pull any new updates from submodule's origin (but *NOT* any child # submodule updates -- those should come from the submodule proper) git submodule foreach 'git-up origin' fi