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

Re: [PATCH 0/9] [RFC] New sparse-checkout builtin and "cone" mode

From
Derrick Stolee <stolee@gmail.com>
Date
Aug 22, 2019, 13:10 UTC
Message-ID
<08bd295b-ec5a-3128-42cf-acb24971d679@gmail.com>
In-Reply-To
<CABPp-BFcH5hQqujjmc88L3qGx3QAYZ_chH6PXQXyp13ipfV6hQ@mail.gmail.com>
On 8/21/2019 5:52 PM, Elijah Newren wrote:
Show 62 quoted lines
> On Tue, Aug 20, 2019 at 8:12 AM Derrick Stolee via GitGitGadget
> <gitgitgadget@gmail.com> wrote:
>>
>> This RFC includes a potential direction to make the sparse-checkout more
>> user-friendly. While there, I also present a way to use a limited set of
>> patterns to gain a significant performance boost in very large repositories.
>>
>> Sparse-checkout is only documented as a subsection of the read-tree docs
>> [1], which makes the feature hard to discover. Users have trouble navigating
>> the feature, especially at clone time [2], and have even resorted to
>> creating their own helper tools [3].
> 
> Ooh, intriguing.  Count me as another person who has resorted to
> making my own helper tool for others to use (specific to our internal
> repository, though, as it also figures out inter-module dependencies
> to allow specifying only a few modules of interest while still
> checking out everything needed to build those; but it'd be nice to
> need less scripting to handle the git-related bits to actually
> sparsify or densify).
> 
>> This RFC attempts to solve these problems using a new builtin. Here is a
>> sample workflow to give a feeling for how it can work:
>>
>> In an existing repo:
>>
>> $ git sparse-checkout init
>> $ ls
>> myFile1.txt myFile2.txt
>>
>> $ git sparse-checkout add
>> /myFolder/*
>> ^D
>> $ ls
>> myFile1.txt myFile2.txt myFolder
>> $ ls myFolder
>> a.c a.h
>> $ git sparse-checkout disable
>> $ ls
>> hiddenFolder myFile1.txt myFile2.txt myFolder
>>
>> At clone time:
>>
>> $ git clone --sparse origin repo
>> $ cd repo
>> $ ls
>> myFile1.txt myFile2.txt
>> $ git sparse-checkout add
>> /myFolder/*
>> ^D
>> $ ls
>> myFile1.txt myFile2.txt myFolder
>>
>> Here are some more specific details:
>>
>>  * git sparse-checkout init enables core.sparseCheckout and populates the
>>    sparse-checkout file with patterns that match only the files at root.
> 
> Does it enable core.sparseCheckout in the current worktree, or for all
> worktrees?  Do we require extensions.worktreeConfig to be set to true
> first?  If we don't require extensions.worktreeConfig to be set to
> true, and users add worktrees later, do they encounter negative
> surprises (immediately or later)?
This is an interesting scenario that I had not considered. Thanks!

My guess is that we should set `extensions.worktreeConfig=true` to avoid surprises. I'll need to play with this to discover the answers to these questions:

1. Where does the worktree look for the sparse-checkout file? Does
   each worktree have its own sparse-checkout file? Should it?
2. If I have `extensions.worktreeConfig=true` and `core.sparseCheckout=true`
   in the current worktree and run `git worktree add`, does the new worktree
   have `core.sparseCheckout=true`? Can we `git clone --sparse` and then
   start building sparse worktrees seamlessly?
 
Show 27 quoted lines
> worktrees in combination with sparseCheckouts were a headache here
> until I just forced people to manually first set
> extensions.worktreeConfig to true before using my 'sparsify' script,
> regardless of whether the user was currently using worktrees.  That
> fixed the issues, but having to provide a long error message and
> explanation of why I wanted users to set some special config first was
> slightly annoying.
> 
> I wonder if 'git worktree' and maybe even 'git config' should
> themselves have special handling for core.sparseCheckouts, because it
> can be a real mess otherwise.
> 
>>  * git clone learns the --sparse argument to run git sparse-checkout init
>>    before the first checkout.
> 
> Nice.
> 
>>  * git sparse-checkout add reads patterns from stdin, one per line, then
>>    adds them to the sparse-checkout file and refreshes the working
>>    directory.
> 
> The default of reading from stdin seems a bit unusual to me, and I
> worry about having to explain that to users.  I'd rather the add
> command took positional parameters (anything that doesn't start with a
> hyphen) and added those, e.g.
>   $ git sparse-checkout add '/myFolder/*' '
> with the option of the user specifying --stdin.

I had the same thought, and likely that's where we should go with the builtin. For our needs, the input over stdin is more important for testing, so I built it first. I will adjust the CLI here to take a set of paths over the arguments unless --stdin is given.

Show 11 quoted lines
>>  * git sparse-checkout disable removes the patterns from the sparse-checkout
>>    file, disables core.sparseCheckout, and refills the working directory.
> 
> Does it leave an empty sparse-checkout file around?  Also, what if
> users have several paths defining their sparse pattern, and want to
> temporarily get a full checkout and then come back -- do they need to
> re-specify all the paths?  (Maybe this *is* the route we want to go;
> I'm just trying to mention any possible negative effects we _might_
> run into so we can consider them.  It's not quite as relevant in my
> case since people specify a few toplevel modules and sparse-checkout
> gets several entries auto-generated for them.)

In this case, there is an intermediate step (that follows the existing advice) to modify the sparse-checkout file to contain only "/*\n" then run read-tree to fill the working directory before disabling the config setting.

Perhaps "disable" is the wrong word to use, as it makes you think that there should be an "enable" that can quickly toggle between the two modes. Maybe instead it should be "git sparse-checkout reset [empty|full]" where you could 'reset' the sparse-checkout to one of two initial states:

1. empty: only files at root are included.
2. full: all files are included.

In each case, we would obliterate the existing sparse-checkout entries, but hopefully that behavior is more clear from the command names.

Show 71 quoted lines
> Also, I'm particularly worried that a user with multiple worktrees,
> both sparse, could run 'git sparse-checkout disable' in one and then
> find that when they return to the other worktree they get a variety of
> nasty surprises (e.g. accidental staging or committing of the deletion
> of a huge number of files, random weird errors, or gradual and weird
> de-sparsifying as various git commands are run).  This, of course, can
> be averted by making sure core.sparseCheckout is set on a per-worktree
> basis, but that seems to be something people only do after running
> into problems several times unless some kind of tooling enforces it.
> 
>>  * git sparse-checkout list lists the contents of the sparse-checkout file.
>>
>>
>>
>> The documentation for the sparse-checkout feature can now live primarily
>> with the git-sparse-checkout documentation.
> 
> Yaay!
> 
>> Cone Mode
>> =========
>>
>> What really got me interested in this area is a performance problem. If we
>> have N patterns in the sparse-checkout file and M entries in the index, then
>> we can perform up to O(N * M) pattern checks in clear_ce_flags(). This
>> quadratic growth is not sustainable in a repo with 1,000+ patterns and
>> 1,000,000+ index entries.
> 
> This has worried me for a while, even if it hasn't yet caused us
> issues in practice.
> 
>> To solve this problem, I propose a new, more restrictive mode to
>> sparse-checkout: "cone mode". In this mode, all patterns are based on prefix
>> matches at a directory level. This can then use hashsets for fast
>> performance -- O(M) instead of O(N*M). My hashset implementation is based on
>> the virtual filesystem hook in the VFS for Git custom code [4].
> 
> Sweet!
> 
>> In cone mode, a user specifies a list of folders which the user wants every
>> file inside. In addition, the cone adds all blobs that are siblings of the
>> folders in the directory path to that folder. This makes the directories
>> look "hydrated" as a user drills down to those recursively-closed folders.
>> These directories are called "parent" folders, as a file matches them only
>> if the file's immediate parent is that directory.
>>
>> When building a prototype of this feature, I used a separate file to contain
>> the list of recursively-closed folders and built the hashsets dynamically
>> based on that file. In this implementation, I tried to maximize the amount
>> of backwards-compatibility by storing all data in the sparse-checkout file
>> using patterns recognized by earlier Git versions.
>>
>> For example, if we add A/B/C as a recursive folder, then we add the
>> following patterns to the sparse-checkout file:
>>
>> /*
>> !/*/*
>> /A/*
>> !/A/*/*
>> /A/B/*
>> !/A/B/*/*
>> /A/B/C/*
>>
>> The alternating positive/negative patterns say "include everything in this
>> folder, but exclude everything another level deeper". The final pattern has
>> no matching negation, so is a recursively closed pattern.
> 
> Oh, um, would there be any option for fast but without grabbing
> sibling and parent files of requested directories?  And could users
> still request individual files (not with regex or pathspec, but fully
> specifying the path) and still get the fast mode?

Exact files could probably be included and still be fast. It requires an extra hash check per entry, but that's a small price to pay I think.

With the sibling files, this is something I believe to be user-friendly: as a user drills down into the folder they included recursively, there may be helpful files along the way, like documentation, project files, etc.

Here is my philosophical position here: a repo can take advantage of the sparse-checkout feature if it is properly componetized. Those component boundaries are likely at folder boundaries. Any file that exists in a parent folder for two components is likely important to _both_ components. If a file is large and is not needed by both components, it should be placed deeper in the tree, so it can be avoided.

With that philosophy in mind, I designed this to help users fall into the "pit of success" when their repo is in a good shape AND to motivate users with repos in non-optimal shapes to reorganize.

The thought I had about exact file names is similar: if there is a large list of files in a folder where I only need a subset, then how do I know if a new file is added that I need? It will not show up in the directory without updating the sparse-checkout. A user would discover this need by something going wrong when they are not interacting with version control: a build.

This is particularly important with the root directory. We need things like .gitignore, .gitattributes, README, LICENSE, etc. to be populated by default. If there are too many files at root to reasonably work with the repo, then the repo should be reorganized using folders.

Show 7 quoted lines
> Basically, our sparse usage is exclusively specifying leading
> directories or full pathnames of individual files, but we really want
> the repo to feel smaller and make sure people notice at a glance.  We
> have a huge 'modules/' directory, and want people to be able to get
> just 15 of the 500 or so subdirectories that would appear in that
> directory with a non-sparse checkout.  And similarly we want to be
> able to grab just one or two files from a directory of many files.

Your modules/ example seems to work with the feature as designed, as you want a set of folders one level deeper. Grabbing one or two files from a directory is a direction we can go with the feature, but I will continue to believe that should be a rare occurrence compared to including a folder recursively.

Show 15 quoted lines
>> Note that I have some basic warnings to try and check that the
>> sparse-checkout file doesn't match what would be written by a cone-mode add.
>> In such a case, Git writes a warning to stderr and continues with the old
>> pattern matching algorithm. These checks are currently very barebones, and
>> would need to be updated with more robust checks for things like regex
>> characters in the middle of the pattern. As review moves forward (and if we
>> don't change the data storage) then we could spend more time on this.
> 
> Instead of trying to validate the sparse-checkout file everytime,
> perhaps we want to change core.sparseCheckout from a boolean to a
> tri-state or something where it specifies how to parse the
> sparse-checkout file?  Or maybe when special directive (some form of
> comment-looking line) appears at the top of sparse-checkout then we
> use the hashsets speedup while disallowing general regexes and
> pathspecs other than leading directories and full pathnames?

In this series, I turn `core.sparseCheckout` into a tri-state, and only try to validate the sparse-checkout when `core.sparseCheckout=cone`. This avoids spending time on the validation when someone is content using the existing feature.

The _intent_ of using the sparse-checkout file and no extra data structure was to let other clients (or an older client) read the sparse-checkout data and result in the same working directory. One thing I realized after submitting is that the tri-state config variable will cause old clients to error on parsing the non-boolean value. Instead, in v2 I will introduce a new boolean config variable "core.sparseCheckoutCone" that will do the same thing as the current series when `core.sparseCheckout=cone` and will fix this compat scenario.

> I'll try to get some time to look over these patches in the next few days.

I look forward to your feedback! I also have some feedback to respond to from my team [1], but I'm waiting to make sure the community likes the overall idea before jumping into code style and method organization details.

Thanks, -Stolee

[1] https://github.com/microsoft/git/pull/180
Previous: Elijah NewrenNext: Derrick Stolee
Message 27 of 196 in “[RFC] New sparse-checkout builtin and "cone" mode”
  1. 0/9 [RFC] New sparse-checkout builtin and "cone" modeDerrick Stolee via GitGitGadget, Aug 20, 2019
  2. 1/9 sparse-checkout: create builtin with 'list' subcommandDerrick Stolee via GitGitGadget, Aug 20, 2019
  3. Elijah NewrenAug 23, 2019
  4. 4/9 sparse-checkout: 'add' subcommandDerrick Stolee via GitGitGadget, Aug 20, 2019
  5. Elijah NewrenAug 23, 2019
  6. Derrick StoleeSep 18, 2019
  7. Elijah NewrenSep 18, 2019
  8. Derrick StoleeSep 18, 2019
  9. 2/9 sparse-checkout: create 'init' subcommandDerrick Stolee via GitGitGadget, Aug 20, 2019
  10. Elijah NewrenAug 23, 2019
  11. Derrick StoleeSep 11, 2019
  12. Derrick StoleeSep 11, 2019
  13. 3/9 clone: add --sparse modeDerrick Stolee via GitGitGadget, Aug 20, 2019
  14. Elijah NewrenAug 23, 2019
  15. Derrick StoleeSep 18, 2019
  16. 5/9 sparse-checkout: create 'disable' subcommandDerrick Stolee via GitGitGadget, Aug 20, 2019
  17. Elijah NewrenAug 23, 2019
  18. 6/9 trace2:experiment: clear_ce_flags_1Jeff Hostetler via GitGitGadget, Aug 20, 2019
  19. Elijah NewrenAug 24, 2019
  20. 9/9 sparse-checkout: init and add in cone modeDerrick Stolee via GitGitGadget, Aug 20, 2019
  21. Elijah NewrenAug 24, 2019
  22. 8/9 sparse-checkout: use hashmaps for cone patternsDerrick Stolee via GitGitGadget, Aug 20, 2019
  23. Elijah NewrenAug 24, 2019
  24. 7/9 sparse-checkout: add 'cone' modeDerrick Stolee via GitGitGadget, Aug 20, 2019
  25. Elijah NewrenAug 24, 2019
  26. Elijah NewrenAug 21, 2019
  27. Derrick StoleeAug 22, 2019
  28. Derrick StoleeAug 22, 2019
  29. Elijah NewrenAug 24, 2019
  30. Derrick StoleeAug 26, 2019
  31. Elijah NewrenAug 26, 2019
  32. Derrick StoleeAug 26, 2019
  33. Eric SunshineSep 2, 2019
  34. 00/11 New sparse-checkout builtin and "cone" modeDerrick Stolee via GitGitGadget, Sep 19, 2019
  35. 01/11 sparse-checkout: create builtin with 'list' subcommandDerrick Stolee via GitGitGadget, Sep 19, 2019
  36. Elijah NewrenOct 5, 2019
  37. 02/11 sparse-checkout: create 'init' subcommandDerrick Stolee via GitGitGadget, Sep 19, 2019
  38. Elijah NewrenOct 5, 2019
  39. 03/11 clone: add --sparse modeDerrick Stolee via GitGitGadget, Sep 19, 2019
  40. Elijah NewrenOct 5, 2019
  41. Derrick StoleeOct 7, 2019
  42. 05/11 sparse-checkout: add '--stdin' option to set subcommandDerrick Stolee via GitGitGadget, Sep 19, 2019
  43. 04/11 sparse-checkout: 'set' subcommandDerrick Stolee via GitGitGadget, Sep 19, 2019
  44. Elijah NewrenOct 5, 2019
  45. Elijah NewrenOct 6, 2019
  46. Derrick StoleeOct 7, 2019
  47. Elijah NewrenOct 11, 2019
  48. 07/11 trace2: add region in clear_ce_flagsJeff Hostetler via GitGitGadget, Sep 19, 2019
  49. Elijah NewrenOct 6, 2019
  50. 08/11 sparse-checkout: add 'cone' modeDerrick Stolee via GitGitGadget, Sep 19, 2019
  51. Elijah NewrenOct 6, 2019
  52. Derrick StoleeOct 7, 2019
  53. 09/11 sparse-checkout: use hashmaps for cone patternsDerrick Stolee via GitGitGadget, Sep 19, 2019
  54. Derrick StoleeSep 19, 2019
  55. Derrick StoleeSep 20, 2019
  56. 06/11 sparse-checkout: create 'disable' subcommandDerrick Stolee via GitGitGadget, Sep 19, 2019
  57. Elijah NewrenOct 6, 2019
  58. Derrick StoleeOct 7, 2019
  59. 11/11 unpack-trees: hash less in cone modeDerrick Stolee via GitGitGadget, Sep 19, 2019
  60. 10/11 sparse-checkout: init and set in cone modeDerrick Stolee via GitGitGadget, Sep 19, 2019
  61. Derrick StoleeOct 1, 2019
  62. Elijah NewrenOct 1, 2019
  63. Derrick StoleeOct 1, 2019
  64. Junio C HamanoOct 3, 2019
  65. 00/17 New sparse-checkout builtin and "cone" modeDerrick Stolee via GitGitGadget, Oct 7, 2019
  66. 01/17 sparse-checkout: create builtin with 'list' subcommandDerrick Stolee via GitGitGadget, Oct 7, 2019
  67. Elijah NewrenOct 11, 2019
  68. 03/17 clone: add --sparse modeDerrick Stolee via GitGitGadget, Oct 7, 2019
  69. Elijah NewrenOct 11, 2019
  70. 04/17 sparse-checkout: 'set' subcommandDerrick Stolee via GitGitGadget, Oct 7, 2019
  71. Elijah NewrenOct 11, 2019
  72. Elijah NewrenOct 11, 2019
  73. 06/17 sparse-checkout: create 'disable' subcommandDerrick Stolee via GitGitGadget, Oct 7, 2019
  74. 02/17 sparse-checkout: create 'init' subcommandDerrick Stolee via GitGitGadget, Oct 7, 2019
  75. Elijah NewrenOct 11, 2019
  76. Derrick StoleeOct 14, 2019
  77. 05/17 sparse-checkout: add '--stdin' option to set subcommandDerrick Stolee via GitGitGadget, Oct 7, 2019
  78. Elijah NewrenOct 11, 2019
  79. Derrick StoleeOct 14, 2019
  80. 09/17 sparse-checkout: use hashmaps for cone patternsDerrick Stolee via GitGitGadget, Oct 7, 2019
  81. 10/17 sparse-checkout: init and set in cone modeDerrick Stolee via GitGitGadget, Oct 7, 2019
  82. 07/17 trace2: add region in clear_ce_flagsJeff Hostetler via GitGitGadget, Oct 7, 2019
  83. 13/17 read-tree: show progress by defaultDerrick Stolee via GitGitGadget, Oct 7, 2019
  84. Elijah NewrenOct 12, 2019
  85. Derrick StoleeOct 14, 2019
  86. 11/17 unpack-trees: hash less in cone modeDerrick Stolee via GitGitGadget, Oct 7, 2019
  87. 08/17 sparse-checkout: add 'cone' modeDerrick Stolee via GitGitGadget, Oct 7, 2019
  88. 12/17 unpack-trees: add progress to clear_ce_flags()Derrick Stolee via GitGitGadget, Oct 7, 2019
  89. 15/17 sparse-checkout: update working directory in-processDerrick Stolee via GitGitGadget, Oct 7, 2019
  90. Elijah NewrenOct 12, 2019
  91. Derrick StoleeOct 14, 2019
  92. 14/17 sparse-checkout: sanitize for nested foldersDerrick Stolee via GitGitGadget, Oct 7, 2019
  93. 16/17 sparse-checkout: write using lockfileDerrick Stolee via GitGitGadget, Oct 7, 2019
  94. Elijah NewrenOct 12, 2019
  95. Derrick StoleeOct 14, 2019
  96. 17/17 sparse-checkout: cone mode should not interact with .gitignoreDerrick Stolee via GitGitGadget, Oct 7, 2019
  97. Elijah NewrenOct 12, 2019
  98. Elijah NewrenOct 12, 2019
  99. 00/17 New sparse-checkout builtin and "cone" modeDerrick Stolee via GitGitGadget, Oct 15, 2019
  100. 02/17 sparse-checkout: create 'init' subcommandDerrick Stolee via GitGitGadget, Oct 15, 2019
  101. 01/17 sparse-checkout: create builtin with 'list' subcommandDerrick Stolee via GitGitGadget, Oct 15, 2019
  102. Elijah NewrenOct 16, 2019
  103. Derrick StoleeOct 21, 2019
  104. SZEDER GáborOct 18, 2019
  105. Derrick StoleeOct 21, 2019
  106. 03/17 clone: add --sparse modeDerrick Stolee via GitGitGadget, Oct 15, 2019
  107. 04/17 sparse-checkout: 'set' subcommandDerrick Stolee via GitGitGadget, Oct 15, 2019
  108. 09/17 sparse-checkout: use hashmaps for cone patternsDerrick Stolee via GitGitGadget, Oct 15, 2019
  109. SZEDER GáborOct 18, 2019
  110. Derrick StoleeOct 21, 2019
  111. 08/17 sparse-checkout: add 'cone' modeDerrick Stolee via GitGitGadget, Oct 15, 2019
  112. 06/17 sparse-checkout: create 'disable' subcommandDerrick Stolee via GitGitGadget, Oct 15, 2019
  113. SZEDER GáborOct 18, 2019
  114. 05/17 sparse-checkout: add '--stdin' option to set subcommandDerrick Stolee via GitGitGadget, Oct 15, 2019
  115. 07/17 trace2: add region in clear_ce_flagsJeff Hostetler via GitGitGadget, Oct 15, 2019
  116. 11/17 unpack-trees: hash less in cone modeDerrick Stolee via GitGitGadget, Oct 15, 2019
  117. 17/17 sparse-checkout: cone mode should not interact with .gitignoreDerrick Stolee via GitGitGadget, Oct 15, 2019
  118. 10/17 sparse-checkout: init and set in cone modeDerrick Stolee via GitGitGadget, Oct 15, 2019
  119. 16/17 sparse-checkout: write using lockfileDerrick Stolee via GitGitGadget, Oct 15, 2019
  120. 15/17 sparse-checkout: update working directory in-processDerrick Stolee via GitGitGadget, Oct 15, 2019
  121. SZEDER GáborOct 18, 2019
  122. SZEDER GáborOct 18, 2019
  123. Derrick StoleeOct 21, 2019
  124. 14/17 sparse-checkout: sanitize for nested foldersDerrick Stolee via GitGitGadget, Oct 15, 2019
  125. 12/17 unpack-trees: add progress to clear_ce_flags()Derrick Stolee via GitGitGadget, Oct 15, 2019
  126. 13/17 read-tree: show progress by defaultDerrick Stolee via GitGitGadget, Oct 15, 2019
  127. Elijah NewrenOct 16, 2019
  128. Jon SimonsOct 17, 2019
  129. Derrick StoleeOct 21, 2019
  130. 00/17 New sparse-checkout builtin and "cone" modeDerrick Stolee via GitGitGadget, Oct 21, 2019
  131. 02/17 sparse-checkout: create 'init' subcommandDerrick Stolee via GitGitGadget, Oct 21, 2019
  132. SZEDER GáborNov 19, 2019
  133. SZEDER GáborNov 20, 2019
  134. SZEDER GáborNov 21, 2019
  135. SZEDER GáborNov 21, 2019
  136. Derrick StoleeNov 21, 2019
  137. SZEDER GáborNov 21, 2019
  138. Derrick StoleeNov 21, 2019
  139. SZEDER GáborNov 21, 2019
  140. Elijah NewrenNov 21, 2019
  141. Derrick StoleeNov 21, 2019
  142. 04/17 sparse-checkout: 'set' subcommandDerrick Stolee via GitGitGadget, Oct 21, 2019
  143. SZEDER GáborNov 19, 2019
  144. Derrick StoleeNov 21, 2019
  145. SZEDER GáborNov 21, 2019
  146. 03/17 clone: add --sparse modeDerrick Stolee via GitGitGadget, Oct 21, 2019
  147. 01/17 sparse-checkout: create builtin with 'list' subcommandDerrick Stolee via GitGitGadget, Oct 21, 2019
  148. SZEDER GáborNov 19, 2019
  149. 05/17 sparse-checkout: add '--stdin' option to set subcommandDerrick Stolee via GitGitGadget, Oct 21, 2019
  150. SZEDER GáborNov 21, 2019
  151. Derrick StoleeNov 21, 2019
  152. 09/17 sparse-checkout: use hashmaps for cone patternsDerrick Stolee via GitGitGadget, Oct 21, 2019
  153. 11/17 unpack-trees: hash less in cone modeDerrick Stolee via GitGitGadget, Oct 21, 2019
  154. 08/17 sparse-checkout: add 'cone' modeDerrick Stolee via GitGitGadget, Oct 21, 2019
  155. SZEDER GáborNov 19, 2019
  156. 07/17 trace2: add region in clear_ce_flagsJeff Hostetler via GitGitGadget, Oct 21, 2019
  157. 12/17 unpack-trees: add progress to clear_ce_flags()Derrick Stolee via GitGitGadget, Oct 21, 2019
  158. 10/17 sparse-checkout: init and set in cone modeDerrick Stolee via GitGitGadget, Oct 21, 2019
  159. SZEDER GáborNov 19, 2019
  160. Derrick StoleeNov 21, 2019
  161. 16/17 sparse-checkout: write using lockfileDerrick Stolee via GitGitGadget, Oct 21, 2019
  162. 15/17 sparse-checkout: update working directory in-processDerrick Stolee via GitGitGadget, Oct 21, 2019
  163. SZEDER GáborNov 19, 2019
  164. 14/17 sparse-checkout: sanitize for nested foldersDerrick Stolee via GitGitGadget, Oct 21, 2019
  165. 17/17 sparse-checkout: cone mode should not interact with .gitignoreDerrick Stolee via GitGitGadget, Oct 21, 2019
  166. 06/17 sparse-checkout: create 'disable' subcommandDerrick Stolee via GitGitGadget, Oct 21, 2019
  167. SZEDER GáborNov 19, 2019
  168. Derrick StoleeNov 21, 2019
  169. 13/17 read-tree: show progress by defaultDerrick Stolee via GitGitGadget, Oct 21, 2019
  170. Phillip WoodOct 21, 2019
  171. Derrick StoleeOct 21, 2019
  172. Junio C HamanoOct 23, 2019
  173. Derrick StoleeOct 23, 2019
  174. Phillip WoodOct 24, 2019
  175. Phillip WoodOct 24, 2019
  176. Junio C HamanoOct 23, 2019
  177. 00/19 New sparse-checkout builtin and "cone" modeDerrick Stolee via GitGitGadget, Nov 21, 2019
  178. 02/19 sparse-checkout: create 'init' subcommandDerrick Stolee via GitGitGadget, Nov 21, 2019
  179. 01/19 sparse-checkout: create builtin with 'list' subcommandDerrick Stolee via GitGitGadget, Nov 21, 2019
  180. 03/19 clone: add --sparse modeDerrick Stolee via GitGitGadget, Nov 21, 2019
  181. 04/19 sparse-checkout: 'set' subcommandDerrick Stolee via GitGitGadget, Nov 21, 2019
  182. 09/19 sparse-checkout: use hashmaps for cone patternsDerrick Stolee via GitGitGadget, Nov 21, 2019
  183. 08/19 sparse-checkout: add 'cone' modeDerrick Stolee via GitGitGadget, Nov 21, 2019
  184. 06/19 sparse-checkout: create 'disable' subcommandDerrick Stolee via GitGitGadget, Nov 21, 2019
  185. 05/19 sparse-checkout: add '--stdin' option to set subcommandDerrick Stolee via GitGitGadget, Nov 21, 2019
  186. 07/19 trace2: add region in clear_ce_flagsJeff Hostetler via GitGitGadget, Nov 21, 2019
  187. 10/19 sparse-checkout: init and set in cone modeDerrick Stolee via GitGitGadget, Nov 21, 2019
  188. 11/19 unpack-trees: hash less in cone modeDerrick Stolee via GitGitGadget, Nov 21, 2019
  189. 13/19 sparse-checkout: sanitize for nested foldersDerrick Stolee via GitGitGadget, Nov 21, 2019
  190. 12/19 unpack-trees: add progress to clear_ce_flags()Derrick Stolee via GitGitGadget, Nov 21, 2019
  191. 17/19 sparse-checkout: cone mode should not interact with .gitignoreDerrick Stolee via GitGitGadget, Nov 21, 2019
  192. 14/19 sparse-checkout: update working directory in-processDerrick Stolee via GitGitGadget, Nov 21, 2019
  193. 16/19 sparse-checkout: write using lockfileDerrick Stolee via GitGitGadget, Nov 21, 2019
  194. 15/19 sparse-checkout: use in-process update for disable subcommandDerrick Stolee via GitGitGadget, Nov 21, 2019
  195. 18/19 sparse-checkout: update working directory in-process for 'init'Derrick Stolee via GitGitGadget, Nov 21, 2019
  196. 19/19 sparse-checkout: check for dirty statusDerrick Stolee via GitGitGadget, Nov 21, 2019

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.