* [Feature request] Separate explicit fetch mapping from default fetch selection
@ 2026-08-06 22:26 Douglas Puchalski (dpuchals)
2026-08-07 2:42 ` Junio C Hamano
0 siblings, 1 reply; 4+ messages in thread
From: Douglas Puchalski (dpuchals) @ 2026-08-06 22:26 UTC (permalink / raw)
To: git@vger.kernel.org
Git version: 2.55.0
Environment: macOS 26.6
I configure a remote to fetch only a small default set of branches:
[remote "origin"]
fetch = +refs/heads/main:refs/remotes/origin/main
fetch = +refs/heads/team/*:refs/remotes/origin/team/*
This prevents `git fetch origin` from fetching and updating a very large
number of remote branches.
When I explicitly request another branch:
git fetch origin topic/example
Git fetches the branch into FETCH_HEAD but does not create or update:
refs/remotes/origin/topic/example
Consequently, the natural checkout command fails:
git checkout -b topic/example origin/topic/example
The documented behavior couples two separate policies in
`remote.<name>.fetch`:
1. Which branches an ordinary `git fetch <remote>` selects automatically.
2. Where an explicitly requested branch is stored locally.
Please provide a configuration or default behavior under which an explicitly
named remote branch is stored as the corresponding remote-tracking ref, while
the remote's automatic fetch set remains restricted.
With that behavior, this sequence would work:
git fetch origin topic/example
git checkout -b topic/example origin/topic/example
It should not require fetching every remote branch, repeating the branch name
in a two-sided refspec, supplying `--refmap`, defining aliases, or handing the
result between commands through FETCH_HEAD. FETCH_HEAD is shared mutable state
and can be overwritten by another fetch between commands.
A backward-compatible opt-in configuration would address existing scripts
that rely on source-only fetches remaining temporary.
Relevant documentation:
https://git-scm <https://git-scm/>.com/docs/git-fetch
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [Feature request] Separate explicit fetch mapping from default fetch selection
2026-08-06 22:26 [Feature request] Separate explicit fetch mapping from default fetch selection Douglas Puchalski (dpuchals)
@ 2026-08-07 2:42 ` Junio C Hamano
2026-08-07 13:08 ` Phillip Wood
0 siblings, 1 reply; 4+ messages in thread
From: Junio C Hamano @ 2026-08-07 2:42 UTC (permalink / raw)
To: Douglas Puchalski (dpuchals); +Cc: git@vger.kernel.org
"Douglas Puchalski (dpuchals)" <dpuchals@cisco.com> writes:
> Git version: 2.55.0
> Environment: macOS 26.6
>
> I configure a remote to fetch only a small default set of branches:
>
> [remote "origin"]
> fetch = +refs/heads/main:refs/remotes/origin/main
> fetch = +refs/heads/team/*:refs/remotes/origin/team/*
>
> This prevents `git fetch origin` from fetching and updating a very large
> number of remote branches.
>
> When I explicitly request another branch:
>
> git fetch origin topic/example
>
> Git fetches the branch into FETCH_HEAD but does not create or update:
>
> refs/remotes/origin/topic/example
I haven't thought things through, but I suspect that what you want
might be an opposite of explicitly listing what is tracked on
remote.*.fetch configuration, but having remotes/origin/* hierarchy
of refs as the source of the tracking information.
It was a long ago this was invented, and I haven't used it for
almost forever, but shouldn't this
$ git fetch \
--refmap="refs/heads/*:refs/remotes/origin/*" \
origin topic/example
do what you want to do? If so, perhaps it would make a good
starting point to make it easier to use (e.g., perhaps a
configuration variable can specify the refmap to be used, or
something).
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [Feature request] Separate explicit fetch mapping from default fetch selection
2026-08-07 2:42 ` Junio C Hamano
@ 2026-08-07 13:08 ` Phillip Wood
2026-08-07 14:55 ` Junio C Hamano
0 siblings, 1 reply; 4+ messages in thread
From: Phillip Wood @ 2026-08-07 13:08 UTC (permalink / raw)
To: Junio C Hamano, Douglas Puchalski (dpuchals); +Cc: git@vger.kernel.org
On 07/08/2026 03:42, Junio C Hamano wrote:
> "Douglas Puchalski (dpuchals)" <dpuchals@cisco.com> writes:
>
>> Git version: 2.55.0
>> Environment: macOS 26.6
>>
>> I configure a remote to fetch only a small default set of branches:
>>
>> [remote "origin"]
>> fetch = +refs/heads/main:refs/remotes/origin/main
>> fetch = +refs/heads/team/*:refs/remotes/origin/team/*
>>
>> This prevents `git fetch origin` from fetching and updating a very large
>> number of remote branches.
>>
>> When I explicitly request another branch:
>>
>> git fetch origin topic/example
>>
>> Git fetches the branch into FETCH_HEAD but does not create or update:
>>
>> refs/remotes/origin/topic/example
That annoys me too. There is a similar problem with the push refspec if
you want to use it to map the refname rather than specify a default set
of branches to push.
> I haven't thought things through, but I suspect that what you want
> might be an opposite of explicitly listing what is tracked on
> remote.*.fetch configuration, but having remotes/origin/* hierarchy
> of refs as the source of the tracking information.
>
> It was a long ago this was invented, and I haven't used it for
> almost forever, but shouldn't this
>
> $ git fetch \
> --refmap="refs/heads/*:refs/remotes/origin/*" \
> origin topic/example
>
> do what you want to do? If so, perhaps it would make a good
> starting point to make it easier to use (e.g., perhaps a
> configuration variable can specify the refmap to be used, or
> something).
So we'd have something like "remote.<remote>.fetchMap" and
"remote.<remote>.pushMap" that mapped refnames, but did not affect what
gets fetched or push by default? That sounds useful (I've not thought
through the interaction with the existing settings though).
One of my other bugbears about the refspec config is that the first
matching one wins, rather than the longest match so you have to edit the
config file rather than use "git config" to add a refspec that matches a
sepcific branch, otherwise the default "refs/heads/*:..." that's created
when the remote is added is used instead because it comes first.
Thanks
Phillip
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Feature request] Separate explicit fetch mapping from default fetch selection
2026-08-07 13:08 ` Phillip Wood
@ 2026-08-07 14:55 ` Junio C Hamano
0 siblings, 0 replies; 4+ messages in thread
From: Junio C Hamano @ 2026-08-07 14:55 UTC (permalink / raw)
To: Phillip Wood; +Cc: Douglas Puchalski (dpuchals), git@vger.kernel.org
Phillip Wood <phillip.wood123@gmail.com> writes:
>> It was a long ago this was invented, and I haven't used it for
>> almost forever, but shouldn't this
>>
>> $ git fetch \
>> --refmap="refs/heads/*:refs/remotes/origin/*" \
>> origin topic/example
>>
>> do what you want to do? If so, perhaps it would make a good
>> starting point to make it easier to use (e.g., perhaps a
>> configuration variable can specify the refmap to be used, or
>> something).
>
> So we'd have something like "remote.<remote>.fetchMap" and
> "remote.<remote>.pushMap" that mapped refnames, but did not affect what
> gets fetched or push by default? That sounds useful (I've not thought
> through the interaction with the existing settings though).
As I said, I do not know what the final system should look like,
but the idea behind 'refmap' was to separate (A) the rule
describing the correspondence between reference names on their end
and those on our end, and (B) the specification of which source
references are transferred to the destination repository. Since the
transfer can work both ways, we would need two sets of maps, one for
each direction.
Once established, I suspect that 'git fetch' could learn something
like the 'matching' mode that 'git push' has in 'push.default'.
Using that mode, the OP's everyday 'git fetch' would then: (1)
interact with the default remote; (2) decide which of their
references to fetch by reverse-mapping the remote-tracking branches
we already have using the fetch 'refmap'; and (3) update the
remote-tracking references using those references we decided to
fetch in the previous step. If the OP decides to extend the area of
interest by fetching a new branch from the remote,
$ git fetch origin a-new-topic
naming only the remote and their branch, we would know which
remote-tracking branch to store the result in and add a new
refs/remotes/origin/a-new-topic remote-tracking branch. This would
automatically extend what the next 'git fetch' grabs from them.
Or something like that, perhaps?
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-08-07 14:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-06 22:26 [Feature request] Separate explicit fetch mapping from default fetch selection Douglas Puchalski (dpuchals)
2026-08-07 2:42 ` Junio C Hamano
2026-08-07 13:08 ` Phillip Wood
2026-08-07 14:55 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox