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

Re: [PATCH 01/20] sparse-index: design doc and format update

From
Elijah Newren <newren@gmail.com>
Date
Feb 24, 2021, 01:13 UTC
Message-ID
<CABPp-BHwRHhYE3BPxCG+fRFWf2dCZ60rnO=ykztquKoOp_x_QQ@mail.gmail.com>
In-Reply-To
<daa9a6bcefbce977606484d502f5cfd7fca63ecc.1614111270.git.gitgitgadget@gmail.com>

On Tue, Feb 23, 2021 at 12:14 PM Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com> wrote:

Show 94 quoted lines
>
> From: Derrick Stolee <dstolee@microsoft.com>
>
> This begins a long effort to update the index format to allow sparse
> directory entries. This should result in a significant improvement to
> Git commands when HEAD contains millions of files, but the user has
> selected many fewer files to keep in their sparse-checkout definition.
>
> Currently, the index format is only updated in the presence of
> extensions.sparseIndex instead of increasing a file format version
> number. This is temporary, and index v5 is part of the plan for future
> work in this area.
>
> The design document details many of the reasons for embarking on this
> work, and also the plan for completing it safely.
>
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
>  Documentation/technical/index-format.txt |   7 +
>  Documentation/technical/sparse-index.txt | 167 +++++++++++++++++++++++
>  2 files changed, 174 insertions(+)
>  create mode 100644 Documentation/technical/sparse-index.txt
>
> diff --git a/Documentation/technical/index-format.txt b/Documentation/technical/index-format.txt
> index b633482b1bdf..387126582556 100644
> --- a/Documentation/technical/index-format.txt
> +++ b/Documentation/technical/index-format.txt
> @@ -44,6 +44,13 @@ Git index format
>    localization, no special casing of directory separator '/'). Entries
>    with the same name are sorted by their stage field.
>
> +  An index entry typically represents a file. However, if sparse-checkout
> +  is enabled in cone mode (`core.sparseCheckoutCone` is enabled) and the
> +  `extensions.sparseIndex` extension is enabled, then the index may
> +  contain entries for directories outside of the sparse-checkout definition.
> +  These entries have mode `0040000`, include the `SKIP_WORKTREE` bit, and
> +  the path ends in a directory separator.
> +
>    32-bit ctime seconds, the last time a file's metadata changed
>      this is stat(2) data
>
> diff --git a/Documentation/technical/sparse-index.txt b/Documentation/technical/sparse-index.txt
> new file mode 100644
> index 000000000000..9070836f0655
> --- /dev/null
> +++ b/Documentation/technical/sparse-index.txt
> @@ -0,0 +1,167 @@
> +Git Sparse-Index Design Document
> +================================
> +
> +The sparse-checkout feature allows users to focus a working directory on
> +a subset of the files at HEAD. The cone mode patterns, enabled by
> +`core.sparseCheckoutCone`, allow for very fast pattern matching to
> +discover which files at HEAD belong in the sparse-checkout cone.
> +
> +Three important scale dimensions for a Git worktree are:
> +
> +* `HEAD`: How many files are present at `HEAD`?
> +
> +* Populated: How many files are within the sparse-checkout cone.
> +
> +* Modified: How many files has the user modified in the working directory?
> +
> +We will use big-O notation -- O(X) -- to denote how expensive certain
> +operations are in terms of these dimensions.
> +
> +These dimensions are ordered by their magnitude: users (typically) modify
> +fewer files than are populated, and we can only populate files at `HEAD`.
> +These dimensions are also ordered by how expensive they are per item: it
> +is expensive to detect a modified file than it is to write one that we
> +know must be populated; changing `HEAD` only really requires updating the
> +index.
> +
> +Problems occur if there is an extreme imbalance in these dimensions. For
> +example, if `HEAD` contains millions of paths but the populated set has
> +only tens of thousands, then commands like `git status` and `git add` can
> +be dominated by operations that require O(`HEAD`) operations instead of
> +O(Populated). Primarily, the cost is in parsing and rewriting the index,
> +which is filled primarily with files at `HEAD` that are marked with the
> +`SKIP_WORKTREE` bit.
> +
> +The sparse-index intends to take these commands that read and modify the
> +index from O(`HEAD`) to O(Populated). To do this, we need to modify the
> +index format in a significant way: add "sparse directory" entries.
> +
> +With cone mode patterns, it is possible to detect when an entire
> +directory will have its contents outside of the sparse-checkout definition.
> +Instead of listing all of the files it contains as individual entries, a
> +sparse-index contains an entry with the directory name, referencing the
> +object ID of the tree at `HEAD` and marked with the `SKIP_WORKTREE` bit.
> +If we need to discover the details for paths within that directory, we
> +can parse trees to find that list.
> +
> +This addition of sparse-directory entries violates expectations about the

