git submodules implementation question
- From
- Uma Srinivasan <usrinivasan@twitter.com>
- Date
- Aug 28, 2016, 23:24 UTC
- Message-ID
- <CAN5XQftQH8B+hWVh4JQgZwAp+rkbz51P5NZDc_+Tfm0EB1zkew@mail.gmail.com>
Hi,
I am new to git source and internal development. Recently I've been looking at a problem where issuing "git status" in a corrupted workspace handed over to me by a user, forks several thousand child processes recursively.
The symptoms of the corrupted workspace to reproduce this problem are as follows:
there needs to be an entry in the index file that looks something like this.... 0 groc 160000 0 0.000000000
Also, there's a subdirectory under the source dir with the name in the index file above (i.e 'groc') that has a partially populated .git sub directory within it, not a .git file with the contents providing a link to the module subdirectory.
The "git submodule status" command returns "No submodule mapping found in .gitmodules for path 'groc'"
Doing a "git read-tree HEAD" will regenerate the index file and make the problem go away. Basically the line entry above relating to 'groc' goes away as it is not a submodule in the source repo.
This problem can be reproduced with all current versions of GIT including 2.4, 2.8 and the latest version v2.10.0-rc1.
In looking into the git source code for is_submodule_modified() which forks off the new child process, I see the following lines in submodule.c:
git_dir = read_gitfile(buf.buf); if (!git_dir)
git_dir = buf.buf;
Can anyone explain to me why we are replacing a failed reading of a git file with the original sub directory name? When can we expect a .git directory under a submodule?
Thanks, Uma