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

Re: speed of git reset -- file

From
Jeff King <peff@peff.net>
Date
Jun 1, 2011, 21:18 UTC
Message-ID
<20110601211847.GA31958@sigill.intra.peff.net>
In-Reply-To
<20110601201629.GA25354@gnu.kitenet.net>
On Wed, Jun 01, 2011 at 04:16:29PM -0400, Joey Hess wrote:
Show 10 quoted lines
> Jeff King wrote:
> > So implementing the "optimization" to drop the refresh here doesn't seem
> > worth it. It inroduces an awful inconsistency, and it probably isn't
> > saving much in practice. Lots of other commands will end up stat'ing
> > everything, anyway. Users with giant repos or slow stat calls are
> > probably better off using assume-unchanged, which would help this and
> > many other situations.
> 
> Sounded like git-reset -q file could be optimised to not reread the
> index without any visible inconsistency?
No, there would still be a visible inconsistency. For example:
  $ git reset -q -- file
  $ git diff-files
might leave stat-dirty entries in the index, but:
  $ git reset -- file
  $ git diff-files
would not.

In practice, it doesn't matter that much, because you would probably run the porcelain "git diff" instead of the plumbing "git diff-files" anyway. And "git diff" refreshes the index itself, so the behavior change is not that important. But then, as you see, we end up refreshing the index defensively a lot, anyway, so saving the one refresh from reset may be lost in the noise (unless you are doing some tight loop of resets).

So what you could do with assume-unchanged (or much better, the autorefreshindex variable that Junio recommends), would be to shut off _all_ of the unnecessary refreshes, not just this one.

> My experience with semi-large trees[1] is that I have to remember to use
> "git status ." in a subdir; that "git commit -a" is of course slow when
> I need to use it; and that the index gets big and things that need to
> update it can become somewhat slow especially on slow disks, but that

Generally I find that the stats are very fast because everything is in cache, and the disk doesn't come into it at all. Are you on an OS besides Linux, or on a machine with low memory?

> otherwise git scales fairly well and has good locality, and that it's
> easy to reason about what operations are global and avoid them.
> So this git-reset behavior was surprising.

Yeah, git is generally very good about touching only the pieces of data you need to complete the current operation. But I think the decision was made long ago that "update-index --refresh" was not too expensive to do it in most porcelain-ish commands, especially since the results are much better (e.g., more accurately indicating modified files after a reset).

> assume-unchanged seems like it would add a lot of work when merging.
Yeah, Junio's autorefresh suggestion is much better.
-Peff
Previous: Joey HessNext: Joey Hess
Message 10 of 17 in “speed of git reset -- file”
  1. Joey HessMay 31, 2011
  2. Jeff KingMay 31, 2011
  3. Junio C HamanoMay 31, 2011
  4. Jeff KingMay 31, 2011
  5. Matthieu MoyMay 31, 2011
  6. Nguyen Thai Ngoc DuyJun 1, 2011
  7. Junio C HamanoMay 31, 2011
  8. Jeff KingJun 1, 2011
  9. Joey HessJun 1, 2011
  10. Jeff KingJun 1, 2011
  11. Joey HessJun 1, 2011
  12. Jeff KingJun 1, 2011
  13. Joey HessJun 1, 2011
  14. Jeff KingJun 2, 2011
  15. Joey HessJun 2, 2011
  16. Joey HessJun 2, 2011
  17. Junio C HamanoJun 1, 2011

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.