Violates current expectations, yes. Documentation tends to live a long time, and I suspect that 2-3 years from now reading this sentence might be jarring since we'll have modified the code to have an updated set of expectations. Maybe a simple "As of time of writing, ..." at the beginning of the sentence here? Or maybe I'm just being overly worried...

Show 25 quoted lines
> +index format and its in-memory data structure. There are many consumers in
> +the codebase that expect to iterate through all of the index entries and
> +see only files. In addition, they expect to see all files at `HEAD`. One
> +way to handle this is to parse trees to replace a sparse-directory entry
> +with all of the files within that tree as the index is loaded. However,
> +parsing trees is slower than parsing the index format, so that is a slower
> +operation than if we left the index alone.
> +
> +The implementation plan below follows four phases to slowly integrate with
> +the sparse-index. The intention is to incrementally update Git commands to
> +interact safely with the sparse-index without significant slowdowns. This
> +may not always be possible, but the hope is that the primary commands that
> +users need in their daily work are dramatically improved.
> +
> +Phase I: Format and initial speedups
> +------------------------------------
> +
> +During this phase, Git learns to enable the sparse-index and safely parse
> +one. Protections are put in place so that every consumer of the in-memory
> +data structure can operate with its current assumption of every file at
> +`HEAD`.
> +
> +At first, every index parse will expand the sparse-directory entries into
> +the full list of paths at `HEAD`. This will be slower in all cases. The
> +only noticable change in behavior will be that the serialized index file
noticeable
Show 26 quoted lines
> +contains sparse-directory entries.
> +
> +To start, we use a new repository extension, `extensions.sparseIndex`, to
> +allow inserting sparse-directory entries into indexes with file format
> +versions 2, 3, and 4. This prevents Git versions that do not understand
> +the sparse-index from operating on one, but it also prevents other
> +operations that do not use the index at all. A new format, index v5, will
> +be introduced that includes sparse-directory entries by default. It might
> +also introduce other features that have been considered for improving the
> +index, as well.
> +
> +Next, consumers of the index will be guarded against operating on a
> +sparse-index by inserting calls to `ensure_full_index()` or
> +`expand_index_to_path()`. After these guards are in place, we can begin
> +leaving sparse-directory entries in the in-memory index structure.
> +
> +Even after inserting these guards, we will keep expanding sparse-indexes
> +for most Git commands using the `command_requires_full_index` repository
> +setting. This setting will be on by default and disabled one builtin at a
> +time until we have sufficient confidence that all of the index operations
> +are properly guarded.
> +
> +To complete this phase, the commands `git status` and `git add` will be
> +integrated with the sparse-index so that they operate with O(Populated)
> +performance. They will be carefully tested for operations within and
> +outside the sparse-checkout definition.

Good plan so far, but there's something else bugging me a little here. One thing we noticed with our usage of `sparse-checkout` is that although unimportant _tracked_ files go away, leftover build files and other untracked files stick around. So, although 'git status' shouldn't have to check the tracked files anymore, it is still going to have to look at each of the *untracked* files and compare to .gitignore files in order to correctly classify each file as ignored or just plain untracked. Our `sparsify` tool has for a long time tried to warn about such files when changing the sparsity patterns/modules and had an --remove-old-ignores option for clearing out ignored files that are found within directories that are sparse (Meaning the directories where all files under them are marked SKIP_WORKTREE.). I was never sure whether a warning was enough, or if pushing that option more made sense, but about a month ago my colleagues made the tool just auto-invoke that option from other sparsify invocations. To my knowledge, there have been no complaints about that being automatically turned on; but there were complaints/confusion before about the directories being left around. (Of course, non-ignored files are still left around by that option.)

