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

[PATCH v2 0/8] Sparse-index: integrate with status

From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Date
Apr 23, 2021, 21:34 UTC
Message-ID
<pull.932.v2.git.1619213665.gitgitgadget@gmail.com>
In-Reply-To
<pull.932.git.1618322497.gitgitgadget@gmail.com>

This is the first "payoff" series in the sparse-index work. It makes 'git status' very fast when a sparse-index is enabled on a repository with cone-mode sparse-checkout (and a small populated set).

This is based on ds/sparse-index-protections AND mt/add-rm-sparse-checkout. The latter branch is needed because it changes the behavior of 'git add' around sparse entries, which changes the expectations of a test added in patch 1.

The approach here is to audit the places where ensure_full_index() pops up while doing normal commands with pathspecs within the sparse-checkout definition. Each of these are checked and tested. In the end, the sparse-index is integrated with these features:

 * git status
 * FS Monitor index extension.

The performance tests in p2000-sparse-operations.sh improve by 95% or more, even when compared with the full-index cases, not just the sparse-index cases that previously had extra overhead.

Hopefully this is the first example of how ds/sparse-index-protections has done the basic work to do these conversions safely, making them look easier than they seemed when starting this adventure.

Thanks, -Stolee

Updates in V2 =============

 * Based on the feedback, it is clear that 'git add' will require much more
   careful testing and thought. I'm splitting it out of this series and it
   will return with a follow-up.
 * Test cases are improved, both in coverage and organization.
 * The previous "unpack-trees: make sparse aware" patch is split into three
   now.
 * Stale messages based on an old implementation of the "protections" topic
   are now fixed.
 * Performance tests were re-run.
Derrick Stolee (8):
  t1092: add tests for status/add and sparse files
  unpack-trees: preserve cache_bottom
  unpack-trees: compare sparse directories correctly
  unpack-trees: stop recursing into sparse directories
  dir.c: accept a directory as part of cone-mode patterns
  status: skip sparse-checkout percentage with sparse-index
  status: use sparse-index throughout
  fsmonitor: test with sparse index
 builtin/commit.c                         |  3 ++
 dir.c                                    | 11 +++++
 read-cache.c                             | 10 +++-
 t/t1092-sparse-checkout-compatibility.sh | 61 ++++++++++++++++++++++--
 t/t7519-status-fsmonitor.sh              | 48 +++++++++++++++++++
 unpack-trees.c                           | 25 ++++++++--
 wt-status.c                              | 14 ++++--
 wt-status.h                              |  1 +
 8 files changed, 161 insertions(+), 12 deletions(-)
