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

Re: git submodules implementation question

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 31, 2016, 16:42 UTC
Message-ID
<xmqq7faw3n5w.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<CAN5XQfuoq6MV4e98RzUCG02KvZO6VZAbs1oxAzpdg5zswqpHGw@mail.gmail.com>
Uma Srinivasan <usrinivasan@twitter.com> writes:
Show 11 quoted lines
>> I might suggest to update prepare_submodule_repo_env() so that the
>> spawned process will *NOT* have to guess where the working tree and
>> repository by exporting GIT_DIR (set to "git_dir" we discover above)
>> and GIT_WORK_TREE (set to "." as cp.dir is set to the path to the
>> working tree of the submodule).  That would stop the "git status" to
>> guess (and fooled by a corrupted dir/.git that is not a git
>> repository).
>
> Here's where I am struggling with my lack of knowledge of git
> internals and the implementation particularly in the context of how
> environment variables are passed from the parent to the child process.

Ah, I was primarily addressing Jacob in the latter part of my message, as he's looked at similar things in his recent topic.

> Are you suggesting that we set up the child process environment array
> (the "out" argument) in prepare_submodule_repo_env() to include
> GIT_DIR_ENVIRONMENT and GIT_WORK_TREE_ENVIRONMENT in addition to
> CONFIG_DATA_ENVIRONMENT that is there now?

I was wondering if we should unconditionally stuff GIT_DIR=<the repository location for the submodule> in the cp.env_array passed to the function prepare_submodule_repo_env(). As cp.dir will be set to the submodule's working tree, there is no need to set GIT_WORK_TREE and export it, I think, although it would not hurt.

After all, we _are_ going into a separate and different project's repository (that is what a submodule is), and we _know_ where its repository data (i.e. GIT_DIR) and the location of its working tree (i.e. GIT_WORK_TREE). There is no reason for the process that will work in the submodule to go through the usual "do we have .git in our $cwd that is a repository? if not how about the parent directory of $cwd? go up until we find one and that directory is the top of the working tree" discovery.

More importantly, this matters when your GIT_DIR for the submodule is somehow corrupt. The discovery process would say "there is .git in $cwd but that is not a repository" and continue upwards, which likely would find the repository for the top-level superproject, which definitely is _not_ want you want to happen. And one way to avoid it is to tell the setup.c code that it should not do the discovery by being explicit.

Previous: Uma SrinivasanNext: Uma Srinivasan
Message 16 of 31 in “git submodules implementation question”
  1. Uma SrinivasanAug 28, 2016
  2. Junio C HamanoAug 29, 2016
  3. Uma SrinivasanAug 29, 2016
  4. Junio C HamanoAug 29, 2016
  5. Uma SrinivasanAug 29, 2016
  6. Uma SrinivasanAug 29, 2016
  7. Junio C HamanoAug 29, 2016
  8. Uma SrinivasanAug 29, 2016
  9. Jacob KellerAug 30, 2016
  10. Uma SrinivasanAug 30, 2016
  11. Jacob KellerAug 30, 2016
  12. Jacob KellerAug 30, 2016
  13. Uma SrinivasanAug 30, 2016
  14. Junio C HamanoAug 30, 2016
  15. Uma SrinivasanAug 31, 2016
  16. Junio C HamanoAug 31, 2016
  17. Uma SrinivasanAug 31, 2016
  18. Junio C HamanoAug 31, 2016
  19. Uma SrinivasanAug 31, 2016
  20. Uma SrinivasanSep 1, 2016
  21. Junio C HamanoSep 1, 2016
  22. Uma SrinivasanSep 1, 2016
  23. Junio C HamanoSep 1, 2016
  24. Stefan BellerSep 1, 2016
  25. Junio C HamanoSep 1, 2016
  26. Junio C HamanoSep 1, 2016
  27. Junio C HamanoSep 1, 2016
  28. Stefan BellerSep 1, 2016
  29. Junio C HamanoSep 1, 2016
  30. Uma SrinivasanSep 1, 2016
  31. Junio C HamanoSep 1, 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.