I'm worried that since sparse-checkout doesn't do anything to help
with all these untracked/ignored files, we might not get all the
performance improvements we want from a `git status` with sparse
directories.  We'll be dropping from walking O(2*HEAD) files (1 source
+ 1 object file) down to O(HEAD) files (just the object files) rather
than actually getting down to O(Populated).
Show 20 quoted lines
> +
> +Phase II: Careful integrations
> +------------------------------
> +
> +This phase focuses on ensuring that all index extensions and APIs work
> +well with a sparse-index. This requires significant increases to our test
> +coverage, especially for operations that interact with the working
> +directory outside of the sparse-checkout definition. Some of these
> +behaviors may not be the desirable ones, such as some tests already
> +marked for failure in `t1092-sparse-checkout-compatibility.sh`.
> +
> +The index extensions that may require special integrations are:
> +
> +* FS Monitor
> +* Untracked cache
> +
> +While integrating with these features, we should look for patterns that
> +might lead to better APIs for interacting with the index. Coalescing
> +common usage patterns into an API call can reduce the number of places
> +where sparse-directories need to be handled carefully.
Makes sense.
Show 16 quoted lines
> +Phase III: Important command speedups
> +-------------------------------------
> +
> +At this point, the patterns for testing and implementing sparse-directory
> +logic should be relatively stable. This phase focuses on updating some of
> +the most common builtins that use the index to operate as O(Populated).
> +Here is a potential list of commands that could be valuable to integrate
> +at this point:
> +
> +* `git commit`
> +* `git checkout`
> +* `git merge`
> +* `git rebase`
> +
> +Along with `git status` and `git add`, these commands cover the majority
> +of users' interactions with the working directory.
Sounds like a good plan as well.

I hope we get to make this specific to the merge-ort backend. It localizes the index-related code to (a) a call to unpack_trees() called from checkout-like code (which would probably automatically be handled by your updates to git checkout), and (b) a single function named record_conflicted_index_entries(). I feel it should be pretty easy to update.

In contrast, the idea of attempting to update merge-recursive with this kind of change sounds overwhelming.

Show 10 quoted lines
>  In addition, we can
> +integrate with these commands:
> +
> +* `git grep`
> +* `git rm`
> +
> +These have been proposed as some whose behavior could change when in a
> +repo with a sparse-checkout definition. It would be good to include this
> +behavior automatically when using a sparse-index. Some clarity is needed
> +to make the behavior switch clear to the user.

Is this leftover from before recent events? I think this portion of the document should just be stricken.

I argued about how these were buggy as-is due SKIP_WORKTREE always having been an incomplete implementation of an idea at [1], but didn't hear a further response from you. I'm curious if you disagreed with my reasoning, or it just slipped through the cracks in a busy schedule and this portion of the document was leftover from before. In my opinion, both commands are just buggy and should be fixed for general sparse-checkout usage cases, not just for sparse-index.

As for git grep, it has options for searching the working tree (default) OR searching the index (--cached) OR searching an old commit (passing a REVISION). But never some combination or more than one of these. The fact that it combined some in the cases of SKIP_WORKTREE entries looks entirely like a bug to me. For the same reasons I argued that --untracked and --cached are incompatible[2], we shouldn't be combining results from searching the working tree and searching the index. Luckily, this fix has already been submitted[3] and picked up in mt/grep-sparse-checkout and is marked in the cooking emails as "Will merge to next".

As for git rm, I'll quote from my email to Matheus:

"""As far as the longer term discussion about making git rm configurable... _If_ it comes up again in the future, I will argue that if git rm should have configuration to delete paths outside the sparsity specification, then git add should have configuration to add paths outside the sparsity specification that happen to be present despite being SKIP_WORKTREE, that git diff with no revision arguments (nor --cached) should have configuration to diff against paths that are SKIP_WORKTREE but happen to be present, that git status should have configuration to report on changes to paths that are SKIP_WORKTREE but happen to be present, that git checkout should have configuration to write files to the working tree despite matching sparsity paths, etc. And I'll argue that you do ALL of those or you're being inconsistent. I hope that people see these are actually all the same request and that it is horribly inconsistent to do some of these and not others, and that at least by the time I get to mentioning checkout that they realize it's a crazy request. We should just tell users to extend their sparsity if they want the working copy (and commands that interact with the working copy) to handle the additional paths. Maybe I'm just really biased, but I don't see how this makes sense. I would argue more about it, but no one has responded. My plan was to just fix the default behavior, and then see if anyone ever actually cared enough to come back and ask for more configurability."""

