Thread (24 messages) 24 messages, 5 authors, 2d ago

Re: [PATCH] fetch: add config to avoid fetching every branch in shallow repo

From: D. Ben Knoble <hidden>
Date: 2026-09-23 16:55:19

On Wed, Sep 23, 2026 at 11:49 AM Junio C Hamano [off-list ref] wrote:
Phillip Wood [off-list ref] writes:
quoted
quoted
when 'remote.*.fetch' is configured to signal that special mode,
'git fetch' would:

  - Find each local branch that has its '@{upstream}' set to a branch
    at the remote we are fetching from.

  - Fetch these branches at the remote that our local branches care
    about.
I can see that being useful fetch mode for a remote that we've already
fetched from, but for a newly added remote there will be no local
branches with their upstream set to it because "git branch
--set-upstream-to" fails if the upstream does not already exist. So I
like the idea for fetching from existing remotes, but it leaves us with
a chicken-and-egg problem when adding new remotes, so I'm not sure how
it would work in practice.
Just like with "git push there :", you prime the pump by explicitly
doing something (for "push", you do "git push there mine" to express
your preference to work with branch 'mine' and share it with the
remote).

So if we are to allow customizing the refspec used for fetch with
"git remote add", you might do:

    $ git remote add --fetch=: second https://ho.st/git/second

which creates:

        [remote "second"]
                url = https://ho.st/git/second
                fetch = :

(Note: I am not sure if ":" is a good special token to express this
mode of fetching, as I said earlier).

Your initial "git fetch second" without any other arguments will be
a no-op.  You may decide to work on top of their 'main' branch by
running:

    $ git fetch second main:refs/remotes/second/main
I've wanted something similar for notes, so allow me to interject from
the sidelines: it would be even nicer to still have the ability to map
fetches (so that "git fetch second main" did the right thing, creating
a useful remote tracking branch with the usual hierarchy;
configurable, of course) on top of this. So, the first "git fetch
second" does nothing, but "git fetch second main" + creating the
branch does as you describe.
    $ git checkout -b topic -t second/main

At that point, the local branch 'topic' is built on top of their
'main' branch by having its @{upstream} set to that remote-tracking
branch.  After that, running "git fetch" will update 'second/main' and
no other remote-tracking branch.

-- 
D. Ben Knoble
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help