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

Re: fatal: unable to read after commit - deeper analysis

From
Jeff King <peff@peff.net>
Date
Apr 22, 2019, 16:21 UTC
Message-ID
<20190422162127.GC9680@sigill.intra.peff.net>
In-Reply-To
<20190413092136.GK12669@ikki.ethgen.ch>
On Sat, Apr 13, 2019 at 10:21:36AM +0100, Klaus Ethgen wrote:
Show 23 quoted lines
> Finally, the error was a combination of 4 tools, git, vim, the mentioned
> vim-addon and task with a task-hook for committing pending.data.
> 
> When I do a git commit which invokes vim, then the following variables
> are set:
> - GIT_INDEX_FILE
> - GIT_AUTHOR_DATE
> - GIT_PREFIX
> - GIT_EXEC_PATH
> 
> And $GIT_INDEX_FILE is the source of trouble here. The task-hook clears
> respective sets the variables GIT_DIR and GIT_WORK_TREE. However, the
> GIT_INDEX_FILE environment is set (in some cases) to an absolute path
> pointing to .git/index.lock or .git/index (I have no idea when it is
> taking the .lock variant).
> 
> Now we have a mismatch of GIT_DIR and GIT_WORK_TREE on one hand and the
> absolute path of GIT_INDEX_FILE on the other. So the trouble is set. The
> following "git add pending.data" did break all. It does something to an
> index that does not belong to the git repo.
> 
> Mystery is when and why this changed in git. It was definitively changed
> in some recent version.

It was always the case that GIT_INDEX_FILE would sometimes be set. For a partial commit like:

  echo changes >>one
  echo changes >>two
  git add .
  git commit two

we have to create a temporary index (so as not to commit the staged changes from "one").

I was curious if we started setting it for the more vanilla case of just "git commit" more recently. But trying to bisect on:

  GIT_EDITOR=set | grep ^GIT_INDEX; :' git commit

I couldn't find any version where we _didn't_ set $GIT_INDEX_FILE, going back to v1.6.0. So I don't know of any recent changes in this area.

Presumably you've fixed it by unsetting $GIT_INDEX_FILE in your vim task-hook when it switches to another repo. However, you may want to switch to asking Git about the full list of repo-related variables you should clear. In the shell that looks like:

  unset $(git rev-parse --local-env-vars)

That should be more thorough, and will future-proof you against new variables being added.

-Peff
Previous: Klaus Ethgen
Message 7 of 7 in “fatal: unable to read after commit”
  1. Klaus EthgenApr 11, 2019
  2. Christian CouderApr 12, 2019
  3. Klaus EthgenApr 12, 2019
  4. Klaus EthgenApr 12, 2019
  5. Klaus EthgenApr 12, 2019
  6. Klaus EthgenApr 13, 2019
  7. Jeff KingApr 22, 2019

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.