* Improvement: `git-maintenance` to allow configuring of remotes to fetch
@ 2024-08-26 11:50 Shubham Kanodia
2024-08-28 11:32 ` Patrick Steinhardt
0 siblings, 1 reply; 10+ messages in thread
From: Shubham Kanodia @ 2024-08-26 11:50 UTC (permalink / raw)
To: git
`git-maintenance` aims to improve the health & performance of
especially large git repositories.
A part of git maintenance tasks is `prefetch`.
However, at the moment, it prefetches all objects from all branches —
> The prefetch task updates the object directory with the latest objects from all registered remotes.
This seems non-optimal for repositories where users use the main
repository to fork branches (instead of personal forks) as the remote
could have thousands of refs and objects from branches that a user may
not care about, leading to a very large prefetch dir.
For large repositories, it might instead be helpful to only fetch
objects on `main` or `master` because those are the ones most likely
to be used by users.
To this effect, git maintenance should perhaps expose a
maintenance.prefetch.refs setting that subsets prefetching only to
certain references.
Is this something that has been raised before / is in works by any
chance or something that would be an acceptable contribution?
--
Regards,
Shubham Kanodia
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-08-26 11:50 Improvement: `git-maintenance` to allow configuring of remotes to fetch Shubham Kanodia
@ 2024-08-28 11:32 ` Patrick Steinhardt
2024-08-28 16:31 ` Junio C Hamano
0 siblings, 1 reply; 10+ messages in thread
From: Patrick Steinhardt @ 2024-08-28 11:32 UTC (permalink / raw)
To: Shubham Kanodia; +Cc: git
On Mon, Aug 26, 2024 at 05:20:50PM +0530, Shubham Kanodia wrote:
> `git-maintenance` aims to improve the health & performance of
> especially large git repositories.
> A part of git maintenance tasks is `prefetch`.
>
> However, at the moment, it prefetches all objects from all branches —
>
> > The prefetch task updates the object directory with the latest objects from all registered remotes.
>
> This seems non-optimal for repositories where users use the main
> repository to fork branches (instead of personal forks) as the remote
> could have thousands of refs and objects from branches that a user may
> not care about, leading to a very large prefetch dir.
>
> For large repositories, it might instead be helpful to only fetch
> objects on `main` or `master` because those are the ones most likely
> to be used by users.
>
> To this effect, git maintenance should perhaps expose a
> maintenance.prefetch.refs setting that subsets prefetching only to
> certain references.
I think that this makes sense as an addition. We would have to think
about things like globbing and whatnot, such that we can say e.g. to
prefetch only tags, only branches or only a subset thereof. We may even
decide to use refspecs here, which could be the most flexible way of
configuring this. We already use the default refspecs anyway -- the only
thing we change is that we prefix the refspec destination with
"refs/prefetch/". So allowing the user to override the refspec used for
prefetching makes sense.
It opens up another question though: if you've got multiple remotes in a
repository, do we also want to make it configurable which of these
should be fetched from? And if you do, do you want to allow configuring
refs to fetch per remote? I guess the answer to both of these questions
would be "yes".
> Is this something that has been raised before / is in works by any
> chance or something that would be an acceptable contribution?
I'm not aware of any discussion around this, and think that this feature
does make sense indeed.
Patrick
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-08-28 11:32 ` Patrick Steinhardt
@ 2024-08-28 16:31 ` Junio C Hamano
2024-09-02 15:46 ` Shubham Kanodia
0 siblings, 1 reply; 10+ messages in thread
From: Junio C Hamano @ 2024-08-28 16:31 UTC (permalink / raw)
To: Patrick Steinhardt; +Cc: Shubham Kanodia, git
Patrick Steinhardt <ps@pks.im> writes:
> I'm not aware of any discussion around this...
I do not think so, either.
I agree that it makes as much sense to limit prefetches to a subset
of remotes as it makes sense to limit to certain hierarchies (e.g.
excluding refs/changes/ or even limiting to refs/heads/seen and
nothing else).
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-08-28 16:31 ` Junio C Hamano
@ 2024-09-02 15:46 ` Shubham Kanodia
2024-09-03 5:18 ` Patrick Steinhardt
0 siblings, 1 reply; 10+ messages in thread
From: Shubham Kanodia @ 2024-09-02 15:46 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Patrick Steinhardt, git
> Patrick Steinhardt <ps@pks.im> writes:
>
> > I'm not aware of any discussion around this...
>
> I do not think so, either.
>
> I agree that it makes as much sense to limit prefetches to a subset
> of remotes as it makes sense to limit to certain hierarchies (e.g.
> excluding refs/changes/ or even limiting to refs/heads/seen and
> nothing else).
I'm seeking advice on the configuration option structure for this
feature. The typical config format for maintenance tasks seems to be
as follows:
`maintenance.<task-name>.<option>`
A natural extension of this for the prefetch task could be:
```
git config maintenance.prefetch.<remote-name>.refs refs/heads/master
```
In this structure, the 'refs' value represents only the source part of
a refspec, and both remote and refs can be configured.
Specifying a full refspec isn't necessary since the --prefetch option
may override the destination anyway.
While I've successfully implemented this approach, I'm open to
suggestions for alternative configuration options. My concerns are:
1. Most Git configurations are nested up to three levels deep, whereas
this proposal introduces a fourth level.
2. This configuration appears in the config file as:
```
[maintenance "prefetch.origin"]
refs = refs/heads/master
```
which might look odd?
Also, hopefully my mail is formatted better this time!
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-09-02 15:46 ` Shubham Kanodia
@ 2024-09-03 5:18 ` Patrick Steinhardt
2024-09-03 6:01 ` Shubham Kanodia
2024-09-03 16:07 ` Junio C Hamano
0 siblings, 2 replies; 10+ messages in thread
From: Patrick Steinhardt @ 2024-09-03 5:18 UTC (permalink / raw)
To: Shubham Kanodia; +Cc: Junio C Hamano, git
On Mon, Sep 02, 2024 at 09:16:24PM +0530, Shubham Kanodia wrote:
> > Patrick Steinhardt <ps@pks.im> writes:
> >
> > > I'm not aware of any discussion around this...
> >
> > I do not think so, either.
> >
> > I agree that it makes as much sense to limit prefetches to a subset
> > of remotes as it makes sense to limit to certain hierarchies (e.g.
> > excluding refs/changes/ or even limiting to refs/heads/seen and
> > nothing else).
>
> I'm seeking advice on the configuration option structure for this
> feature. The typical config format for maintenance tasks seems to be
> as follows:
>
> `maintenance.<task-name>.<option>`
>
> A natural extension of this for the prefetch task could be:
>
> ```
> git config maintenance.prefetch.<remote-name>.refs refs/heads/master
> ```
>
> In this structure, the 'refs' value represents only the source part of
> a refspec, and both remote and refs can be configured.
> Specifying a full refspec isn't necessary since the --prefetch option
> may override the destination anyway.
>
> While I've successfully implemented this approach, I'm open to
> suggestions for alternative configuration options. My concerns are:
>
> 1. Most Git configurations are nested up to three levels deep, whereas
> this proposal introduces a fourth level.
> 2. This configuration appears in the config file as:
>
> ```
> [maintenance "prefetch.origin"]
> refs = refs/heads/master
> ```
> which might look odd?
Agreed, it does. To me, the most natural way to configure this would be
as part of the remotes themselves:
```
[remote "origin"]
url = https://example.com/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
# Whether or not the prefetch task shall fatch this repository.
# Defaults to `true`.
prefetch = true
# An arbitrary number of refspecs used by the prefetch task.
# Overrides the fetch refspec if given, otherwise we fall back to
# using the fetch refspec.
prefetchRefspec = +refs/heads/main:refs/remotes/origin/main
```
The prefetch refspec would be rewritten by git-maintenance(1) such that
the destination part (the right-hand side of the refspec) is prefixed
with `refs/prefetch/`, same as the fetch refspec would be changed in
this way.
An alternative would be to _not_ rewrite the prefetch refspec at all and
thus allow the user to prefetch into arbitrary hierarchies. But I'm a
bit worried that this might cause users to misconfigure prefetches by
accident, causing it to overwrite their usual set of refs.
> Also, hopefully my mail is formatted better this time!
It is, thanks!
Patrick
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-09-03 5:18 ` Patrick Steinhardt
@ 2024-09-03 6:01 ` Shubham Kanodia
2024-09-03 9:48 ` Patrick Steinhardt
2024-09-03 16:07 ` Junio C Hamano
1 sibling, 1 reply; 10+ messages in thread
From: Shubham Kanodia @ 2024-09-03 6:01 UTC (permalink / raw)
To: Patrick Steinhardt; +Cc: Junio C Hamano, git
On Tue, Sep 3, 2024 at 10:48 AM Patrick Steinhardt <ps@pks.im> wrote:
>
> On Mon, Sep 02, 2024 at 09:16:24PM +0530, Shubham Kanodia wrote:
> > > Patrick Steinhardt <ps@pks.im> writes:
> > >
> > > > I'm not aware of any discussion around this...
> > >
> > > I do not think so, either.
> > >
> > > I agree that it makes as much sense to limit prefetches to a subset
> > > of remotes as it makes sense to limit to certain hierarchies (e.g.
> > > excluding refs/changes/ or even limiting to refs/heads/seen and
> > > nothing else).
> >
> > I'm seeking advice on the configuration option structure for this
> > feature. The typical config format for maintenance tasks seems to be
> > as follows:
> >
> > `maintenance.<task-name>.<option>`
> >
> > A natural extension of this for the prefetch task could be:
> >
> > ```
> > git config maintenance.prefetch.<remote-name>.refs refs/heads/master
> > ```
> >
> > In this structure, the 'refs' value represents only the source part of
> > a refspec, and both remote and refs can be configured.
> > Specifying a full refspec isn't necessary since the --prefetch option
> > may override the destination anyway.
> >
> > While I've successfully implemented this approach, I'm open to
> > suggestions for alternative configuration options. My concerns are:
> >
> > 1. Most Git configurations are nested up to three levels deep, whereas
> > this proposal introduces a fourth level.
> > 2. This configuration appears in the config file as:
> >
> > ```
> > [maintenance "prefetch.origin"]
> > refs = refs/heads/master
> > ```
> > which might look odd?
>
> Agreed, it does. To me, the most natural way to configure this would be
> as part of the remotes themselves:
>
> ```
> [remote "origin"]
> url = https://example.com/repo.git
> fetch = +refs/heads/*:refs/remotes/origin/*
> # Whether or not the prefetch task shall fatch this repository.
> # Defaults to `true`.
> prefetch = true
> # An arbitrary number of refspecs used by the prefetch task.
> # Overrides the fetch refspec if given, otherwise we fall back to
> # using the fetch refspec.
> prefetchRefspec = +refs/heads/main:refs/remotes/origin/main
> ```
>
> The prefetch refspec would be rewritten by git-maintenance(1) such that
> the destination part (the right-hand side of the refspec) is prefixed
> with `refs/prefetch/`, same as the fetch refspec would be changed in
> this way.
>
> An alternative would be to _not_ rewrite the prefetch refspec at all and
> thus allow the user to prefetch into arbitrary hierarchies. But I'm a
> bit worried that this might cause users to misconfigure prefetches by
> accident, causing it to overwrite their usual set of refs.
>
> > Also, hopefully my mail is formatted better this time!
>
> It is, thanks!
>
> Patrick
Interesting. I guess if we put this in `remote.*` instead of
`maintenance.*` what's unclear then is if this setting should also be
respected by `git fetch --prefetch`
when used outside the context of a maintenance task — since that'd
probably be a bigger change.
For instance, the `skipFetchAll` remote config option seems to apply
to prefetches (within maintenance & outside) and normal fetches.
Additionally, we'd need to discuss what to do with backward compatibility:
If we were designing maintenance prefetch right now, it'd probably
make sense not to fetch it for any remote / refspec by default unless
explicitly enabled since
fetching all refs can be a waste of space in more cases than not.
However, since the current behaviour already fetches all remotes and
refs, I don't know if breaking this is something we could do? If not,
the behavior would be —
1. If none of the remotes specify a `prefetch: true`, then prefetch
all remotes and refs (backwards compat)
2. If at least one of the remotes specifies `prefetch: true` then only
that remote should be fetched
3. Two-tier `fetch` / `prefetchRefSpec` hierarchy to decide which refs
to fetch (we can decide on the name later as `fetch` and
`prefetchRefSpec` seem asymmetrical)
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-09-03 6:01 ` Shubham Kanodia
@ 2024-09-03 9:48 ` Patrick Steinhardt
0 siblings, 0 replies; 10+ messages in thread
From: Patrick Steinhardt @ 2024-09-03 9:48 UTC (permalink / raw)
To: Shubham Kanodia; +Cc: Junio C Hamano, git
On Tue, Sep 03, 2024 at 11:31:04AM +0530, Shubham Kanodia wrote:
> On Tue, Sep 3, 2024 at 10:48 AM Patrick Steinhardt <ps@pks.im> wrote:
> > On Mon, Sep 02, 2024 at 09:16:24PM +0530, Shubham Kanodia wrote:
> > > > Patrick Steinhardt <ps@pks.im> writes:
> > > >
> > > > > I'm not aware of any discussion around this...
> > > >
> > > > I do not think so, either.
> > > >
> > > > I agree that it makes as much sense to limit prefetches to a subset
> > > > of remotes as it makes sense to limit to certain hierarchies (e.g.
> > > > excluding refs/changes/ or even limiting to refs/heads/seen and
> > > > nothing else).
> > >
> > > I'm seeking advice on the configuration option structure for this
> > > feature. The typical config format for maintenance tasks seems to be
> > > as follows:
> > >
> > > `maintenance.<task-name>.<option>`
> > >
> > > A natural extension of this for the prefetch task could be:
> > >
> > > ```
> > > git config maintenance.prefetch.<remote-name>.refs refs/heads/master
> > > ```
> > >
> > > In this structure, the 'refs' value represents only the source part of
> > > a refspec, and both remote and refs can be configured.
> > > Specifying a full refspec isn't necessary since the --prefetch option
> > > may override the destination anyway.
> > >
> > > While I've successfully implemented this approach, I'm open to
> > > suggestions for alternative configuration options. My concerns are:
> > >
> > > 1. Most Git configurations are nested up to three levels deep, whereas
> > > this proposal introduces a fourth level.
> > > 2. This configuration appears in the config file as:
> > >
> > > ```
> > > [maintenance "prefetch.origin"]
> > > refs = refs/heads/master
> > > ```
> > > which might look odd?
> >
> > Agreed, it does. To me, the most natural way to configure this would be
> > as part of the remotes themselves:
> >
> > ```
> > [remote "origin"]
> > url = https://example.com/repo.git
> > fetch = +refs/heads/*:refs/remotes/origin/*
> > # Whether or not the prefetch task shall fatch this repository.
> > # Defaults to `true`.
> > prefetch = true
> > # An arbitrary number of refspecs used by the prefetch task.
> > # Overrides the fetch refspec if given, otherwise we fall back to
> > # using the fetch refspec.
> > prefetchRefspec = +refs/heads/main:refs/remotes/origin/main
> > ```
> >
> > The prefetch refspec would be rewritten by git-maintenance(1) such that
> > the destination part (the right-hand side of the refspec) is prefixed
> > with `refs/prefetch/`, same as the fetch refspec would be changed in
> > this way.
> >
> > An alternative would be to _not_ rewrite the prefetch refspec at all and
> > thus allow the user to prefetch into arbitrary hierarchies. But I'm a
> > bit worried that this might cause users to misconfigure prefetches by
> > accident, causing it to overwrite their usual set of refs.
> >
> > > Also, hopefully my mail is formatted better this time!
> >
> > It is, thanks!
> >
> > Patrick
>
> Interesting. I guess if we put this in `remote.*` instead of
> `maintenance.*` what's unclear then is if this setting should also be
> respected by `git fetch --prefetch`
> when used outside the context of a maintenance task — since that'd
> probably be a bigger change.
I would've expected it to already do, given that it is explicitly
documented in git-fetch(1) to be for git-maintenance(1). I don't have
enough knowledge around the prefetching task though to be able to tell
whether it should or shouldn't.
> For instance, the `skipFetchAll` remote config option seems to apply
> to prefetches (within maintenance & outside) and normal fetches.
>
> Additionally, we'd need to discuss what to do with backward compatibility:
>
> If we were designing maintenance prefetch right now, it'd probably
> make sense not to fetch it for any remote / refspec by default unless
> explicitly enabled since
> fetching all refs can be a waste of space in more cases than not.
>
> However, since the current behaviour already fetches all remotes and
> refs, I don't know if breaking this is something we could do? If not,
> the behavior would be —
>
> 1. If none of the remotes specify a `prefetch: true`, then prefetch
> all remotes and refs (backwards compat)
> 2. If at least one of the remotes specifies `prefetch: true` then only
> that remote should be fetched
> 3. Two-tier `fetch` / `prefetchRefSpec` hierarchy to decide which refs
> to fetch (we can decide on the name later as `fetch` and
> `prefetchRefSpec` seem asymmetrical)
I don't think we should change the current default. As mentioned in my
mail, `prefetch` should default to `true` such that the behaviour as we
have it right now is unchanged. Thus any remote that doesn't have it
gets fetched by default, and to disable fetching a specific remote you
would have to set `remote.<name>.prefetch = false`.
While the second item, namely change the default to `false` when there
is at least one `prefetch` config, might be something to consider. But
in the end I think it would lead to confusing behaviour, so I'd not go
there personally.
Patrick
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-09-03 5:18 ` Patrick Steinhardt
2024-09-03 6:01 ` Shubham Kanodia
@ 2024-09-03 16:07 ` Junio C Hamano
2024-09-04 16:29 ` Shubham Kanodia
1 sibling, 1 reply; 10+ messages in thread
From: Junio C Hamano @ 2024-09-03 16:07 UTC (permalink / raw)
To: Patrick Steinhardt; +Cc: Shubham Kanodia, git
Patrick Steinhardt <ps@pks.im> writes:
> The prefetch refspec would be rewritten by git-maintenance(1) such that
> the destination part (the right-hand side of the refspec) is prefixed
> with `refs/prefetch/`, same as the fetch refspec would be changed in
> this way.
>
> An alternative would be to _not_ rewrite the prefetch refspec at all and
> thus allow the user to prefetch into arbitrary hierarchies. But I'm a
> bit worried that this might cause users to misconfigure prefetches by
> accident, causing it to overwrite their usual set of refs.
I agree that it is the right place to configure this as attributes
to remotes. It would make it handy if we could give a catch-all
configuration, though. For example:
[remote "origin"]
prefetch = true
prefetchref = refs/heads/* refs/tags/*
[remote "*"]
prefetch = false
may toggle prefetch off for all remotes, except that the tags and
the local branches of the remote "origin" are prefetched. Instead
of a multi-value configuration variable (like remote.*.fetch) where
we need to worry about clearing convention, we can use a regular
"last one wins" variable that is whitespace separated patterns, as
such a pattern can never have a whitespace in it.
As you too agree with the position to consider "prefetch" should be
invisible to the end-users, we should not allow users to specify the
full refspec at all, or if it is forced or not with "+" prefix.
Only accept a set of patterns to match, and keep it opaque where in
the local refs/* hierarchy they are stored. It is an implementation
detail that the users should not have to know about and rely on.
Thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-09-03 16:07 ` Junio C Hamano
@ 2024-09-04 16:29 ` Shubham Kanodia
2024-09-04 18:10 ` Shubham Kanodia
0 siblings, 1 reply; 10+ messages in thread
From: Shubham Kanodia @ 2024-09-04 16:29 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Patrick Steinhardt, git
On Tue, Sep 3, 2024 at 9:37 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Patrick Steinhardt <ps@pks.im> writes:
>
> > The prefetch refspec would be rewritten by git-maintenance(1) such that
> > the destination part (the right-hand side of the refspec) is prefixed
> > with `refs/prefetch/`, same as the fetch refspec would be changed in
> > this way.
> >
> > An alternative would be to _not_ rewrite the prefetch refspec at all and
> > thus allow the user to prefetch into arbitrary hierarchies. But I'm a
> > bit worried that this might cause users to misconfigure prefetches by
> > accident, causing it to overwrite their usual set of refs.
>
> I agree that it is the right place to configure this as attributes
> to remotes. It would make it handy if we could give a catch-all
> configuration, though. For example:
>
> [remote "origin"]
> prefetch = true
> prefetchref = refs/heads/* refs/tags/*
> [remote "*"]
> prefetch = false
>
> may toggle prefetch off for all remotes, except that the tags and
> the local branches of the remote "origin" are prefetched. Instead
> of a multi-value configuration variable (like remote.*.fetch) where
> we need to worry about clearing convention, we can use a regular
> "last one wins" variable that is whitespace separated patterns, as
> such a pattern can never have a whitespace in it.
>
> As you too agree with the position to consider "prefetch" should be
> invisible to the end-users, we should not allow users to specify the
> full refspec at all, or if it is forced or not with "+" prefix.
> Only accept a set of patterns to match, and keep it opaque where in
> the local refs/* hierarchy they are stored. It is an implementation
> detail that the users should not have to know about and rely on.
>
> Thanks.
Right so I have good direction to start working on this. I'm going to
tackle this in a few parts since this is my first contribution —
1. adding a boolean `prefetch` attribute to `remote` — allows control
over remotes that prefetch
2. adding `prefetchref` — allows control over refs per remote.
3. Check if adding a ` [remote "*"]` catchall is a possibility
For the boolean `prefetch` value the —
1. The default would be assumed to be `true`
2. No changes in behavior to any variation of `git fetch --prefetch`
command itself.
If no remote is supplied to `git fetch` then it means default remote,
or if `--all` is used, it means all remotes and `--prefetch` for both
always
prefetches irrespective of the config value.
If I understand the codebase well, the changes would primarily affect
`remote.c` and `gc.c`.
Also much thanks for the feedback both of you've given thus far.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Improvement: `git-maintenance` to allow configuring of remotes to fetch
2024-09-04 16:29 ` Shubham Kanodia
@ 2024-09-04 18:10 ` Shubham Kanodia
0 siblings, 0 replies; 10+ messages in thread
From: Shubham Kanodia @ 2024-09-04 18:10 UTC (permalink / raw)
To: Junio C Hamano, Patrick Steinhardt; +Cc: git
On Wed, Sep 4, 2024 at 9:59 PM Shubham Kanodia <shubhamsizzles@gmail.com> wrote:
>
> On Tue, Sep 3, 2024 at 9:37 PM Junio C Hamano <gitster@pobox.com> wrote:
> >
> > Patrick Steinhardt <ps@pks.im> writes:
> >
> > > The prefetch refspec would be rewritten by git-maintenance(1) such that
> > > the destination part (the right-hand side of the refspec) is prefixed
> > > with `refs/prefetch/`, same as the fetch refspec would be changed in
> > > this way.
> > >
> > > An alternative would be to _not_ rewrite the prefetch refspec at all and
> > > thus allow the user to prefetch into arbitrary hierarchies. But I'm a
> > > bit worried that this might cause users to misconfigure prefetches by
> > > accident, causing it to overwrite their usual set of refs.
> >
> > I agree that it is the right place to configure this as attributes
> > to remotes. It would make it handy if we could give a catch-all
> > configuration, though. For example:
> >
> > [remote "origin"]
> > prefetch = true
> > prefetchref = refs/heads/* refs/tags/*
> > [remote "*"]
> > prefetch = false
> >
> > may toggle prefetch off for all remotes, except that the tags and
> > the local branches of the remote "origin" are prefetched. Instead
> > of a multi-value configuration variable (like remote.*.fetch) where
> > we need to worry about clearing convention, we can use a regular
> > "last one wins" variable that is whitespace separated patterns, as
> > such a pattern can never have a whitespace in it.
> >
> > As you too agree with the position to consider "prefetch" should be
> > invisible to the end-users, we should not allow users to specify the
> > full refspec at all, or if it is forced or not with "+" prefix.
> > Only accept a set of patterns to match, and keep it opaque where in
> > the local refs/* hierarchy they are stored. It is an implementation
> > detail that the users should not have to know about and rely on.
> >
> > Thanks.
>
> Right so I have good direction to start working on this. I'm going to
> tackle this in a few parts since this is my first contribution —
>
> 1. adding a boolean `prefetch` attribute to `remote` — allows control
> over remotes that prefetch
> 2. adding `prefetchref` — allows control over refs per remote.
> 3. Check if adding a ` [remote "*"]` catchall is a possibility
>
> For the boolean `prefetch` value the —
> 1. The default would be assumed to be `true`
> 2. No changes in behavior to any variation of `git fetch --prefetch`
> command itself.
> If no remote is supplied to `git fetch` then it means default remote,
> or if `--all` is used, it means all remotes and `--prefetch` for both
> always
> prefetches irrespective of the config value.
>
> If I understand the codebase well, the changes would primarily affect
> `remote.c` and `gc.c`.
>
> Also much thanks for the feedback both of you've given thus far.
I've published my first patch using gitgitgadget. I'm still figuring
out what the best way to link to that is but
I'll add both for now:
https://lore.kernel.org/git/pull.1779.git.1725472799637.gitgitgadget@gmail.com/T/#u
https://github.com/gitgitgadget/git/pull/1779
--
Regards,
Shubham Kanodia
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-09-04 18:10 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-26 11:50 Improvement: `git-maintenance` to allow configuring of remotes to fetch Shubham Kanodia
2024-08-28 11:32 ` Patrick Steinhardt
2024-08-28 16:31 ` Junio C Hamano
2024-09-02 15:46 ` Shubham Kanodia
2024-09-03 5:18 ` Patrick Steinhardt
2024-09-03 6:01 ` Shubham Kanodia
2024-09-03 9:48 ` Patrick Steinhardt
2024-09-03 16:07 ` Junio C Hamano
2024-09-04 16:29 ` Shubham Kanodia
2024-09-04 18:10 ` Shubham Kanodia
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).