git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: How to checkout a revision that contains a deleted submodule?

From
Philippe Blain <levraiphilippeblain@gmail.com>
Date
Sep 21, 2020, 22:46 UTC
Message-ID
<0B191753-C1AD-499C-B8B2-122F49CF6F14@gmail.com>
In-Reply-To
<CAE5ih79puooMA1v8jOkqKaO9xPmYqtkT9kXHq2L6YODJJ8oGEQ@mail.gmail.com>
Hi Luke, 
Show 58 quoted lines
> Le 20 sept. 2020 à 05:44, Luke Diamand <luke@diamand.org> a écrit :
> 
> On Sat, 19 Sep 2020 at 10:03, Luke Diamand <luke@diamand.org> 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@my.repo: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.

Previous: Luke Diamand
Message 7 of 7 in “How to checkout a revision that contains a deleted submodule?”
  1. Luke DiamandSep 19, 2020
  2. Luke DiamandSep 20, 2020
  3. Kaartic SivaraamSep 20, 2020
  4. Luke DiamandSep 20, 2020
  5. Philippe BlainSep 21, 2020
  6. Luke DiamandSep 22, 2020
  7. Philippe BlainSep 21, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.