Skip to content

Commit

Permalink
rm: only refresh entries that we may touch
Browse files Browse the repository at this point in the history
This gets rid of the whole tree cache refresh. Instead only path that
we touch will get refreshed. We may still lstat() more than needed,
but it'd be better playing safe.

This potentially reduces a large number of lstat() on big trees. Take
gentoo-x86 tree for example, which has roughly 80k files:

Unmodified Git:

$ time git rm --cached skel.ebuild
rm 'skel.ebuild'

real    0m1.441s
user    0m0.821s
sys     0m0.531s

Modified Git:

$ time ~/w/git/git rm --cached skel.ebuild
rm 'skel.ebuild'

real    0m0.941s
user    0m0.828s
sys     0m0.091s

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
pclouds authored and gitster committed Jan 19, 2010
1 parent 688cd6d commit 4e1a7ba
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion builtin-rm.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,10 @@ int cmd_rm(int argc, const char **argv, const char *prefix)

if (read_cache() < 0)
die("index file corrupt");
refresh_cache(REFRESH_QUIET);

pathspec = get_pathspec(prefix, argv);
refresh_index(&the_index, REFRESH_QUIET, pathspec, NULL, NULL);

seen = NULL;
for (i = 0; pathspec[i] ; i++)
/* nothing */;
Expand Down

0 comments on commit 4e1a7ba

Please sign in to comment.