From: Derrick Stolee <stolee@gmail.com>
To: Elijah Newren <newren@gmail.com>, Victoria Dye <vdye@github.com>,
Lessley Dennington <lessleydennington@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: 2.34 regression (and workaround): deleting untracked files both outside *and inside* desired sparsity cone
Date: Wed, 1 Dec 2021 14:19:32 -0500 [thread overview]
Message-ID: <9c7afd37-9940-e6e7-da41-8a44840defb3@gmail.com> (raw)
In-Reply-To: <CABPp-BE8TJ8QGAQWsSGT7S+9Xp-XmApcC9PSw3K=RQOP0rt+PQ@mail.gmail.com>
On 12/1/2021 12:16 PM, Elijah Newren wrote:
> Hi,
>
> I've got a proposal for changing the sparse-checkout command slightly;
> but it probably doesn't make sense without the context of the bugs
> (old and new) we are facing. Consider this an RFC, with the final
> bullet point particularly in need of comment and ideas.
>
> == Background ==
>
> sparse-checkouts in cone mode are documented as being obtained either
> by using the `--sparse` flag to `git clone`, ...
The `--sparse` flag doesn't initialize cone mode, unfortunately.
> git sparse-checkout init --cone [--sparse-index]
> git sparse-checkout set ...
>
> The first step has traditionally deleted all the tracked files from
> the working tree, except in the toplevel directory, and the second
> restores all the tracked files that are wanted.
>
> (Usage context:)
> My understanding is Microsoft never uses this sequence, instead using
> the --sparse flag to `git clone`. In contrast, at Palantir the
> --sparse flag to clone is rarely used.
We use the sparse-checkout builtin. From the Scalar patch series,
you can see that we don't call "git clone" at all, but instead
"scalar clone" does a lot with "git init" and works from there by
setting config and fetching at the correct time.
> == The (New) Bug ==
>
> Starting with Git 2.34, each step will delete all ignored files
> outside the sparsity paths specified to the individual command in
> question. We are totally onboard with deleting ignored files outside
> the sparsity paths the user wants, but the first command is required
> according to the documentation and does not allow specifying any
> sparsity paths. Since it does not allow specifying any sparsity
> paths, it treats *everything* as outside and essentially deletes all
> ignored files everywhere. That's not workable for us. We want a
> single command for changing to a sparse-checkout.
Ah, since 'git sparse-checkout set' would work differently if not
in cone mode, I see the problem. It's a little too much to manually
set core.sparseCheckoutCone=true before running the 'set' command,
probably.
> == The Current Workaround ==
>
> Luckily, having these two commands separate isn't enforced, and the
> first command is basically roughly equivalent to setting a few config
> variables and then running `sparse-checkout set` with an empty set of
> paths. So, currently, we can just do the config setting part of init
> manually, and then skip the rest of init, and then call our desired
> `set` command:
> git config extensions.worktreeConfig true
> git config --worktree core.sparseCheckout true
> git config --worktree core.sparseCheckoutCone true
> git sparse-checkout set ...
Which you have already worked out.
> Since we're using a wrapper anyway (for computing dependencies and
> determining the list of directories to include), it was relatively
> easy for us to add this workaround.
>
> However, it is not clear that our current workaround will continue
> functioning with future versions of git, particularly if
> `sparse-checkout init` gains more options. In fact, it already
> doesn't handle --sparse-index.
Right. It's _yet another_ config option to tweak.
> == Long term proposal ==
>
> Make `set` do both the work of `init` and `set`.
>
> This means:
> * `set` gains the ability to parse both --cone and --sparse-index
> (in addition to --stdin, etc.)
> * If the sparse-index is not initialized, `set` does the
> initialization work of `init`.
> * Modify the `init` documentation to mark it as deprecated,
> mentioning the 2-3 bugs above as reasons why.
> * We could effectively just turn `git sparse-checkout init ...` into
> an alias for `git sparse-checkout set ...`, since init's parameters
> would be a subset of those that `set` accepts. However, the latter
> might interact badly with allowing a user to toggle sparse-index on
> and off in the middle of a sparse-checkout...so maybe we need
> something more? Alternatively, we could leave `init` as-is and just
> consider it set in concrete, possibly risking it becoming
> non-functional in a future upgrade. Hmm...
I think this is a good plan. Making 'init' the same as 'set' with
no paths makes sense to me. We would want to be careful now that
"--option" could be interpreted as a path to recommend using
git sparse-checkout set <options> -- <path1> ... <pathN>
While you are here, I would be interested in making 'git clone
--sparse' default to cone mode. Or, should it be 'git clone
--sparse=cone' or something? Not making it default to cone mode
is a big regret of mine.
Thanks,
-Stolee
next prev parent reply other threads:[~2021-12-01 19:19 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-01 17:16 2.34 regression (and workaround): deleting untracked files both outside *and inside* desired sparsity cone Elijah Newren
2021-12-01 19:19 ` Derrick Stolee [this message]
2021-12-01 23:40 ` Elijah Newren
2021-12-02 0:41 ` Derrick Stolee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9c7afd37-9940-e6e7-da41-8a44840defb3@gmail.com \
--to=stolee@gmail.com \
--cc=git@vger.kernel.org \
--cc=lessleydennington@gmail.com \
--cc=newren@gmail.com \
--cc=vdye@github.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).