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

[PATCH v4 08/10] git-sparse-checkout.txt: update to document init/set/reapply changes

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 14, 2021, 04:09 UTC
Message-ID
<9d96da855ea70e7e8a54bb68e710cc60a2f50376.1639454952.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1151.v4.git.git.1639454952.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

As noted in the previous commit, using separate `init` and `set` steps with sparse-checkout result in a number of issues. The previous commits made `set` able to handle the work of both commands, and enabled reapply to tweak the {cone,sparse-index} settings. Update the documentation to reflect this, and mark `init` as deprecated.

Reviewed-by: Derrick Stolee <dstolee@microsoft.com>
Reviewed-by: Victoria Dye <vdye@github.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 Documentation/git-sparse-checkout.txt | 98 +++++++++++++++------------
 1 file changed, 55 insertions(+), 43 deletions(-)
diff --git a/Documentation/git-sparse-checkout.txt b/Documentation/git-sparse-checkout.txt
index 42056ee9ff9..72fcb6b2acc 100644
--- a/Documentation/git-sparse-checkout.txt
+++ b/Documentation/git-sparse-checkout.txt
@@ -30,28 +30,36 @@ COMMANDS
 'list'::
 	Describe the patterns in the sparse-checkout file.
 
-'init'::
-	Enable the `core.sparseCheckout` setting. If the
-	sparse-checkout file does not exist, then populate it with
-	patterns that match every file in the root directory and
-	no other directories, then will remove all directories tracked
-	by Git. Add patterns to the sparse-checkout file to
-	repopulate the working directory.
+'set'::
+	Enable the necessary config settings
+	(extensions.worktreeConfig, core.sparseCheckout,
+	core.sparseCheckoutCone) if they are not already enabled, and
+	write a set of patterns to the sparse-checkout file from the
+	list of arguments following the 'set' subcommand. Update the
+	working directory to match the new patterns.
 +
-To avoid interfering with other worktrees, it first enables the
-`extensions.worktreeConfig` setting and makes sure to set the
-`core.sparseCheckout` setting in the worktree-specific config file.
+When the `--stdin` option is provided, the patterns are read from
+standard in as a newline-delimited list instead of from the arguments.
 +
