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

Re: "GIT_INDEX_FILE" environment variable

From
JHJunio C Hamano <junio@siamese.dyndns.org>
Date
Apr 22, 2005, 00:21 UTC
Message-ID
<7vis2fbr0p.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.58.0504211100330.2344@ppc970.osdl.org>
>>>>> "LT" == Linus Torvalds <torvalds@osdl.org> writes:
LT>   Add support for a "GIT_INDEX_FILE" environment variable.
  
LT>   We use that to specify alternative index files, which can be useful
LT>   if you want to (for example) generate a temporary index file to do
LT>   some specific operation that you don't want to mess with your main
LT>   one with.
  
LT>   It defaults to the regular ".git/index" if it hasn't been specified.

This is all good. I have a related issue I'd like to hear your opinion about.

When I am not in the top-level directory, relative to the tree structure $GIT_INDEX_FILE describes, obviously I cannot just say "show-diff path-pattern" (or even just "show-diff") without first chdir'ing to the top. My current workaround I use in the jit-show-diff wrapper script is quite ugly:

 - Starting from dir="${PWD-"$(pwd)"}", repeatedly do
   dir=$(dirname dir) until I find a $dir/.git directory.  Call
   the first directory I find that has .git subdirectory
   $GIT_PROJECT_TOP.
 - At the same time, inspect GIT_INDEX_FILE and
   SHA1_FILE_DIRECTORY environment variables.  If they are not
   set, set them to $GIT_PROJECT_TOP/.git/index and
   $GIT_PROJECT_TOP/.git/objects, respectively and export them.
 - Figure out the name of the current working directory relative
   to $GIT_PROJECT_TOP.  I'll call this value $R for brevity in
   the following description.
 - chdir to $GIT_PROJECT_TOP and run "show-diff" with the
   original flags and _all_ the user supplied paths prefixed
   with $R.
To illustrate what I just said:
  $ /bin/ls -aF
  ./  ../  .git/  a/
  $ /bin/ls -aF .git
  .   ../  HEAD   index  objects/ 
  $ cd a
  $ /bin/ls -aF
  .   ../   bar  foo/
  $ show-diff -r foo     ; # of course this does not work.
  $ jit-show-diff -r foo
  The wrapper figures out that .. is the project top to chdir
  to, and $R is "a/".  Using these values, it eventually calls:
    cd .. ; show-diff -r "a/foo"

This is not so hard to arrange in the wrapper, but this is quite brittle. The show-diff command happens to take only -r, -z, and -q flag parameters so the wrapper can prefix $R to all the other paramters, but for other git core commands when to prefix $R and when not to soon becomes a maintenance nightmare.

I am thinking about an alternative way of doing the above by some modifications to the git core. I think the root of this problem is that there is no equivalent to GIT_INDEX_FILE and SHA1_FILE_DIRECTORY that tells the core git where the project top directory (i.e. the root of the working tree that corresponds to what $GIT_INDEX_FILE describes) is.

I am wondering if this alternative is acceptable by you before I spend too much time on it.

 - A new environment variable GIT_WORKING_TREE points at the
   root of the working tree.
 - Each git core command [*1*] that looks at the working tree is
   modified to take the user supplied pathname as a path
   relative to the current working directory, and use
   GIT_WORKING_TREE value to figure out which path the user is
   talking about, relative to the tree structure GIT_INDEX_FILE
   describes.

There is no need for jit-show-diff-wrapper when the above change happens. The user (or Cogito) has to set and export GIT_WORKING_TREE once, and whereever the user happens to be the core git command would just work as expected.

What do you think?
[Footnotes]

*1* Yes I am aware that there are tons of them that need this surgery if we wanted to take this approach.

Previous: Linus TorvaldsNext: Linus Torvalds
Message 4 of 14 in “"GIT_INDEX_FILE" environment variable”
  1. Linus TorvaldsApr 21, 2005
  2. Davide LibenziApr 21, 2005
  3. Linus TorvaldsApr 21, 2005
  4. Junio C HamanoApr 22, 2005
  5. Linus TorvaldsApr 22, 2005
  6. Junio C HamanoApr 22, 2005
  7. Petr BaudisApr 22, 2005
  8. Linus TorvaldsApr 22, 2005
  9. Junio C HamanoApr 22, 2005
  10. Linus TorvaldsApr 22, 2005
  11. Junio C HamanoApr 22, 2005
  12. Petr BaudisApr 22, 2005
  13. Linus TorvaldsApr 22, 2005
  14. Zach WelchApr 22, 2005

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.