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

Re: bug: git submodule add fails when .git is a symlink

From
Stefan Beller <sbeller@google.com>
Date
Apr 20, 2016, 17:31 UTC
Message-ID
<CAGZ79kZ2A6c9H7C4xPXJ1Lmh1TaVy+VgcjxvKrgcJb0-4LRvhA@mail.gmail.com>
In-Reply-To
<CAGZ79kbpyu34kz7gRgro-HZqNvpmRoCsyQatZRbxP19bk1gkfg@mail.gmail.com>
On Wed, Apr 20, 2016 at 9:41 AM, Stefan Beller <sbeller@google.com> wrote:
Show 30 quoted lines
> On Wed, Mar 2, 2016 at 12:49 AM, Jeff King <peff@peff.net> wrote:
>> On Tue, Mar 01, 2016 at 07:17:20PM -0400, Joey Hess wrote:
>>
>>> Junio C Hamano wrote:
>>> > A more pertinent question may be which version of Git did the above
>>> > ever work, I guess.  We fairly liberally chdir around and I do not
>>> > think we deliberately avoid assuming that "cd .git && cd .." might
>>> > not come back to the original directory, for example, so I wouldn't
>>> > be surprised if it never worked.
>>>
>>> IIRC git used symlinks for .git in submodules before version 1.7.8, so I
>>> guess that older versions supported that pretty well.
>>>
>>> This one case is the only time I've seen a symlink for .git present a
>>> problem so far.
>>
>> Fortunately you provided a simple reproduction case, so it is easy to
>> bisect. It did work in v1.7.8, and broke in d75219b (submodules: always
>> use a relative path from gitdir to work tree, 2012-03-04). Not
>> surprising, I guess. It presumably worked before only because we were
>> using absolute paths.
>
> So I was looking into this bug again, as it was linked from another bug report.
>
> fatal: Could not chdir to '../../../sub': No such file or directory
>
> sounds like a path issue with the prefix thing.
>
> Using the " echo "gitdir: ../gitdir/.git" > .git" workaround does still work,
> I'll see if there is another way to fix it with actual links.
So I debugged into that using a test case
test_expect_success 'submodules are not confused by linked gitdir' '
        git init gitdir &&
        mkdir worktree &&
        (
                cd worktree &&
                #echo "gitdir: ../gitdir/.git" >.git &&
                ln -s ../gitdir/.git .git &&
                test_pause &&
                git submodule add ../ sub &&
                test_pause
        ) &&
        test_pause &&
        git status
'

My observation: the error comes up in `git submodule add`, which consists of 2 parts: the cloning and then the checkout. The cloning works fine using the new "submodule--helper update-clone", the checkout however breaks. So in your original test case you can go into the submodule and run

    git checkout -f -q
and you'll get the error message
    fatal: Could not chdir to '../../../sub': No such file or directory
Looking at sub/.git:
    $ cat .git
    gitdir: ../.git/modules/sub
    $ ls ../.git/modules/sub
    HEAD  branches config description  hooks  info  logs objects
packed-refs  ref

so that gitlink of the submodule works just fine. The problem is `git checkout` or any other core command (I tested with `git status`) doesn't like the gitlink pointing to a directory which is symlinked.

I think the issue is a wrongly configured "core.worktree" in gitdir/.git/modules/sub/config which contains the "../../../sub".

So I think the fix needs to be in the vicinity of builtin/submodule--helper.c:module_clone near the end of the function, where core.worktree is set.

Thanks, Stefan

Show 8 quoted lines
>
>
>>
>> -Peff
>> --
>> To unsubscribe from this list: send the line "unsubscribe git" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous: Stefan Beller
Message 9 of 9 in “bug: git submodule add fails when .git is a symlink”
  1. Joey HessMar 1, 2016
  2. Stefan BellerMar 1, 2016
  3. Stefan BellerMar 1, 2016
  4. Joey HessMar 1, 2016
  5. Junio C HamanoMar 1, 2016
  6. Joey HessMar 1, 2016
  7. Jeff KingMar 2, 2016
  8. Stefan BellerApr 20, 2016
  9. Stefan BellerApr 20, 2016

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.