On Wed, Oct 12, 2022 at 09:56:45AM -0700, Glen Choo wrote: > "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] :) yes. unfortuntely there is no way to set it by default for cloned repos. users have to remember to set it. > 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. Hmm. How about only doing this for active submodules? Possible? > 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