-When `--cone` is provided, the `core.sparseCheckoutCone` setting is
-also set, allowing for better performance with a limited set of
-patterns (see 'CONE PATTERN SET' below).
+When `--cone` is passed or `core.sparseCheckoutCone` is enabled, the
+input list is considered a list of directories instead of
+sparse-checkout patterns.  This allows for better performance with a
+limited set of patterns (see 'CONE PATTERN SET' below).  Note that the
+set command will write patterns to the sparse-checkout file to include
+all files contained in those directories (recursively) as well as
+files that are siblings of ancestor directories. The input format
+matches the output of `git ls-tree --name-only`.  This includes
+interpreting pathnames that begin with a double quote (") as C-style
+quoted strings.  This may become the default in the future; --no-cone
+can be passed to request non-cone mode.
 +
-Use the `--[no-]sparse-index` option to toggle the use of the sparse
-index format. This reduces the size of the index to be more closely
-aligned with your sparse-checkout definition. This can have significant
-performance advantages for commands such as `git status` or `git add`.
-This feature is still experimental. Some commands might be slower with
-a sparse index until they are properly integrated with the feature.
+Use the `--[no-]sparse-index` option to use a sparse index (the
+default is to not use it).  A sparse index reduces the size of the
+index to be more closely aligned with your sparse-checkout
+definition. This can have significant performance advantages for
+commands such as `git status` or `git add`.  This feature is still
+experimental. Some commands might be slower with a sparse index until
+they are properly integrated with the feature.
 +
 **WARNING:** Using a sparse index requires modifying the index in a way
 that is not completely understood by external tools. If you have trouble
@@ -60,23 +68,6 @@ to rewrite your index to not be sparse. Older versions of Git will not
 understand the sparse directory entries index extension and may fail to
 interact with your repository until it is disabled.
 
-'set'::
-	Write a set of patterns to the sparse-checkout file, as given as
-	a list of arguments following the 'set' subcommand. Update the
-	working directory to match the new patterns. Enable the
-	core.sparseCheckout config setting if it is not already enabled.
-+
-When the `--stdin` option is provided, the patterns are read from
-standard in as a newline-delimited list instead of from the arguments.
-+
-When `core.sparseCheckoutCone` is enabled, the input list is considered a
-list of directories instead of sparse-checkout patterns. The command writes
-patterns to the sparse-checkout file to include all files contained in those
-directories (recursively) as well as files that are siblings of ancestor
-directories. The input format matches the output of `git ls-tree --name-only`.
-This includes interpreting pathnames that begin with a double quote (") as
-C-style quoted strings.
-
 'add'::
 	Update the sparse-checkout file to include additional patterns.
 	By default, these patterns are read from the command-line arguments,
@@ -93,12 +84,35 @@ C-style quoted strings.
 	cases, it can make sense to run `git sparse-checkout reapply` later
 	after cleaning up affected paths (e.g. resolving conflicts, undoing
 	or committing changes, etc.).
++
+The `reapply` command can also take `--[no-]cone` and `--[no-]sparse-index`
+flags, with the same meaning as the flags from the `set` command, in order
+to change which sparsity mode you are using without needing to also respecify
+all sparsity paths.
 
 'disable'::
 	Disable the `core.sparseCheckout` config setting, and restore the
-	working directory to include all files. Leaves the sparse-checkout
-	file intact so a later 'git sparse-checkout init' command may
-	return the working directory to the same state.
+	working directory to include all files.
+
+'init'::
+	Deprecated command that behaves like `set` with no specified paths.
+	May be removed in the future.
++
+Historically, `set` did not handle all the necessary config settings,
+which meant that both `init` and `set` had to be called.  Invoking
+both meant the `init` step would first remove nearly all tracked files
+(and in cone mode, ignored files too), then the `set` step would add
+many of the tracked files (but not ignored files) back.  In addition
+to the lost files, the performance and UI of this combination was
+poor.
++
+Also, historically, `init` would not actually initialize the
+sparse-checkout file if it already existed.  This meant it was
+possible to return to a sparse-checkout without remembering which
+paths to pass to a subsequent 'set' or 'add' command.  However,
+`--cone` and `--sparse-index` options would not be remembered across
+the disable command, so the easy restore of calling a plain `init`
+decreased in utility.
 
 SPARSE CHECKOUT
 ---------------
@@ -117,10 +131,8 @@ directory, it updates the skip-worktree bits in the index based
 on this file. The files matching the patterns in the file will
 appear in the working directory, and the rest will not.
 
-To enable the sparse-checkout feature, run `git sparse-checkout init` to
-initialize a simple sparse-checkout file and enable the `core.sparseCheckout`
-config setting. Then, run `git sparse-checkout set` to modify the patterns in
-the sparse-checkout file.
+To enable the sparse-checkout feature, run `git sparse-checkout set` to
+set the patterns you want to use.
 
 To repopulate the working directory with all files, use the
 `git sparse-checkout disable` command.
-- 
gitgitgadget
Previous: Elijah NewrenNext: Elijah Newren via GitGitGadget
Message 61 of 63 in “sparse-checkout: make set subsume init”
  1. 0/6 sparse-checkout: make set subsume initElijah Newren via GitGitGadget, Dec 4, 2021
  2. 1/6 sparse-checkout: pass use_stdin as a parameter instead of as a globalElijah Newren via GitGitGadget, Dec 4, 2021
  3. 2/6 sparse-checkout: break apart functions for sparse_checkout_(set|add)Elijah Newren via GitGitGadget, Dec 4, 2021
  4. 3/6 sparse-checkout: enable `set` to initialize sparse-checkout modeElijah Newren via GitGitGadget, Dec 4, 2021
  5. Victoria DyeDec 4, 2021
  6. Elijah NewrenDec 7, 2021
  7. Lessley DenningtonDec 7, 2021
  8. Derrick StoleeDec 7, 2021
  9. Elijah NewrenDec 7, 2021
  10. 4/6 git-sparse-checkout.txt: update to document that set handles initElijah Newren via GitGitGadget, Dec 4, 2021
  11. Victoria DyeDec 4, 2021
  12. Derrick StoleeDec 7, 2021
  13. Elijah NewrenDec 7, 2021
  14. Lessley DenningtonDec 7, 2021
  15. Elijah NewrenDec 7, 2021
  16. Lessley DenningtonDec 7, 2021
  17. 5/6 Documentation: clarify/correct a few sparsity related statementsElijah Newren via GitGitGadget, Dec 4, 2021
  18. 6/6 clone: avoid using deprecated `sparse-checkout init`Elijah Newren via GitGitGadget, Dec 4, 2021
  19. Derrick StoleeDec 7, 2021
  20. 00/10 sparse-checkout: make set subsume initElijah Newren via GitGitGadget, Dec 7, 2021
  21. 01/10 sparse-checkout: pass use_stdin as a parameter instead of as a globalElijah Newren via GitGitGadget, Dec 7, 2021
  22. 02/10 sparse-checkout: break apart functions for sparse_checkout_(set|add)Elijah Newren via GitGitGadget, Dec 7, 2021
  23. 03/10 sparse-checkout: add sanity-checks on initial sparsity stateElijah Newren via GitGitGadget, Dec 7, 2021
  24. 04/10 sparse-checkout: disallow --no-stdin as an argument to setElijah Newren via GitGitGadget, Dec 7, 2021
  25. 05/10 sparse-checkout: split out code for tweaking settings configElijah Newren via GitGitGadget, Dec 7, 2021
  26. 06/10 sparse-checkout: enable `set` to initialize sparse-checkout modeElijah Newren via GitGitGadget, Dec 7, 2021
  27. 07/10 sparse-checkout: enable reapply to take --[no-]{cone,sparse-index}Elijah Newren via GitGitGadget, Dec 7, 2021
  28. 08/10 git-sparse-checkout.txt: update to document init/set/reapply changesElijah Newren via GitGitGadget, Dec 7, 2021
  29. 09/10 Documentation: clarify/correct a few sparsity related statementsElijah Newren via GitGitGadget, Dec 7, 2021
  30. 10/10 clone: avoid using deprecated `sparse-checkout init`Elijah Newren via GitGitGadget, Dec 7, 2021
  31. Derrick StoleeDec 7, 2021
  32. Victoria DyeDec 8, 2021
  33. 00/10 sparse-checkout: make set subsume initElijah Newren via GitGitGadget, Dec 10, 2021
  34. 01/10 sparse-checkout: pass use_stdin as a parameter instead of as a globalElijah Newren via GitGitGadget, Dec 10, 2021
  35. 02/10 sparse-checkout: break apart functions for sparse_checkout_(set|add)Elijah Newren via GitGitGadget, Dec 10, 2021
  36. 03/10 sparse-checkout: add sanity-checks on initial sparsity stateElijah Newren via GitGitGadget, Dec 10, 2021
  37. Junio C HamanoDec 13, 2021
  38. Elijah NewrenDec 14, 2021
  39. 04/10 sparse-checkout: disallow --no-stdin as an argument to setElijah Newren via GitGitGadget, Dec 10, 2021
  40. 06/10 sparse-checkout: enable `set` to initialize sparse-checkout modeElijah Newren via GitGitGadget, Dec 10, 2021
  41. 05/10 sparse-checkout: split out code for tweaking settings configElijah Newren via GitGitGadget, Dec 10, 2021
  42. 07/10 sparse-checkout: enable reapply to take --[no-]{cone,sparse-index}Elijah Newren via GitGitGadget, Dec 10, 2021
  43. Junio C HamanoDec 13, 2021
  44. Elijah NewrenDec 14, 2021
  45. 08/10 git-sparse-checkout.txt: update to document init/set/reapply changesElijah Newren via GitGitGadget, Dec 10, 2021
  46. 09/10 Documentation: clarify/correct a few sparsity related statementsElijah Newren via GitGitGadget, Dec 10, 2021
  47. 10/10 clone: avoid using deprecated `sparse-checkout init`Elijah Newren via GitGitGadget, Dec 10, 2021
  48. 00/10 sparse-checkout: make set subsume initElijah Newren via GitGitGadget, Dec 14, 2021
  49. 01/10 sparse-checkout: pass use_stdin as a parameter instead of as a globalElijah Newren via GitGitGadget, Dec 14, 2021
  50. 02/10 sparse-checkout: break apart functions for sparse_checkout_(set|add)Elijah Newren via GitGitGadget, Dec 14, 2021
  51. 03/10 sparse-checkout: add sanity-checks on initial sparsity stateElijah Newren via GitGitGadget, Dec 14, 2021
  52. 04/10 sparse-checkout: disallow --no-stdin as an argument to setElijah Newren via GitGitGadget, Dec 14, 2021
  53. 05/10 sparse-checkout: split out code for tweaking settings configElijah Newren via GitGitGadget, Dec 14, 2021
  54. 07/10 sparse-checkout: enable reapply to take --[no-]{cone,sparse-index}Elijah Newren via GitGitGadget, Dec 14, 2021
  55. Jiang XinDec 23, 2021
  56. Elijah NewrenDec 23, 2021
  57. Junio C HamanoDec 23, 2021
  58. 09/10 Documentation: clarify/correct a few sparsity related statementsElijah Newren via GitGitGadget, Dec 14, 2021
  59. Bagas SanjayaDec 14, 2021
  60. Elijah NewrenDec 14, 2021
  61. 08/10 git-sparse-checkout.txt: update to document init/set/reapply changesElijah Newren via GitGitGadget, Dec 14, 2021
  62. 06/10 sparse-checkout: enable `set` to initialize sparse-checkout modeElijah Newren via GitGitGadget, Dec 14, 2021
  63. 10/10 clone: avoid using deprecated `sparse-checkout init`Elijah Newren via GitGitGadget, Dec 14, 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.