Also, for rm, Matheus has already submitted the fix[4], though at Junio's request he separated out some fixes for git-add as a separate preliminary series[5] and then will resubmit the other `add` and `rm` fixes.

[1] https://lore.kernel.org/git/CABPp-BHwNoVnooqDFPAsZxBT9aR5Dwk5D9sDRCvYSb8akxAJgA@mail.gmail.com/ [2] https://lore.kernel.org/git/xmqqtuql0yfp.fsf@gitster.c.googlers.com/ [3] https://lore.kernel.org/git/5f3f7ac77039d41d1692ceae4b0c5df3bb45b74a.1612901326.git.matheus.bernardino@usp.br/ [4] https://lore.kernel.org/git/61a77cd5f45ba02c7dff4b7932abdebb17c1667f.1613593946.git.matheus.bernardino@usp.br/ [5] https://lore.kernel.org/git/cover.1614037664.git.matheus.bernardino@usp.br/

Anyway, that's a long way of saying I think this section of your document is already obsolete. (Which is a good thing -- less work to do to get sparse-index working. Thanks, Matheus!).

Show 22 quoted lines
> +This phase is the first where parallel work might be possible without too
> +much conflicts between topics.
> +
> +Phase IV: The long tail
> +-----------------------
> +
> +This last phase is less a "phase" and more "the new normal" after all of
> +the previous work.
> +
> +To start, the `command_requires_full_index` option could be removed in
> +favor of expanding only when hitting an API guard.
> +
> +There are many Git commands that could use special attention to operate as
> +O(Populated), while some might be so rare that it is acceptable to leave
> +them with additional overhead when a sparse-index is present.
> +
> +Here are some commands that might be useful to update:
> +
> +* `git sparse-checkout set`
> +* `git am`
> +* `git clean`
> +* `git stash`

Oh, man, git stash is definitely in need of work. It's still a minimalistic transliteration of shell to C, complete with lots of process forking and piping output between various low-level commands. It might be interesting to rewrite this in terms of the merge machinery, though its separate stashing of staged stuff, unstaged stuff, and possibly untracked stuff means that there is a sequence of two or three merges needed and interesting failure handling to do if those merges fail, especially if the user uses --index. But I digress...

Anyway, overall, very nicely written and planned out. Thanks for taking the time to write this all up.

