Skip-worktree entries are not on disk. There is no reason to call external grep in such cases. A trace message is also added to aid debugging external grep cases. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin-grep.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) diff --git a/builtin-grep.c b/builtin-grep.c index d582232..d49c637 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -488,17 +488,34 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached, read_cache(); #if !NO_EXTERNAL_GREP + if (cached) + external_grep_allowed = 0; + if (external_grep_allowed) { + for (nr = 0; nr < active_nr; nr++) { + struct cache_entry *ce = active_cache[nr]; + if (!S_ISREG(ce->ce_mode)) + continue; + if (!pathspec_matches(paths, ce->name, opt->max_depth)) + continue; + if (ce_skip_worktree(ce)) { + external_grep_allowed = 0; + break; + } + } + } /* * Use the external "grep" command for the case where * we grep through the checked-out files. It tends to * be a lot more optimized */ - if (!cached && external_grep_allowed) { + if (external_grep_allowed) { hit = external_grep(opt, paths, cached); if (hit >= 0) return hit; hit = 0; } + else + trace_printf("grep: external grep not used\n"); #endif for (nr = 0; nr < active_nr; nr++) { -- 1.6.6.315.g1a406 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html