summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-01-17 08:43:13 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-01-19 23:04:23 (GMT)
commit4e1a7baa2e466afded9ff50b9a4539b24dbd3584 (patch)
tree72d6c05f17fd3039908bd85e24510ca384a4c688
parent688cd6d2b9335f2ac20d02996215a0e6da1779b5 (diff)
downloadgit-4e1a7baa2e466afded9ff50b9a4539b24dbd3584.zip
git-4e1a7baa2e466afded9ff50b9a4539b24dbd3584.tar.gz
git-4e1a7baa2e466afded9ff50b9a4539b24dbd3584.tar.bz2
rm: only refresh entries that we may touch
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>
-rw-r--r--builtin-rm.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/builtin-rm.c b/builtin-rm.c
index 57975db..f3772c8 100644
--- a/builtin-rm.c
+++ b/builtin-rm.c
@@ -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 */;