Previous: Derrick Stolee via GitGitGadgetNext: Derrick Stolee
Message 3 of 203 in “Sparse Index: Design, Format, Tests”
  1. 00/20 Sparse Index: Design, Format, TestsDerrick Stolee via GitGitGadget, Feb 23, 2021
  2. 01/20 sparse-index: design doc and format updateDerrick Stolee via GitGitGadget, Feb 23, 2021
  3. Elijah NewrenFeb 24, 2021
  4. Derrick StoleeFeb 25, 2021
  5. Elijah NewrenFeb 25, 2021
  6. 03/20 t1092: clean up script quotingDerrick Stolee via GitGitGadget, Feb 23, 2021
  7. 02/20 t/perf: add performance test for sparse operationsDerrick Stolee via GitGitGadget, Feb 23, 2021
  8. Elijah NewrenFeb 24, 2021
  9. Derrick StoleeMar 9, 2021
  10. 04/20 sparse-index: add guard to ensure full indexDerrick Stolee via GitGitGadget, Feb 23, 2021
  11. Elijah NewrenFeb 24, 2021
  12. 05/20 sparse-index: implement ensure_full_index()Derrick Stolee via GitGitGadget, Feb 23, 2021
  13. Elijah NewrenFeb 24, 2021
  14. 14/20 sparse-index: check index conversion happensDerrick Stolee via GitGitGadget, Feb 23, 2021
  15. 16/20 sparse-checkout: toggle sparse index from builtinDerrick Stolee via GitGitGadget, Feb 23, 2021
  16. Martin ÅgrenFeb 24, 2021
  17. Derrick StoleeMar 9, 2021
  18. Elijah NewrenMar 9, 2021
  19. Derrick StoleeMar 9, 2021
  20. Elijah NewrenMar 9, 2021
  21. Martin ÅgrenMar 14, 2021
  22. Derrick StoleeMar 15, 2021
  23. 07/20 test-read-cache: print cache entries with --tableDerrick Stolee via GitGitGadget, Feb 23, 2021
  24. Elijah NewrenFeb 25, 2021
  25. Derrick StoleeMar 9, 2021
  26. 06/20 t1092: compare sparse-checkout to sparse-indexDerrick Stolee via GitGitGadget, Feb 23, 2021
  27. Elijah NewrenFeb 25, 2021
  28. 11/20 sparse-index: convert from full to sparseDerrick Stolee via GitGitGadget, Feb 23, 2021
  29. Elijah NewrenFeb 25, 2021
  30. Derrick StoleeMar 9, 2021
  31. 10/20 sparse-checkout: hold pattern list in indexDerrick Stolee via GitGitGadget, Feb 23, 2021
  32. Elijah NewrenFeb 25, 2021
  33. 09/20 unpack-trees: ensure full indexDerrick Stolee via GitGitGadget, Feb 23, 2021
  34. 08/20 test-tool: don't force full indexDerrick Stolee via GitGitGadget, Feb 23, 2021
  35. 13/20 unpack-trees: allow sparse directoriesDerrick Stolee via GitGitGadget, Feb 23, 2021
  36. Elijah NewrenFeb 25, 2021
  37. Derrick StoleeMar 9, 2021
  38. Elijah NewrenMar 9, 2021
  39. 12/20 submodule: sparse-index should not collapse linksDerrick Stolee via GitGitGadget, Feb 23, 2021
  40. 15/20 sparse-index: create extension for compatibilityDerrick Stolee via GitGitGadget, Feb 23, 2021
  41. Elijah NewrenFeb 25, 2021
  42. Derrick StoleeMar 9, 2021
  43. 17/20 sparse-checkout: disable sparse-indexDerrick Stolee via GitGitGadget, Feb 23, 2021
  44. SZEDER GáborFeb 27, 2021
  45. Derrick StoleeMar 9, 2021
  46. Derrick StoleeMar 10, 2021
  47. 18/20 cache-tree: integrate with sparse directory entriesDerrick Stolee via GitGitGadget, Feb 23, 2021
  48. 20/20 p2000: add sparse-index reposDerrick Stolee via GitGitGadget, Feb 23, 2021
  49. 19/20 sparse-index: loose integration with cache_tree_verify()Derrick Stolee via GitGitGadget, Feb 23, 2021
  50. Elijah NewrenFeb 23, 2021
  51. Elijah NewrenFeb 26, 2021
  52. 00/20 Sparse Index: Design, Format, TestsDerrick Stolee via GitGitGadget, Mar 10, 2021
  53. 01/20 sparse-index: design doc and format updateDerrick Stolee via GitGitGadget, Mar 10, 2021
  54. Elijah NewrenMar 10, 2021
  55. 02/20 t/perf: add performance test for sparse operationsDerrick Stolee via GitGitGadget, Mar 10, 2021
  56. 05/20 sparse-index: implement ensure_full_index()Derrick Stolee via GitGitGadget, Mar 10, 2021
  57. Junio C HamanoMar 12, 2021
  58. Derrick StoleeMar 12, 2021
  59. Junio C HamanoMar 12, 2021
  60. Derrick StoleeMar 12, 2021
  61. Ævar Arnfjörð BjarmasonMar 15, 2021
  62. 04/20 sparse-index: add guard to ensure full indexDerrick Stolee via GitGitGadget, Mar 10, 2021
  63. 03/20 t1092: clean up script quotingDerrick Stolee via GitGitGadget, Mar 10, 2021
  64. 06/20 t1092: compare sparse-checkout to sparse-indexDerrick Stolee via GitGitGadget, Mar 10, 2021
  65. Elijah NewrenMar 10, 2021
  66. Derrick StoleeMar 11, 2021
  67. 07/20 test-read-cache: print cache entries with --tableDerrick Stolee via GitGitGadget, Mar 10, 2021
  68. 14/20 sparse-index: check index conversion happensDerrick Stolee via GitGitGadget, Mar 10, 2021
  69. 08/20 test-tool: don't force full indexDerrick Stolee via GitGitGadget, Mar 10, 2021
  70. 12/20 submodule: sparse-index should not collapse linksDerrick Stolee via GitGitGadget, Mar 10, 2021
  71. 13/20 unpack-trees: allow sparse directoriesDerrick Stolee via GitGitGadget, Mar 10, 2021
  72. 11/20 sparse-index: convert from full to sparseDerrick Stolee via GitGitGadget, Mar 10, 2021
  73. Elijah NewrenMar 10, 2021
  74. Derrick StoleeMar 11, 2021
  75. 09/20 unpack-trees: ensure full indexDerrick Stolee via GitGitGadget, Mar 10, 2021
  76. 15/20 sparse-index: create extension for compatibilityDerrick Stolee via GitGitGadget, Mar 10, 2021
  77. 19/20 sparse-index: loose integration with cache_tree_verify()Derrick Stolee via GitGitGadget, Mar 10, 2021
  78. 10/20 sparse-checkout: hold pattern list in indexDerrick Stolee via GitGitGadget, Mar 10, 2021
  79. 17/20 sparse-checkout: disable sparse-indexDerrick Stolee via GitGitGadget, Mar 10, 2021
  80. 18/20 cache-tree: integrate with sparse directory entriesDerrick Stolee via GitGitGadget, Mar 10, 2021
  81. 20/20 p2000: add sparse-index reposDerrick Stolee via GitGitGadget, Mar 10, 2021
  82. 16/20 sparse-checkout: toggle sparse index from builtinDerrick Stolee via GitGitGadget, Mar 10, 2021
  83. Elijah NewrenMar 11, 2021
  84. 00/20 Sparse Index: Design, Format, TestsDerrick Stolee via GitGitGadget, Mar 16, 2021
  85. 01/20 sparse-index: design doc and format updateDerrick Stolee via GitGitGadget, Mar 16, 2021
  86. Junio C HamanoMar 19, 2021
  87. Derrick StoleeMar 23, 2021
  88. Junio C HamanoMar 23, 2021
  89. Derrick StoleeMar 23, 2021
  90. 03/20 t1092: clean up script quotingDerrick Stolee via GitGitGadget, Mar 16, 2021
  91. Ævar Arnfjörð BjarmasonMar 17, 2021
  92. 02/20 t/perf: add performance test for sparse operationsDerrick Stolee via GitGitGadget, Mar 16, 2021
  93. Ævar Arnfjörð BjarmasonMar 17, 2021
  94. Derrick StoleeMar 17, 2021
  95. Ævar Arnfjörð BjarmasonMar 17, 2021
  96. Derrick StoleeMar 17, 2021
  97. 08/20 test-tool: don't force full indexDerrick Stolee via GitGitGadget, Mar 16, 2021
  98. 06/20 t1092: compare sparse-checkout to sparse-indexDerrick Stolee via GitGitGadget, Mar 16, 2021
  99. 04/20 sparse-index: add guard to ensure full indexDerrick Stolee via GitGitGadget, Mar 16, 2021
  100. 09/20 unpack-trees: ensure full indexDerrick Stolee via GitGitGadget, Mar 16, 2021
  101. 07/20 test-read-cache: print cache entries with --tableDerrick Stolee via GitGitGadget, Mar 16, 2021
  102. 1/5 ls-files: defer read_index() after parse_options() etc.Ævar Arnfjörð Bjarmason, Mar 17, 2021
  103. 2/5 ls-files: make "mode" in show_ce() loop a variableÆvar Arnfjörð Bjarmason, Mar 17, 2021
  104. Elijah NewrenMar 17, 2021
  105. Ævar Arnfjörð BjarmasonMar 24, 2021
  106. 3/5 ls-files: add and use a new --sparse optionÆvar Arnfjörð Bjarmason, Mar 17, 2021
  107. Elijah NewrenMar 17, 2021
  108. Ævar Arnfjörð BjarmasonMar 17, 2021
  109. Elijah NewrenMar 17, 2021
  110. Derrick StoleeMar 17, 2021
  111. Ævar Arnfjörð BjarmasonMar 24, 2021
  112. 4/5 test-tool read-cache: --table is redundant to ls-filesÆvar Arnfjörð Bjarmason, Mar 17, 2021
  113. 0/5 Re: [PATCH v3 07/20] test-read-cache: print cache entries with --tableÆvar Arnfjörð Bjarmason, Mar 17, 2021
  114. Elijah NewrenMar 17, 2021
  115. Derrick StoleeMar 17, 2021
  116. Elijah NewrenMar 17, 2021
  117. Derrick StoleeMar 17, 2021
  118. 5/5 test-tool: split up test-tool read-cacheÆvar Arnfjörð Bjarmason, Mar 17, 2021
  119. Ævar Arnfjörð BjarmasonMar 17, 2021
  120. 05/20 sparse-index: implement ensure_full_index()Derrick Stolee via GitGitGadget, Mar 16, 2021
  121. Ævar Arnfjörð BjarmasonMar 17, 2021
  122. 13/20 unpack-trees: allow sparse directoriesDerrick Stolee via GitGitGadget, Mar 16, 2021
  123. Ævar Arnfjörð BjarmasonMar 17, 2021
  124. 12/20 submodule: sparse-index should not collapse linksDerrick Stolee via GitGitGadget, Mar 16, 2021
  125. 10/20 sparse-checkout: hold pattern list in indexDerrick Stolee via GitGitGadget, Mar 16, 2021
  126. 11/20 sparse-index: convert from full to sparseDerrick Stolee via GitGitGadget, Mar 16, 2021
  127. Ævar Arnfjörð BjarmasonMar 17, 2021
  128. Derrick StoleeMar 17, 2021
  129. Derrick StoleeMar 18, 2021
  130. 14/20 sparse-index: check index conversion happensDerrick Stolee via GitGitGadget, Mar 16, 2021
  131. 15/20 sparse-index: create extension for compatibilityDerrick Stolee via GitGitGadget, Mar 16, 2021
  132. 17/20 sparse-checkout: disable sparse-indexDerrick Stolee via GitGitGadget, Mar 16, 2021
  133. 16/20 sparse-checkout: toggle sparse index from builtinDerrick Stolee via GitGitGadget, Mar 16, 2021
  134. 18/20 cache-tree: integrate with sparse directory entriesDerrick Stolee via GitGitGadget, Mar 16, 2021
  135. 19/20 sparse-index: loose integration with cache_tree_verify()Derrick Stolee via GitGitGadget, Mar 16, 2021
  136. 20/20 p2000: add sparse-index reposDerrick Stolee via GitGitGadget, Mar 16, 2021
  137. Derrick StoleeMar 16, 2021
  138. Elijah NewrenMar 16, 2021
  139. Junio C HamanoMar 18, 2021
  140. Derrick StoleeMar 19, 2021
  141. 00/20 Sparse Index: Design, Format, TestsDerrick Stolee via GitGitGadget, Mar 23, 2021
  142. 01/20 sparse-index: design doc and format updateDerrick Stolee via GitGitGadget, Mar 23, 2021
  143. SZEDER GáborMar 26, 2021
  144. Junio C HamanoMar 28, 2021
  145. Derrick StoleeMar 29, 2021
  146. 05/20 sparse-index: implement ensure_full_index()Derrick Stolee via GitGitGadget, Mar 23, 2021
  147. 04/20 sparse-index: add guard to ensure full indexDerrick Stolee via GitGitGadget, Mar 23, 2021
  148. 03/20 t1092: clean up script quotingDerrick Stolee via GitGitGadget, Mar 23, 2021
  149. 02/20 t/perf: add performance test for sparse operationsDerrick Stolee via GitGitGadget, Mar 23, 2021
  150. 10/20 sparse-checkout: hold pattern list in indexDerrick Stolee via GitGitGadget, Mar 23, 2021
  151. 07/20 test-read-cache: print cache entries with --tableDerrick Stolee via GitGitGadget, Mar 23, 2021
  152. Ævar Arnfjörð BjarmasonMar 24, 2021
  153. Derrick StoleeMar 24, 2021
  154. Ævar Arnfjörð BjarmasonMar 25, 2021
  155. Elijah NewrenMar 26, 2021
  156. Ævar Arnfjörð BjarmasonMar 28, 2021
  157. Derrick StoleeMar 29, 2021
  158. Junio C HamanoMar 29, 2021
  159. Derrick StoleeMar 30, 2021
  160. Ævar Arnfjörð BjarmasonMar 29, 2021
  161. Derrick StoleeMar 30, 2021
  162. Elijah NewrenMar 29, 2021
  163. 08/20 test-tool: don't force full indexDerrick Stolee via GitGitGadget, Mar 23, 2021
  164. 09/20 unpack-trees: ensure full indexDerrick Stolee via GitGitGadget, Mar 23, 2021
  165. 12/20 submodule: sparse-index should not collapse linksDerrick Stolee via GitGitGadget, Mar 23, 2021
  166. 06/20 t1092: compare sparse-checkout to sparse-indexDerrick Stolee via GitGitGadget, Mar 23, 2021
  167. 13/20 unpack-trees: allow sparse directoriesDerrick Stolee via GitGitGadget, Mar 23, 2021
  168. 11/20 sparse-index: convert from full to sparseDerrick Stolee via GitGitGadget, Mar 23, 2021
  169. 18/20 cache-tree: integrate with sparse directory entriesDerrick Stolee via GitGitGadget, Mar 23, 2021
  170. 15/20 sparse-index: create extension for compatibilityDerrick Stolee via GitGitGadget, Mar 23, 2021
  171. 16/20 sparse-checkout: toggle sparse index from builtinDerrick Stolee via GitGitGadget, Mar 23, 2021
  172. 14/20 sparse-index: check index conversion happensDerrick Stolee via GitGitGadget, Mar 23, 2021
  173. 17/20 sparse-checkout: disable sparse-indexDerrick Stolee via GitGitGadget, Mar 23, 2021
  174. 19/20 sparse-index: loose integration with cache_tree_verify()Derrick Stolee via GitGitGadget, Mar 23, 2021
  175. 20/20 p2000: add sparse-index reposDerrick Stolee via GitGitGadget, Mar 23, 2021
  176. Elijah NewrenMar 23, 2021
  177. 00/21 Sparse Index: Design, Format, TestsDerrick Stolee via GitGitGadget, Mar 30, 2021
  178. 09/21 unpack-trees: ensure full indexDerrick Stolee via GitGitGadget, Mar 30, 2021
  179. 01/21 sparse-index: design doc and format updateDerrick Stolee via GitGitGadget, Mar 30, 2021
  180. 05/21 sparse-index: implement ensure_full_index()Derrick Stolee via GitGitGadget, Mar 30, 2021
  181. 08/21 test-tool: don't force full indexDerrick Stolee via GitGitGadget, Mar 30, 2021
  182. 06/21 t1092: compare sparse-checkout to sparse-indexDerrick Stolee via GitGitGadget, Mar 30, 2021
  183. 04/21 sparse-index: add guard to ensure full indexDerrick Stolee via GitGitGadget, Mar 30, 2021
  184. 10/21 sparse-checkout: hold pattern list in indexDerrick Stolee via GitGitGadget, Mar 30, 2021
  185. 02/21 t/perf: add performance test for sparse operationsDerrick Stolee via GitGitGadget, Mar 30, 2021
  186. 13/21 submodule: sparse-index should not collapse linksDerrick Stolee via GitGitGadget, Mar 30, 2021
  187. 15/21 sparse-index: check index conversion happensDerrick Stolee via GitGitGadget, Mar 30, 2021
  188. 16/21 sparse-index: add index.sparse config optionDerrick Stolee via GitGitGadget, Mar 30, 2021
  189. 17/21 sparse-checkout: toggle sparse index from builtinDerrick Stolee via GitGitGadget, Mar 30, 2021
  190. 03/21 t1092: clean up script quotingDerrick Stolee via GitGitGadget, Mar 30, 2021
  191. 07/21 test-read-cache: print cache entries with --tableDerrick Stolee via GitGitGadget, Mar 30, 2021
  192. 11/21 sparse-index: add 'sdir' index extensionDerrick Stolee via GitGitGadget, Mar 30, 2021
  193. 20/21 sparse-index: loose integration with cache_tree_verify()Derrick Stolee via GitGitGadget, Mar 30, 2021
  194. 14/21 unpack-trees: allow sparse directoriesDerrick Stolee via GitGitGadget, Mar 30, 2021
  195. 12/21 sparse-index: convert from full to sparseDerrick Stolee via GitGitGadget, Mar 30, 2021
  196. 21/21 p2000: add sparse-index reposDerrick Stolee via GitGitGadget, Mar 30, 2021
  197. 18/21 sparse-checkout: disable sparse-indexDerrick Stolee via GitGitGadget, Mar 30, 2021
  198. 19/21 cache-tree: integrate with sparse directory entriesDerrick Stolee via GitGitGadget, Mar 30, 2021
  199. Junio C HamanoMar 30, 2021
  200. Derrick StoleeMar 30, 2021
  201. Junio C HamanoMar 30, 2021
  202. Elijah NewrenApr 1, 2021
  203. Elijah NewrenApr 1, 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.