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

Re: [PATCH v5 0/5] Sparse checkout: fix bug with worktree of bare repo

From
Elijah Newren <newren@gmail.com>
Date
Jan 31, 2022, 16:17 UTC
Message-ID
<CABPp-BGA_e4oaVzmssHgejYPmjWMCNFDJ2-hbUU3yFbONyaG8Q@mail.gmail.com>
In-Reply-To
<pull.1101.v5.git.1643641259.gitgitgadget@gmail.com>

On Mon, Jan 31, 2022 at 7:01 AM Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com> wrote:

Show 53 quoted lines
>
> This series is now based on v2.35.0 since that contains all of the necessary
> topics.
>
> This patch series includes a fix to the bug reported by Sean Allred [1] and
> diagnosed by Eric Sunshine [2].
>
> The root cause is that 'git sparse-checkout init' writes to the worktree
> config without checking that core.bare or core.worktree are set in the
> common config file. This series fixes this, but also puts in place some
> helpers to prevent this from happening in the future.
>
> ATTENTION: I have significantly redesigned the series since previous
> versions, so most of this cover letter is new.
>
>  * Patch 1 updates documentation around extensions.worktreeConfig in a few
>    places to improve discoverability. Several cross links are added to make
>    it easy to find the related areas. (The documentation for the changes to
>    'git sparse-checkout' are delayed to patch 4.)
>
>  * Patch 2 introduces the init_worktree_config() helper which follows the
>    documented instructions to enable extensions.worktreeConfig as well as
>    move the core.bare and core.worktree config values. This update does not
>    modify core.repositoryFormatVersion, since this is not needed
>    specifically for extensions.worktreeConfig.
>
>  * Patch 3 adds a new repo_config_set_worktree_gently() helper method so we
>    can internally adjust a config value within a worktree, at least if
>    extensions.worktreeConfig is enabled. (It will write to the common config
>    file if the extension is not enabled.)
>
>  * Patch 4 modifies the sparse-checkout builtin to use
>    init_worktree_config() and repo_config_set_worktree_gently() in ways that
>    fix the reported bug. The behavior change here is that it will no longer
>    upgrade the repository format version, since that is not needed for
>    extensions.worktreeConfig.
>
>  * Patch 5 updates 'git worktree add' to copy the worktree config from the
>    current worktree to the new one (while unsetting core.bare=true and
>    core.worktree=*) along with copying the sparse-checkout patterns file.
>
> [1]
> https://lore.kernel.org/git/CABceR4bZmtC4rCwgxZ1BBYZP69VOUca1f_moJoP989vTUZWu9Q@mail.gmail.com/
> [2]
> https://lore.kernel.org/git/CAPig+cQ6U_yFw-X2OWrizB1rbCvc4bNxuSzKFzmoLNnm0GH8Eg@mail.gmail.com/
>
>
> Updates in v5
> =============
>
>  * Cleaned up documentation as per Elijah's suggestions.
>  * Removed unnecessary conflicting change in git-sparse-checkout.txt
>  * Fixed an ambiguous comment about moving config values.

Thanks for patiently addressing all my feedback. These last two rounds look really good, and this one you've addressed all my feedback and I can't find any issues:

Reviewed-by: Elijah Newren <newren@gmail.com>
Show 160 quoted lines
> Updates in v4
> =============
>
>  * Rebased to v2.35.0
>  * Fixed memory leak (was leaking repo_git_path() result)
>  * Added additional documentation updates so curious users can discover the
>    intricacies of extensions.worktreeConfig from multiple entry points.
>  * Significantly reduced the amount of changes to config.c.
>  * 'git sparse-checkout' no longer upgrades the repository format.
>  * Dropped the update to upgrade_repository_format(), since it is not
>    needed.
>  * Dropped the 'git worktree init-worktree-config' subcommand in favor of a
>    helper method called by 'git sparse-checkout'
>  * Many others because of the significant changes required by the above
>    items.
>
> Thanks, -Stolee
>
> Derrick Stolee (5):
>   Documentation: add extensions.worktreeConfig details
>   worktree: create init_worktree_config()
>   config: add repo_config_set_worktree_gently()
>   sparse-checkout: set worktree-config correctly
>   worktree: copy sparse-checkout patterns and config on add
>
>  Documentation/config/extensions.txt   | 31 ++++++++++++
>  Documentation/git-config.txt          |  8 ++-
>  Documentation/git-sparse-checkout.txt | 16 ++++--
>  Documentation/git-worktree.txt        | 11 +++--
>  builtin/sparse-checkout.c             | 28 +++++------
>  builtin/worktree.c                    | 60 +++++++++++++++++++++++
>  config.c                              | 35 ++++++++++++--
>  config.h                              |  8 +++
>  sparse-index.c                        | 10 ++--
>  t/t1091-sparse-checkout-builtin.sh    | 35 ++++++++++----
>  t/t2400-worktree-add.sh               | 46 +++++++++++++++++-
>  worktree.c                            | 70 +++++++++++++++++++++++++++
>  worktree.h                            | 21 ++++++++
>  13 files changed, 333 insertions(+), 46 deletions(-)
>
>
> base-commit: 89bece5c8c96f0b962cfc89e63f82d603fd60bed
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1101%2Fderrickstolee%2Fsparse-checkout%2Fbare-worktree-bug-v5
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1101/derrickstolee/sparse-checkout/bare-worktree-bug-v5
> Pull-Request: https://github.com/gitgitgadget/git/pull/1101
>
> Range-diff vs v4:
>
>  1:  459e09dedd7 ! 1:  1bd5f26271c Documentation: add extensions.worktreeConfig details
>      @@ Commit message
>           within git-sparse-checkout.txt, but a behavior change is needed before
>           making those updates.
>
>      +    Helped-by: Elijah Newren <newren@gmail.com>
>           Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
>
>        ## Documentation/config/extensions.txt ##
>      @@ Documentation/git-config.txt: from all available files.
>       - present. If not it's the same as `--local`.
>       + enabled. If not it's the same as `--local`. Note that `$GIT_DIR`
>       + is equal to `$GIT_COMMON_DIR` for the main worktree, but is of the
>      -+ form `.git/worktrees/<worktree-name>/` for other worktrees. See
>      ++ form `$GIT_DIR/worktrees/<worktree-name>/` for other worktrees. See
>       + linkgit:git-worktree[1] to learn how to enable
>       + `extensions.worktreeConfig`.
>
>      @@ Documentation/git-worktree.txt: CONFIGURATION FILE
>       -already present in the config file, they will be applied to the main
>       -working trees only.
>       +present in the common config file and `extensions.worktreeConfig` is
>      -+disabled, then they will be applied to the main working trees only.
>      ++disabled, then they will be applied to the main working tree only.
>
>        In order to have configuration specific to working trees, you can turn
>        on the `worktreeConfig` extension, e.g.:
>      @@ Documentation/git-worktree.txt: them to the `config.worktree` of the main workin
>       - - `core.worktree` and `core.bare` should never be shared
>       + - `core.worktree` should never be shared.
>       +
>      -+ - `core.bare` should not be shared unless the value is `core.bare=false`.
>      ++ - `core.bare` should not be shared if the value is `core.bare=true`.
>
>         - `core.sparseCheckout` is recommended per working tree, unless you
>           are sure you always use sparse checkout for all working trees.
>  2:  d262a76b448 ! 2:  2a2c350112e worktree: create init_worktree_config()
>      @@ worktree.h: void strbuf_worktree_ref(const struct worktree *wt,
>       + *
>       + * 1. Add extensions.worktreeConfig=true in the common config file.
>       + *
>      -+ * 2. If the common config file has a core.worktree value or core.bare is
>      -+ *    set to true, then those values are moved to the main worktree's
>      -+ *    config.worktree file.
>      ++ * 2. If the common config file has a core.worktree value, then that value
>      ++ *    is moved to the main worktree's config.worktree file.
>      ++ *
>      ++ * 3. If the common config file has a core.bare enabled, then that value
>      ++ *    is moved to the main worktree's config.worktree file.
>       + *
>       + * If extensions.worktreeConfig is already true, then this method
>       + * terminates early without any of the above steps. The existing config
>  3:  110d5e0546c = 3:  802b28a9510 config: add repo_config_set_worktree_gently()
>  4:  fbfaa17797c ! 4:  08b89d17ccf sparse-checkout: set worktree-config correctly
>      @@ Documentation/git-sparse-checkout.txt: COMMANDS
>       - (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.
>       + Enable the necessary sparse-checkout config settings
>      -+ (`core.sparseCheckout` and possibly `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.
>      -++
>      ++ (`core.sparseCheckout`, `core.sparseCheckoutCone`, and
>      ++ `index.sparse`) if they are not already set to the desired values,
>      ++ 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 ensure that adjusting the sparse-checkout settings within a worktree
>       +does not alter the sparse-checkout settings in other worktrees, the 'set'
>       +subcommand will upgrade your repository config to use worktree-specific
>      @@ Documentation/git-sparse-checkout.txt: COMMANDS
>       +the 'set' subcommand are stored in the worktree-specific sparse-checkout
>       +file. See linkgit:git-worktree[1] and the documentation of
>       +`extensions.worktreeConfig` in linkgit:git-config[1] for more details.
>      - +
>      +++
>        When the `--stdin` option is provided, the patterns are read from
>        standard in as a newline-delimited list instead of from the arguments.
>      -@@ Documentation/git-sparse-checkout.txt: interact with your repository until it is disabled.
>      -  By default, these patterns are read from the command-line arguments,
>      -  but they can be read from stdin using the `--stdin` option. When
>      -  `core.sparseCheckoutCone` is enabled, the given patterns are interpreted
>      -- as directory names as in the 'set' subcommand.
>      -+ as directory names as in the 'set' subcommand. The sparsity defined
>      -+ by the arguments to the 'add' subcommand are added to the patterns
>      -+ in the worktree-specific sparse-checkout file.
>      -
>      - 'reapply'::
>      -  Reapply the sparsity pattern rules to paths in the working tree.
>      + +
>
>        ## builtin/sparse-checkout.c ##
>       @@
>  5:  bb9e550ff3d ! 5:  85779dfaed3 worktree: copy sparse-checkout patterns and config on add
>      @@ t/t1091-sparse-checkout-builtin.sh: test_expect_success 'add to sparse-checkout'
>       + cat repo/.git/info/sparse-checkout >old &&
>       + test_when_finished cp old repo/.git/info/sparse-checkout &&
>       + test_when_finished git -C repo worktree remove ../worktree &&
>      -+ git -C repo sparse-checkout set "/*" &&
>      ++ git -C repo sparse-checkout set --no-cone "/*" &&
>       + git -C repo worktree add --quiet ../worktree 2>err &&
>       + test_must_be_empty err &&
>       + new=repo/.git/worktrees/worktree/info/sparse-checkout &&
>
> --
> gitgitgadget
Previous: Derrick StoleeNext: Derrick Stolee via GitGitGadget
Message 105 of 138 in “Sparse checkout: fix bug with worktree of bare repo”
  1. 0/4 Sparse checkout: fix bug with worktree of bare repoDerrick Stolee via GitGitGadget, Dec 20, 2021
  2. 1/4 setup: use a repository when upgrading formatDerrick Stolee via GitGitGadget, Dec 20, 2021
  3. 2/4 config: make some helpers repo-awareDerrick Stolee via GitGitGadget, Dec 20, 2021
  4. 3/4 config: add repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Dec 20, 2021
  5. Derrick StoleeDec 20, 2021
  6. Eric SunshineDec 21, 2021
  7. Eric SunshineDec 21, 2021
  8. Derrick StoleeDec 21, 2021
  9. Eric SunshineDec 21, 2021
  10. Derrick StoleeDec 21, 2021
  11. Eric SunshineDec 21, 2021
  12. 4/4 sparse-checkout: use repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Dec 20, 2021
  13. Eric SunshineDec 20, 2021
  14. Derrick StoleeDec 20, 2021
  15. Eric SunshineDec 21, 2021
  16. 0/5 Sparse checkout: fix bug with worktree of bare repoDerrick Stolee via GitGitGadget, Dec 21, 2021
  17. 1/5 setup: use a repository when upgrading formatDerrick Stolee via GitGitGadget, Dec 21, 2021
  18. 2/5 config: make some helpers repo-awareDerrick Stolee via GitGitGadget, Dec 21, 2021
  19. 3/5 worktree: add upgrade_to_worktree_config()Derrick Stolee via GitGitGadget, Dec 21, 2021
  20. Eric SunshineDec 22, 2021
  21. Derrick StoleeDec 28, 2021
  22. Eric SunshineDec 28, 2021
  23. Derrick StoleeDec 28, 2021
  24. Junio C HamanoDec 22, 2021
  25. Derrick StoleeDec 28, 2021
  26. 4/5 config: add repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Dec 21, 2021
  27. Eric SunshineDec 22, 2021
  28. 5/5 sparse-checkout: use repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Dec 21, 2021
  29. Eric SunshineDec 22, 2021
  30. Eric SunshineDec 22, 2021
  31. Elijah NewrenDec 22, 2021
  32. Eric SunshineDec 27, 2021
  33. Eric SunshineDec 27, 2021
  34. Elijah NewrenDec 27, 2021
  35. Eric SunshineDec 28, 2021
  36. Eric SunshineDec 30, 2021
  37. Elijah NewrenDec 30, 2021
  38. Elijah NewrenDec 27, 2021
  39. Eric SunshineDec 28, 2021
  40. Elijah NewrenDec 28, 2021
  41. Eric SunshineDec 30, 2021
  42. Elijah NewrenDec 30, 2021
  43. Eric SunshineJan 3, 2022
  44. 0/6 Sparse checkout: fix bug with worktree of bare repoDerrick Stolee via GitGitGadget, Dec 28, 2021
  45. 1/6 setup: use a repository when upgrading formatDerrick Stolee via GitGitGadget, Dec 28, 2021
  46. 2/6 config: make some helpers repo-awareDerrick Stolee via GitGitGadget, Dec 28, 2021
  47. 3/6 worktree: add 'init-worktree-config' subcommandDerrick Stolee via GitGitGadget, Dec 28, 2021
  48. Eric SunshineDec 29, 2021
  49. Eric SunshineDec 30, 2021
  50. Derrick StoleeDec 30, 2021
  51. Eric SunshineJan 3, 2022
  52. 4/6 config: add repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Dec 28, 2021
  53. 5/6 sparse-checkout: use repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Dec 28, 2021
  54. Eric SunshineDec 30, 2021
  55. 6/6 worktree: copy sparse-checkout patterns and config on addDerrick Stolee via GitGitGadget, Dec 28, 2021
  56. Eric SunshineDec 29, 2021
  57. Derrick StoleeDec 29, 2021
  58. Elijah NewrenDec 29, 2021
  59. Derrick StoleeDec 29, 2021
  60. Elijah NewrenDec 29, 2021
  61. Eric SunshineDec 30, 2021
  62. Eric SunshineDec 30, 2021
  63. Elijah NewrenDec 29, 2021
  64. Derrick StoleeDec 29, 2021
  65. Eric SunshineDec 30, 2021
  66. Eric SunshineDec 30, 2021
  67. Derrick StoleeDec 30, 2021
  68. Elijah NewrenDec 30, 2021
  69. Eric SunshineJan 3, 2022
  70. Elijah NewrenDec 30, 2021
  71. 0/5 Sparse checkout: fix bug with worktree of bare repoDerrick Stolee via GitGitGadget, Jan 25, 2022
  72. 2/5 worktree: create init_worktree_config()Derrick Stolee via GitGitGadget, Jan 25, 2022
  73. Elijah NewrenJan 27, 2022
  74. 3/5 config: add repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Jan 25, 2022
  75. 1/5 Documentation: add extensions.worktreeConfig detailsDerrick Stolee via GitGitGadget, Jan 25, 2022
  76. Bagas SanjayaJan 26, 2022
  77. Derrick StoleeJan 27, 2022
  78. Elijah NewrenJan 27, 2022
  79. Derrick StoleeJan 27, 2022
  80. 4/5 sparse-checkout: set worktree-config correctlyDerrick Stolee via GitGitGadget, Jan 25, 2022
  81. Elijah NewrenJan 27, 2022
  82. Derrick StoleeJan 27, 2022
  83. 5/5 worktree: copy sparse-checkout patterns and config on addDerrick Stolee via GitGitGadget, Jan 25, 2022
  84. Elijah NewrenJan 27, 2022
  85. Elijah NewrenJan 27, 2022
  86. Derrick StoleeJan 27, 2022
  87. 0/5 Sparse checkout: fix bug with worktree of bare repoDerrick Stolee via GitGitGadget, Jan 31, 2022
  88. 1/5 Documentation: add extensions.worktreeConfig detailsDerrick Stolee via GitGitGadget, Jan 31, 2022
  89. Eric SunshineFeb 6, 2022
  90. 2/5 worktree: create init_worktree_config()Derrick Stolee via GitGitGadget, Jan 31, 2022
  91. Eric SunshineFeb 6, 2022
  92. 3/5 config: add repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Jan 31, 2022
  93. 4/5 sparse-checkout: set worktree-config correctlyDerrick Stolee via GitGitGadget, Jan 31, 2022
  94. Eric SunshineFeb 6, 2022
  95. 5/5 worktree: copy sparse-checkout patterns and config on addDerrick Stolee via GitGitGadget, Jan 31, 2022
  96. Jean-Noël AVILAFeb 6, 2022
  97. Derrick StoleeFeb 7, 2022
  98. Jean-Noël AvilaFeb 9, 2022
  99. Derrick StoleeFeb 9, 2022
  100. Eric SunshineFeb 6, 2022
  101. Eric SunshineFeb 6, 2022
  102. Derrick StoleeFeb 7, 2022
  103. Eric SunshineFeb 15, 2022
  104. Derrick StoleeFeb 16, 2022
  105. Elijah NewrenJan 31, 2022
  106. 0/6 Sparse checkout: fix bug with worktree of bare repoDerrick Stolee via GitGitGadget, Feb 7, 2022
  107. 1/6 Documentation: add extensions.worktreeConfig detailsDerrick Stolee via GitGitGadget, Feb 7, 2022
  108. Junio C HamanoFeb 8, 2022
  109. Derrick StoleeFeb 9, 2022
  110. Junio C HamanoFeb 9, 2022
  111. Derrick StoleeFeb 9, 2022
  112. Elijah NewrenFeb 9, 2022
  113. Junio C HamanoFeb 9, 2022
  114. Eric SunshineFeb 15, 2022
  115. Junio C HamanoFeb 16, 2022
  116. Elijah NewrenFeb 9, 2022
  117. Junio C HamanoFeb 9, 2022
  118. 2/6 worktree: create init_worktree_config()Derrick Stolee via GitGitGadget, Feb 7, 2022
  119. Junio C HamanoFeb 8, 2022
  120. Derrick StoleeFeb 9, 2022
  121. Junio C HamanoFeb 9, 2022
  122. Elijah NewrenFeb 9, 2022
  123. 3/6 config: add repo_config_set_worktree_gently()Derrick Stolee via GitGitGadget, Feb 7, 2022
  124. Junio C HamanoFeb 8, 2022
  125. Derrick StoleeFeb 9, 2022
  126. Junio C HamanoFeb 9, 2022
  127. Derrick StoleeFeb 10, 2022
  128. Junio C HamanoFeb 10, 2022
  129. 4/6 sparse-checkout: set worktree-config correctlyDerrick Stolee via GitGitGadget, Feb 7, 2022
  130. 5/6 worktree: copy sparse-checkout patterns and config on addDerrick Stolee via GitGitGadget, Feb 7, 2022
  131. Eric SunshineFeb 15, 2022
  132. 6/6 config: make git_configset_get_string_tmp() privateDerrick Stolee via GitGitGadget, Feb 7, 2022
  133. Elijah NewrenFeb 8, 2022
  134. Eric SunshineFeb 8, 2022
  135. Elijah NewrenFeb 8, 2022
  136. Eric SunshineFeb 8, 2022
  137. Eric SunshineFeb 16, 2022
  138. Derrick StoleeFeb 8, 2022

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.