base-commit: f723f370c89ad61f4f40aabfd3540b1ce19c00e5
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-932%2Fderrickstolee%2Fsparse-index%2Fstatus-and-add-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-932/derrickstolee/sparse-index/status-and-add-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/932
Range-diff vs v1:
  1:  b2cb5401eff8 !  1:  3bac9edae7d8 t1092: add tests for status/add and sparse files
     @@ Commit message
          Untracked files are fine: adding new files both with 'git add .' and
          'git add folder1/' works just as in a full checkout. This may not be
          entirely desirable, but we are not intending to change behavior at the
     -    moment, only document it.
     +    moment, only document it. A future change could alter the behavior to
     +    be more sensible, and this test could be modified to satisfy the new
     +    expected behavior.
      
          Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
      
     @@ t/t1092-sparse-checkout-compatibility.sh: test_expect_success 'add, commit, chec
      +	# This "git add folder1/a" is completely ignored
      +	# by the sparse-checkout repos. It causes the
      +	# full repo to have a different staged environment.
     -+	test_must_fail git -C sparse-checkout add folder1/a &&
     -+	test_must_fail git -C sparse-index add folder1/a &&
     ++	#
     ++	# This is not a desirable behavior, but this test
     ++	# ensures that the sparse-index is not the cause
     ++	# of a behavior change.
     ++	test_sparse_match test_must_fail git add folder1/a &&
     ++	test_sparse_match test_must_fail git add --refresh folder1/a &&
      +	git -C full-checkout checkout HEAD -- folder1/a &&
     -+	test_sparse_match git status --porcelain=v2 &&
     ++	test_all_match git status --porcelain=v2 &&
      +
      +	test_all_match git add . &&
      +	test_all_match git status --porcelain=v2 &&
  -:  ------------ >  2:  19344394379d unpack-trees: preserve cache_bottom
  -:  ------------ >  3:  24e71d8c0622 unpack-trees: compare sparse directories correctly
  2:  0a3892d2ec9e !  4:  d3c8948d0a33 unpack-trees: make sparse aware
     @@ Metadata
      Author: Derrick Stolee <dstolee@microsoft.com>
      
       ## Commit message ##
     -    unpack-trees: make sparse aware
     +    unpack-trees: stop recursing into sparse directories
      
     -    As a first step to integrate 'git status' and 'git add' with the sparse
     -    index, we must start integrating unpack_trees() with sparse directory
     -    entries. These changes are currently impossible to trigger because
     -    unpack_trees() calls ensure_full_index() if command_requires_full_index
     -    is true. This is the case for all commands at the moment. As we expand
     -    more commands to be sparse-aware, we might find that more changes are
     -    required to unpack_trees(). The current changes will suffice for
     -    'status' and 'add'.
     +    When walking trees using traverse_trees_recursive() and
     +    unpack_callback(), we must not attempt to walk into a sparse directory
     +    entry. There are no index entries within that directory to compare to
     +    the tree object at that position, so skip over the entries of that tree.
      
     -    unpack_trees() calls the traverse_trees() API using unpack_callback()
     -    to decide if we should recurse into a subtree. We must add new abilities
     -    to skip a subtree if it corresponds to a sparse directory entry.
     -
     -    It is important to be careful about the trailing directory separator
     -    that exists in the sparse directory entries but not in the subtree
     -    paths.
     +    This code is used in many places, so the only way to test it is to start
     +    removing the command_requres_full_index option from one builtin at a
     +    time and carefully test that its use of unpack_trees() behaves correctly
     +    with a sparse-index. Such tests will be added by later changes.
      
          Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
      
     - ## dir.h ##
     -@@ dir.h: static inline int ce_path_match(struct index_state *istate,
     - 				char *seen)
     - {
     - 	return match_pathspec(istate, pathspec, ce->name, ce_namelen(ce), 0, seen,
     --			      S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode));
     -+			      S_ISSPARSEDIR(ce->ce_mode) || S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode));
     - }
     - 
     - static inline int dir_path_match(struct index_state *istate,
     -
     - ## preload-index.c ##
     -@@ preload-index.c: static void *preload_thread(void *_data)
     - 			continue;
     - 		if (S_ISGITLINK(ce->ce_mode))
     - 			continue;
     -+		if (S_ISSPARSEDIR(ce->ce_mode))
     -+			continue;
     - 		if (ce_uptodate(ce))
     - 			continue;
     - 		if (ce_skip_worktree(ce))
     -
     - ## read-cache.c ##
     -@@ read-cache.c: int refresh_index(struct index_state *istate, unsigned int flags,
     - 		if (ignore_skip_worktree && ce_skip_worktree(ce))
     - 			continue;
     - 
     -+		if (istate->sparse_index && S_ISSPARSEDIR(ce->ce_mode))
     -+			continue;
     -+
     - 		if (pathspec && !ce_path_match(istate, ce, pathspec, seen))
     - 			filtered = 1;
     - 
     -
       ## unpack-trees.c ##
     -@@ unpack-trees.c: static void mark_ce_used(struct cache_entry *ce, struct unpack_trees_options *o)
     - {
     - 	ce->ce_flags |= CE_UNPACKED;
     - 
     -+	/*
     -+	 * If this is a sparse directory, don't advance cache_bottom.
     -+	 * That will be advanced later using the cache-tree data.
     -+	 */
     -+	if (S_ISSPARSEDIR(ce->ce_mode))
     -+		return;
     -+
     - 	if (o->cache_bottom < o->src_index->cache_nr &&
     - 	    o->src_index->cache[o->cache_bottom] == ce) {
     - 		int bottom = o->cache_bottom;
     -@@ unpack-trees.c: static int do_compare_entry(const struct cache_entry *ce,
     - 	ce_len -= pathlen;
     - 	ce_name = ce->name + pathlen;
     - 
     -+	/* remove directory separator if a sparse directory entry */
     -+	if (S_ISSPARSEDIR(ce->ce_mode))
     -+		ce_len--;
     - 	return df_name_compare(ce_name, ce_len, S_IFREG, name, namelen, mode);
     - }
     - 
     -@@ unpack-trees.c: static int compare_entry(const struct cache_entry *ce, const struct traverse_inf
     - 	if (cmp)
     - 		return cmp;
     - 
     -+	/* If ce is a sparse directory, then allow equality here. */
     -+	if (S_ISSPARSEDIR(ce->ce_mode))
     -+		return 0;
     -+
     - 	/*
     - 	 * Even if the beginning compared identically, the ce should
     - 	 * compare as bigger than a directory leading up to it!
      @@ unpack-trees.c: static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
       	struct cache_entry *src[MAX_UNPACK_TREES + 1] = { NULL, };
       	struct unpack_trees_options *o = info->data;
       	const struct name_entry *p = names;
     -+	unsigned recurse = 1;
     ++	unsigned unpack_tree = 1;
       
       	/* Find first entry with a real name (we could use "mask" too) */
       	while (!p->mode)
     @@ unpack-trees.c: static int unpack_callback(int n, unsigned long mask, unsigned l
       				src[0] = ce;
      +
      +				if (S_ISSPARSEDIR(ce->ce_mode))
     -+					recurse = 0;
     ++					unpack_tree = 0;
       			}
       			break;
       		}
       	}
       
      -	if (unpack_nondirectories(n, mask, dirmask, src, names, info) < 0)
     -+	if (recurse &&
     ++	if (unpack_tree &&
      +	    unpack_nondirectories(n, mask, dirmask, src, names, info) < 0)
       		return -1;
       
     @@ unpack-trees.c: static int unpack_callback(int n, unsigned long mask, unsigned l
       		}
       
      -		if (traverse_trees_recursive(n, dirmask, mask & ~dirmask,
     -+		if (recurse &&
     ++		if (unpack_tree &&
      +		    traverse_trees_recursive(n, dirmask, mask & ~dirmask,
       					     names, info) < 0)
       			return -1;
  3:  28ca717e6526 !  5:  fd96b71968b6 dir.c: accept a directory as part of cone-mode patterns
     @@ dir.c: enum pattern_match_result path_matches_pattern_list(
       	strbuf_addch(&parent_pathname, '/');
       	strbuf_add(&parent_pathname, pathname, pathlen);
       
     -+	/* Directory requests should be added as if they are a file */
     -+	if (parent_pathname.len > 1 &&
     ++	/*
     ++	 * Directory entries are matched if and only if a file
     ++	 * contained immediately within them is matched. For the
     ++	 * case of a directory entry, modify the path to create
     ++	 * a fake filename within this directory, allowing us to
     ++	 * use the file-base matching logic in an equivalent way.
     ++	 */
     ++	if (parent_pathname.len > 0 &&
      +	    parent_pathname.buf[parent_pathname.len - 1] == '/')
      +		strbuf_add(&parent_pathname, "-", 1);
      +
  4:  e86f874dd412 =  6:  1f4ba56e7416 status: skip sparse-checkout percentage with sparse-index
  5:  d7d4cad8be0b !  7:  3d09368c0541 status: use sparse-index throughout
     @@ Commit message
          implementation details are already integrated with sparse-checkout, so
          modify command_requires_full_index to be zero for cmd_status().
      
     -    By running the debugger for 'git status -uno' after that change, we find
     -    two instances of ensure_full_index() that were added for extra safety,
     -    but can be removed without issue.
     +    In refresh_index(), we loop through the index entries to refresh their
     +    stat() information. However, sparse directories have no stat()
     +    information to populate. Ignore these entries.
      
     -    In refresh_index(), we loop through the index entries. The
     -    refresh_cache_ent() method copies the sparse directories into the
     -    refreshed index without issue.
     +    This allows 'git status' to no longer expand a sparse index to a full
     +    one. This is further tested by dropping the "-uno" option and adding an
     +    untracked file into the worktree.
      
     -    The loop within run_diff_files() skips things that are in stage 0 and
     -    have skip-worktree enabled, so seems safe to disable ensure_full_index()
     -    here.
     -
     -    This allows some cases of 'git status' to no longer expand a sparse
     -    index to a full one, giving the following performance improvements for
     -    p2000-sparse-checkout-operations.sh:
     +    The performance test p2000-sparse-checkout-operations.sh demonstrates
     +    these improvements:
      
          Test                                  HEAD~1           HEAD
          -----------------------------------------------------------------------------
     -    2000.2: git status (full-index-v3)    0.38(0.36+0.07)  0.37(0.31+0.10) -2.6%
     -    2000.3: git status (full-index-v4)    0.38(0.29+0.12)  0.37(0.30+0.11) -2.6%
     -    2000.4: git status (sparse-index-v3)  2.43(2.33+0.14)  0.04(0.05+0.04) -98.4%
     -    2000.5: git status (sparse-index-v4)  2.44(2.35+0.13)  0.05(0.04+0.07) -98.0%
     +    2000.2: git status (full-index-v3)    0.31(0.30+0.05)  0.31(0.29+0.06) +0.0%
     +    2000.3: git status (full-index-v4)    0.31(0.29+0.07)  0.34(0.30+0.08) +9.7%
     +    2000.4: git status (sparse-index-v3)  2.35(2.28+0.10)  0.04(0.04+0.05) -98.3%
     +    2000.5: git status (sparse-index-v4)  2.35(2.24+0.15)  0.05(0.04+0.06) -97.9%
      
          Note that since HEAD~1 was expanding the sparse index by parsing trees,
          it was artificially slower than the full index case. Thus, the 98%
     -    improvement is misleading, and instead we should celebrate the 0.37s to
     -    0.05s improvement of 82%. This is more indicative of the peformance
     +    improvement is misleading, and instead we should celebrate the 0.34s to
     +    0.05s improvement of 85%. This is more indicative of the peformance
          gains we are expecting by using a sparse index.
      
          Note: we are dropping the assignment of core.fsmonitor here. This is not
     @@ read-cache.c: int refresh_index(struct index_state *istate, unsigned int flags,
       	trace2_region_enter("index", "refresh", NULL);
      -	/* TODO: audit for interaction with sparse-index. */
      -	ensure_full_index(istate);
     ++
       	for (i = 0; i < istate->cache_nr; i++) {
       		struct cache_entry *ce, *new_entry;
       		int cache_errno = 0;
     +@@ read-cache.c: int refresh_index(struct index_state *istate, unsigned int flags,
     + 		if (ignore_skip_worktree && ce_skip_worktree(ce))
     + 			continue;
     + 
     ++		/*
     ++		 * If this entry is a sparse directory, then there isn't
     ++		 * any stat() information to update. Ignore the entry.
     ++		 */
     ++		if (S_ISSPARSEDIR(ce->ce_mode))
     ++			continue;
     ++
     + 		if (pathspec && !ce_path_match(istate, ce, pathspec, seen))
     + 			filtered = 1;
     + 
      
       ## t/t1092-sparse-checkout-compatibility.sh ##
      @@ t/t1092-sparse-checkout-compatibility.sh: test_expect_success 'sparse-index is expanded and converted back' '
     @@ t/t1092-sparse-checkout-compatibility.sh: test_expect_success 'sparse-index is e
      +	init_repos &&
      +
      +	rm -f trace2.txt &&
     ++	echo >>sparse-index/untracked.txt &&
       	GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
      -		git -C sparse-index -c core.fsmonitor="" status -uno &&
      -	test_region index ensure_full_index trace2.txt
     -+		git -C sparse-index status -uno &&
     ++		git -C sparse-index status &&
      +	test_region ! index ensure_full_index trace2.txt
       '
       
  6:  434306541613 <  -:  ------------ dir: use expand_to_path() for sparse directories
  7:  f1a9ce4ef0e5 <  -:  ------------ add: allow operating on a sparse-only index
  8:  6d7f30f2b90a <  -:  ------------ pathspec: stop calling ensure_full_index
  9:  75199bbe8ca1 <  -:  ------------ t7519: add sparse directories to FS monitor tests
 10:  9d1183ddd280 !  8:  1fd033a6ebb2 fsmonitor: test with sparse index
     @@ t/t7519-status-fsmonitor.sh: test_expect_success 'status succeeds after staging/
       	)
       '
       
     -+test_expect_success 'status succeeds with sparse index' '
     -+	test_config core.fsmonitor "$TEST_DIRECTORY/t7519/fsmonitor-all" &&
     ++# Usage:
     ++# check_sparse_index_behavior [!]
     ++# If "!" is supplied, then we verify that we do not call ensure_full_index
     ++# during a call to 'git status'. Otherwise, we verify that we _do_ call it.
     ++check_sparse_index_behavior () {
      +	git status --porcelain=v2 >expect &&
      +	git sparse-checkout init --cone --sparse-index &&
     ++	git sparse-checkout set dir1 dir2 &&
      +	GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
      +		git status --porcelain=v2 >actual &&
     -+	test_region ! index ensure_full_index trace2.txt &&
     ++	test_region $1 index ensure_full_index trace2.txt &&
      +	test_cmp expect actual &&
      +	rm trace2.txt &&
     ++	git sparse-checkout disable
     ++}
     ++
     ++test_expect_success 'status succeeds with sparse index' '
     ++	git reset --hard &&
     ++
     ++	test_config core.fsmonitor "$TEST_DIRECTORY/t7519/fsmonitor-all" &&
     ++	check_sparse_index_behavior ! &&
      +
      +	write_script .git/hooks/fsmonitor-test<<-\EOF &&
      +		printf "last_update_token\0"
      +	EOF
      +	git config core.fsmonitor .git/hooks/fsmonitor-test &&
     -+	git status --porcelain=v2 >expect &&
     -+	git sparse-checkout init --cone --sparse-index &&
     -+	GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
     -+		git status --porcelain=v2 >actual &&
     -+	test_region ! index ensure_full_index trace2.txt &&
     -+	test_cmp expect actual &&
     -+	rm trace2.txt &&
     ++	check_sparse_index_behavior ! &&
      +
      +	write_script .git/hooks/fsmonitor-test<<-\EOF &&
      +		printf "last_update_token\0"
      +		printf "dir1/modified\0"
      +	EOF
     -+	git config core.fsmonitor .git/hooks/fsmonitor-test &&
     -+	git status --porcelain=v2 >expect &&
     -+	git sparse-checkout init --cone --sparse-index &&
     -+	GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
     -+		git status --porcelain=v2 >actual &&
     -+	test_region ! index ensure_full_index trace2.txt &&
     -+	test_cmp expect actual &&
     ++	check_sparse_index_behavior ! &&
      +
     ++	cp -r dir1 dir1a &&
     ++	git add dir1a &&
     ++	git commit -m "add dir1a" &&
     ++
     ++	# This one modifies outside the sparse-checkout definition
     ++	# and hence we expect to expand the sparse-index.
      +	write_script .git/hooks/fsmonitor-test<<-\EOF &&
      +		printf "last_update_token\0"
      +		printf "dir1a/modified\0"
      +	EOF
     -+	git config core.fsmonitor .git/hooks/fsmonitor-test &&
     -+	git status --porcelain=v2 >expect &&
     -+	git sparse-checkout init --cone --sparse-index &&
     -+	GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
     -+		git status --porcelain=v2 >actual &&
     -+	test_region index ensure_full_index trace2.txt &&
     -+	test_cmp expect actual
     ++	check_sparse_index_behavior
      +'
      +
       test_done
-- 
gitgitgadget
Previous: Derrick StoleeNext: Derrick Stolee via GitGitGadget
Message 39 of 215 in “Sparse-index: integrate with status and add”
  1. 00/10 Sparse-index: integrate with status and addDerrick Stolee via GitGitGadget, Apr 13, 2021
  2. 02/10 unpack-trees: make sparse awareDerrick Stolee via GitGitGadget, Apr 13, 2021
  3. Elijah NewrenApr 20, 2021
  4. Derrick StoleeApr 21, 2021
  5. Elijah NewrenApr 21, 2021
  6. Matheus Tavares BernardinoApr 22, 2021
  7. Derrick StoleeApr 21, 2021
  8. Matheus Tavares BernardinoApr 21, 2021
  9. Elijah NewrenApr 21, 2021
  10. Matheus Tavares BernardinoApr 21, 2021
  11. Elijah NewrenApr 21, 2021
  12. Derrick StoleeApr 23, 2021
  13. 01/10 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, Apr 13, 2021
  14. Elijah NewrenApr 20, 2021
  15. Derrick StoleeApr 21, 2021
  16. Matheus Tavares BernardinoApr 21, 2021
  17. Derrick StoleeApr 23, 2021
  18. 05/10 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, Apr 13, 2021
  19. Elijah NewrenApr 21, 2021
  20. Derrick StoleeApr 21, 2021
  21. 04/10 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, Apr 13, 2021
  22. Elijah NewrenApr 20, 2021
  23. Derrick StoleeApr 21, 2021
  24. 03/10 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, Apr 13, 2021
  25. Elijah NewrenApr 20, 2021
  26. Derrick StoleeApr 21, 2021
  27. 10/10 fsmonitor: test with sparse indexDerrick Stolee via GitGitGadget, Apr 13, 2021
  28. Elijah NewrenApr 21, 2021
  29. 07/10 add: allow operating on a sparse-only indexDerrick Stolee via GitGitGadget, Apr 13, 2021
  30. 08/10 pathspec: stop calling ensure_full_indexDerrick Stolee via GitGitGadget, Apr 13, 2021
  31. Elijah NewrenApr 21, 2021
  32. 09/10 t7519: add sparse directories to FS monitor testsDerrick Stolee via GitGitGadget, Apr 13, 2021
  33. 06/10 dir: use expand_to_path() for sparse directoriesDerrick Stolee via GitGitGadget, Apr 13, 2021
  34. Elijah NewrenApr 21, 2021
  35. Elijah NewrenApr 21, 2021
  36. Derrick StoleeApr 21, 2021
  37. Matheus Tavares BernardinoApr 13, 2021
  38. Derrick StoleeApr 14, 2021
  39. 0/8 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, Apr 23, 2021
  40. 1/8 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, Apr 23, 2021
  41. Matheus Tavares BernardinoMay 13, 2021
  42. Derrick StoleeMay 14, 2021
  43. 2/8 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, Apr 23, 2021
  44. 3/8 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, Apr 23, 2021
  45. Elijah NewrenMay 13, 2021
  46. 6/8 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, Apr 23, 2021
  47. 4/8 unpack-trees: stop recursing into sparse directoriesDerrick Stolee via GitGitGadget, Apr 23, 2021
  48. Elijah NewrenMay 13, 2021
  49. 5/8 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, Apr 23, 2021
  50. 7/8 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, Apr 23, 2021
  51. 8/8 fsmonitor: test with sparse indexDerrick Stolee via GitGitGadget, Apr 23, 2021
  52. Elijah NewrenMay 13, 2021
  53. Derrick StoleeMay 14, 2021
  54. 00/12 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, May 14, 2021
  55. 02/12 sparse-index: include EXTENDED flag when expandingDerrick Stolee via GitGitGadget, May 14, 2021
  56. Elijah NewrenMay 18, 2021
  57. Derrick StoleeMay 18, 2021
  58. Elijah NewrenMay 18, 2021
  59. Derrick StoleeMay 18, 2021
  60. 01/12 sparse-index: skip indexes with unmerged entriesDerrick Stolee via GitGitGadget, May 14, 2021
  61. 03/12 t1092: expand repository data shapeDerrick Stolee via GitGitGadget, May 14, 2021
  62. Elijah NewrenMay 18, 2021
  63. Derrick StoleeMay 18, 2021
  64. 04/12 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, May 14, 2021
  65. 05/12 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, May 14, 2021
  66. 07/12 unpack-trees: stop recursing into sparse directoriesDerrick Stolee via GitGitGadget, May 14, 2021
  67. Elijah NewrenMay 18, 2021
  68. Elijah NewrenMay 18, 2021
  69. Derrick StoleeMay 18, 2021
  70. 06/12 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, May 14, 2021
  71. 09/12 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, May 14, 2021
  72. 10/12 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, May 14, 2021
  73. 11/12 wt-status: expand added sparse directory entriesDerrick Stolee via GitGitGadget, May 14, 2021
  74. Elijah NewrenMay 18, 2021
  75. Derrick StoleeMay 18, 2021
  76. Derrick StoleeMay 18, 2021
  77. Elijah NewrenMay 19, 2021
  78. 12/12 fsmonitor: integrate with sparse indexDerrick Stolee via GitGitGadget, May 14, 2021
  79. 08/12 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, May 14, 2021
  80. 00/12 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, May 21, 2021
  81. 01/12 sparse-index: skip indexes with unmerged entriesDerrick Stolee via GitGitGadget, May 21, 2021
  82. 03/12 t1092: expand repository data shapeDerrick Stolee via GitGitGadget, May 21, 2021
  83. 02/12 sparse-index: include EXTENDED flag when expandingDerrick Stolee via GitGitGadget, May 21, 2021
  84. 04/12 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, May 21, 2021
  85. 05/12 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, May 21, 2021
  86. 06/12 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, May 21, 2021
  87. 07/12 unpack-trees: be careful around sparse directory entriesDerrick Stolee via GitGitGadget, May 21, 2021
  88. Derrick StoleeMay 28, 2021
  89. 08/12 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, May 21, 2021
  90. 09/12 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, May 21, 2021
  91. 10/12 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, May 21, 2021
  92. 11/12 wt-status: expand added sparse directory entriesDerrick Stolee via GitGitGadget, May 21, 2021
  93. 12/12 fsmonitor: integrate with sparse indexDerrick Stolee via GitGitGadget, May 21, 2021
  94. 00/14 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, Jun 7, 2021
  95. 09/14 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, Jun 7, 2021
  96. 01/14 sparse-index: skip indexes with unmerged entriesDerrick Stolee via GitGitGadget, Jun 7, 2021
  97. 07/14 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, Jun 7, 2021
  98. 08/14 unpack-trees: unpack sparse directory entriesDerrick Stolee via GitGitGadget, Jun 7, 2021
  99. Elijah NewrenJun 9, 2021
  100. Derrick StoleeJun 9, 2021
  101. 11/14 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, Jun 7, 2021
  102. 05/14 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, Jun 7, 2021
  103. 12/14 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, Jun 7, 2021
  104. 03/14 t1092: replace incorrect 'echo' with 'cat'Derrick Stolee via GitGitGadget, Jun 7, 2021
  105. Elijah NewrenJun 8, 2021
  106. 06/14 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, Jun 7, 2021
  107. 14/14 fsmonitor: integrate with sparse indexDerrick Stolee via GitGitGadget, Jun 7, 2021
  108. 02/14 sparse-index: include EXTENDED flag when expandingDerrick Stolee via GitGitGadget, Jun 7, 2021
  109. Elijah NewrenJun 8, 2021
  110. Derrick StoleeJun 9, 2021
  111. Elijah NewrenJun 9, 2021
  112. 04/14 t1092: expand repository data shapeDerrick Stolee via GitGitGadget, Jun 7, 2021
  113. 10/14 diff-lib: handle index diffs with sparse dirsDerrick Stolee via GitGitGadget, Jun 7, 2021
  114. Derrick StoleeJun 7, 2021
  115. Junio C HamanoJun 8, 2021
  116. Derrick StoleeJun 8, 2021
  117. Elijah NewrenJun 9, 2021
  118. Junio C HamanoJun 9, 2021
  119. Elijah NewrenJun 9, 2021
  120. Derrick StoleeJun 9, 2021
  121. Derrick StoleeJun 10, 2021
  122. Elijah NewrenJun 10, 2021
  123. Derrick StoleeJun 11, 2021
  124. Derrick StoleeJun 11, 2021
  125. 13/14 wt-status: expand added sparse directory entriesDerrick Stolee via GitGitGadget, Jun 7, 2021
  126. Elijah NewrenJun 9, 2021
  127. Derrick StoleeJun 9, 2021
  128. 00/14 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, Jun 29, 2021
  129. 01/14 sparse-index: skip indexes with unmerged entriesDerrick Stolee via GitGitGadget, Jun 29, 2021
  130. 02/14 sparse-index: include EXTENDED flag when expandingDerrick Stolee via GitGitGadget, Jun 29, 2021
  131. 03/14 t1092: replace incorrect 'echo' with 'cat'Derrick Stolee via GitGitGadget, Jun 29, 2021
  132. 04/14 t1092: expand repository data shapeDerrick Stolee via GitGitGadget, Jun 29, 2021
  133. 05/14 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, Jun 29, 2021
  134. 07/14 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, Jun 29, 2021
  135. 06/14 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, Jun 29, 2021
  136. 08/14 unpack-trees: unpack sparse directory entriesDerrick Stolee via GitGitGadget, Jun 29, 2021
  137. 09/14 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, Jun 29, 2021
  138. 10/14 diff-lib: handle index diffs with sparse dirsDerrick Stolee via GitGitGadget, Jun 29, 2021
  139. 11/14 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, Jun 29, 2021
  140. 13/14 wt-status: expand added sparse directory entriesDerrick Stolee via GitGitGadget, Jun 29, 2021
  141. 12/14 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, Jun 29, 2021
  142. 14/14 fsmonitor: integrate with sparse indexDerrick Stolee via GitGitGadget, Jun 29, 2021
  143. Derrick StoleeJun 29, 2021
  144. 00/16 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, Jun 29, 2021
  145. 01/16 sparse-index: skip indexes with unmerged entriesDerrick Stolee via GitGitGadget, Jun 29, 2021
  146. 02/16 sparse-index: include EXTENDED flag when expandingDerrick Stolee via GitGitGadget, Jun 29, 2021
  147. 03/16 t1092: replace incorrect 'echo' with 'cat'Derrick Stolee via GitGitGadget, Jun 29, 2021
  148. 04/16 t1092: expand repository data shapeDerrick Stolee via GitGitGadget, Jun 29, 2021
  149. 06/16 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, Jun 29, 2021
  150. 05/16 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, Jun 29, 2021
  151. 08/16 unpack-trees: rename unpack_nondirectories()Derrick Stolee via GitGitGadget, Jun 29, 2021
  152. 07/16 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, Jun 29, 2021
  153. 09/16 unpack-trees: unpack sparse directory entriesDerrick Stolee via GitGitGadget, Jun 29, 2021
  154. Elijah NewrenJul 7, 2021
  155. 11/16 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, Jun 29, 2021
  156. 10/16 unpack-trees: handle dir/file conflict of sparse entriesDerrick Stolee via GitGitGadget, Jun 29, 2021
  157. Elijah NewrenJul 7, 2021
  158. Elijah NewrenJul 9, 2021
  159. Derrick StoleeJul 12, 2021
  160. 12/16 diff-lib: handle index diffs with sparse dirsDerrick Stolee via GitGitGadget, Jun 29, 2021
  161. Elijah NewrenJul 8, 2021
  162. Elijah NewrenJul 8, 2021
  163. Derrick StoleeJul 12, 2021
  164. 13/16 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, Jun 29, 2021
  165. 15/16 wt-status: expand added sparse directory entriesDerrick Stolee via GitGitGadget, Jun 29, 2021
  166. Elijah NewrenJul 9, 2021
  167. Derrick StoleeJul 12, 2021
  168. Elijah NewrenJul 12, 2021
  169. Derrick StoleeJul 12, 2021
  170. 16/16 fsmonitor: integrate with sparse indexDerrick Stolee via GitGitGadget, Jun 29, 2021
  171. 14/16 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, Jun 29, 2021
  172. Derrick StoleeJun 29, 2021
  173. Elijah NewrenJun 30, 2021
  174. Elijah NewrenJul 9, 2021
  175. Derrick StoleeJul 12, 2021
  176. 00/15 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, Jul 12, 2021
  177. 01/15 sparse-index: skip indexes with unmerged entriesDerrick Stolee via GitGitGadget, Jul 12, 2021
  178. 02/15 sparse-index: include EXTENDED flag when expandingDerrick Stolee via GitGitGadget, Jul 12, 2021
  179. 03/15 t1092: replace incorrect 'echo' with 'cat'Derrick Stolee via GitGitGadget, Jul 12, 2021
  180. Bagas SanjayaJul 14, 2021
  181. 04/15 t1092: expand repository data shapeDerrick Stolee via GitGitGadget, Jul 12, 2021
  182. 05/15 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, Jul 12, 2021
  183. 07/15 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, Jul 12, 2021
  184. 06/15 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, Jul 12, 2021
  185. 08/15 unpack-trees: rename unpack_nondirectories()Derrick Stolee via GitGitGadget, Jul 12, 2021
  186. 09/15 unpack-trees: unpack sparse directory entriesDerrick Stolee via GitGitGadget, Jul 12, 2021
  187. 10/15 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, Jul 12, 2021
  188. 12/15 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, Jul 12, 2021
  189. 14/15 wt-status: expand added sparse directory entriesDerrick Stolee via GitGitGadget, Jul 12, 2021
  190. 15/15 fsmonitor: integrate with sparse indexDerrick Stolee via GitGitGadget, Jul 12, 2021
  191. 11/15 diff-lib: handle index diffs with sparse dirsDerrick Stolee via GitGitGadget, Jul 12, 2021
  192. 13/15 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, Jul 12, 2021
  193. Elijah NewrenJul 12, 2021
  194. Derrick StoleeJul 13, 2021
  195. Elijah NewrenJul 13, 2021
  196. 00/16 Sparse-index: integrate with statusDerrick Stolee via GitGitGadget, Jul 14, 2021
  197. 01/16 sparse-index: skip indexes with unmerged entriesDerrick Stolee via GitGitGadget, Jul 14, 2021
  198. 02/16 sparse-index: include EXTENDED flag when expandingDerrick Stolee via GitGitGadget, Jul 14, 2021
  199. 03/16 t1092: replace incorrect 'echo' with 'cat'Derrick Stolee via GitGitGadget, Jul 14, 2021
  200. 05/16 t1092: add tests for status/add and sparse filesDerrick Stolee via GitGitGadget, Jul 14, 2021
  201. 04/16 t1092: expand repository data shapeDerrick Stolee via GitGitGadget, Jul 14, 2021
  202. 06/16 unpack-trees: preserve cache_bottomDerrick Stolee via GitGitGadget, Jul 14, 2021
  203. 07/16 unpack-trees: compare sparse directories correctlyDerrick Stolee via GitGitGadget, Jul 14, 2021
  204. 08/16 unpack-trees: rename unpack_nondirectories()Derrick Stolee via GitGitGadget, Jul 14, 2021
  205. 09/16 unpack-trees: unpack sparse directory entriesDerrick Stolee via GitGitGadget, Jul 14, 2021
  206. 13/16 status: use sparse-index throughoutDerrick Stolee via GitGitGadget, Jul 14, 2021
  207. 14/16 wt-status: expand added sparse directory entriesDerrick Stolee via GitGitGadget, Jul 14, 2021
  208. 11/16 diff-lib: handle index diffs with sparse dirsDerrick Stolee via GitGitGadget, Jul 14, 2021
  209. 10/16 dir.c: accept a directory as part of cone-mode patternsDerrick Stolee via GitGitGadget, Jul 14, 2021
  210. 12/16 status: skip sparse-checkout percentage with sparse-indexDerrick Stolee via GitGitGadget, Jul 14, 2021
  211. 15/16 fsmonitor: integrate with sparse indexDerrick Stolee via GitGitGadget, Jul 14, 2021
  212. 16/16 t1092: document bad sparse-checkout behaviorDerrick Stolee via GitGitGadget, Jul 14, 2021
  213. Elijah NewrenJul 14, 2021
  214. Junio C HamanoJul 14, 2021
  215. Elijah NewrenJul 15, 2021

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.