"Michael S. Tsirkin" <mst@xxxxxxxxxx> writes: > Fundamentally the problem we encounter regularly is this: > qemu is superproject, ui/keycodemapdb is subproject. > > > I have a change on master setting the submodule commit: > > qemu$ git show master | grep +Sub > +Subproject commit 7381b9bfadd31c4c9e9a10b5bb5032f9189d4352 > > and check it out: > > qemu$ git submodule update --init ui/keycodemapdb > Submodule 'ui/keycodemapdb' (https://gitlab.com/qemu-project/keycodemapdb.git) registered for path 'ui/keycodemapdb' > Submodule path 'ui/keycodemapdb': checked out '7381b9bfadd31c4c9e9a10b5bb5032f9189d4352' > > > In another branch I have a different commit: > > qemu$ git show sub-foo | grep +Sub > +Subproject commit 57ba70da5312170883a3d622cd2aa3fd0e2ec7ae > > > Now I switch branches and nothing happens, the submodule > is marked as dirty: > > qemu$ git checkout sub-foo > M ui/keycodemapdb > Switched to branch 'sub-foo' > > qemu$ (cd ui/keycodemapdb && git show | head -1) > commit 7381b9bfadd31c4c9e9a10b5bb5032f9189d4352 > > > it is now very easy to generate incorrect code: > - git commit -a will commit the change to submodule > - any build will use a mix of super and subproject that > is completely untested > > > As a result people are basically saying avoid using submodules > but I am wondering whether git can be tweaked to do the > right thing by default. > It sounds like you want submodule.recurse [1] :) With that enabled, your "git checkout" should behave like "git checkout --recurse-submodules", which should make ui/keycodemapdb check out the correct commit as long as the submodule commit is present locally. If is is _not_ present locally, you will have to run "git submodule update". Unfortunately, you typically won't know whether the commit is present before running the command. This is yet another of those things that are painful with submodules. [1] https://git-scm.com/docs/git-config#Documentation/git-config.txt-submodulerecurse > I understand we can work around it by asking everyone to > create a correct config, but can't we make it DTRT by default > to reduce friction? You might be interested in the proposed 'new' Submodule UX [2]; one of the goals is to make manual submodule management via "git submodule" unnecessary. As a part of that, you should be able to set "submodule.recurse = true" and have high confidence that all necessary submodules and submodule commits are present. Work on that is still ongoing, but this situation should have improved as of [3]. [2] https://lore.kernel.org/git/YHofmWcIAidkvJiD@xxxxxxxxxx/ [3] https://lore.kernel.org/git/20220308001433.94995-1-chooglen@xxxxxxxxxx/ > > > -- > MST