Eran Tromer [off-list ref] writes:
Another approach is for pull, checkout etc. to automatically update the
submodule' head ref, but no more. In this case the supermodule always
sees a consistent state with traditional semantics, but the *submodule*
ends up with a dirty working tree and a head referring to a
possibly-missing commit; "git submodule update" would need to clean that up.
That however would introduce the same problem as "pushing into
live repository to update its HEAD while the index and working
tree are looking the other way". We would need to somehow make
it possible for the subdirectory to remember which commit the
index and the working tree are derived from, so that the local
changes can be merged back to the revision the submodule HEAD
points at.