Hi Luke, > Le 20 sept. 2020 à 05:44, Luke Diamand <luke@xxxxxxxxxxx> a écrit : > > On Sat, 19 Sep 2020 at 10:03, Luke Diamand <luke@xxxxxxxxxxx> wrote: >> >> Maybe this is a FAQ, but I couldn't figure it out! >> >> I have a repo which has a couple of submodules. >> >> At some point in the past I deleted one of those submodules: >> >> git rm sub2 >> git add -u >> git commit -m 'Deleting sub2' >> git push origin >> ... >> ... more commits and pushes... >> >> Now I go and clone the head revision. This gives me a clone which has >> nothing present in .git/modules/sub2. >> login on some other machine >> git clone git@xxxxxxx:thing >> cd thing >> ls .git/modules >> <sub2 not present> >> >> So when I go and checkout an old revision where sub2 is still around I get: >> git checkout oldrevision >> fatal: not a git repository: sub2/../.git/modules/sub2 >> >> What am I doing wrong? >> What set of commands do I need to use to ensure that this will always >> do the right thing? >> >> Thanks >> Luke > > Replying to myself, adding Jens who added the section below. > > This is a known bug: > > https://git-scm.com/docs/git-rm > >> BUGS >> ---- >> Each time a superproject update removes a populated submodule >> (e.g. when switching between commits before and after the removal) a >> stale submodule checkout will remain in the old location. Removing the >> old directory is only safe when it uses a gitfile, as otherwise the >> history of the submodule will be deleted too. This step will be >> obsolete when recursive submodule update has been implemented. > > I'm wondering what "recursive submodule update" is. If I do: > > git submodule update --checkout --force --remote --recursive > > then those stale repos are still left lying around. I guess that's a > different kind of recursive? > I think Jens was referring to this project : https://github.com/jlehmann/git-submod-enhancements/wiki/Recursive-submodule-checkout of which some parts were implemented over the years, a lot of them by Stefan Beller. In fact this part of the doc is stale and should be removed since `git checkout` now understands `--recurse-submodules` and will automatically transform "old-style" subdmodules (i.e. with an embeded .git repository) into "new style" submodules (with a gitfile) (see gitsubmodules(7), at [1], for more info) when switching to a commit where the submodule is not present. Cheers, Philippe.