Skip to content

Commit e213867

Browse files
Merge pull request #2224: unpack-trees: enable fscache for sparse-checkout
When updating the skip-worktree bits in the index to align with new values in a sparse-checkout file, Git scans the entire working directory with lstat() calls. In a sparse-checkout, many of these lstat() calls are for paths that do not exist. Enable the fscache feature during this scan. In a local test of a repo with ~2.2 million paths, updating the index with `git read-tree -m -u HEAD` with a sparse-checkout file containing only `/.gitattributes` improved from 2-3 minutes to 15-20 seconds. More work could be done to stop running lstat() calls when recursing into directories that are known to not exist.
2 parents d003d72 + f392fab commit e213867

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

unpack-trees.c

+2
Original file line numberDiff line numberDiff line change
@@ -1437,7 +1437,9 @@ static void mark_new_skip_worktree(struct exclude_list *el,
14371437
* 2. Widen worktree according to sparse-checkout file.
14381438
* Matched entries will have skip_wt_flag cleared (i.e. "in")
14391439
*/
1440+
enable_fscache(istate->cache_nr);
14401441
clear_ce_flags(istate, select_flag, skip_wt_flag, el);
1442+
disable_fscache();
14411443
}
14421444

14431445
static int verify_absent(const struct cache_entry *,

0 commit comments

Comments
 (0)