From: "Harald Nordgren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Phillip Wood <phillip.wood123@gmail.com>,
"D. Ben Knoble" <ben.knoble@gmail.com>,
Harald Nordgren <haraldnordgren@gmail.com>,
Harald Nordgren <haraldnordgren@gmail.com>
Subject: [PATCH v13 2/6] fetch: extract collect_upstream_from_remote() helper
Date: Fri, 30 Oct 2026 10:52:26 +0000 [thread overview]
Message-ID: <3f5808cbf390f48ea41325dbe75ec76b17f6e97d.1793357550.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2412.v13.git.git.1793357550.gitgitgadget@gmail.com>
From: Harald Nordgren <haraldnordgren@gmail.com>
When a fetch has no refspec to work from, we decide what to fetch from
two sources: the remote's configured fetch refspec, and the current
branch's upstream, if it lives on that remote. For example, after
git clone --single-branch <url>
git switch -c work
git push -u origin work
the remote's refspec only covers "main", but a refspec-less "git fetch
origin" still fetches "work" into FETCH_HEAD, so that a plain "git
pull" finds the branch to merge. See 49ca2fba39 (fetch: add
branch.*.merge to default ref-prefix extension, 2022-09-08).
That "does this branch build on this remote" check was inlined for
just the current branch. Move it into its own function,
collect_upstream_from_remote(), so the same logic can be reused for
branches other than just the current one.
Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
---
builtin/fetch.c | 18 ++++++++----------
remote.c | 15 +++++++++++++++
remote.h | 9 +++++++++
3 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 305934f5f4..31ec963db7 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1985,8 +1985,6 @@ static int do_fetch(struct transport *transport,
if (rs->nr) {
refspec_ref_prefixes(rs, &transport_ls_refs_options.ref_prefixes);
} else {
- struct branch *branch = branch_get(NULL);
-
if (transport->remote->fetch.nr) {
refspec_ref_prefixes(&transport->remote->fetch,
&transport_ls_refs_options.ref_prefixes);
@@ -2001,14 +1999,14 @@ static int do_fetch(struct transport *transport,
else
follow_remote_head = BUILTIN_FOLLOW_REMOTE_HEAD_DFLT;
}
- if (branch && branch_has_merge_config(branch) &&
- !strcmp(branch->remote_name, transport->remote->name)) {
- int i;
- for (i = 0; i < branch->merge_nr; i++) {
- strvec_push(&transport_ls_refs_options.ref_prefixes,
- branch->merge[i]->src);
- }
- }
+
+ /*
+ * The configured refspec may not cover the current
+ * branch's upstream (e.g. a narrowed -t refspec), so
+ * make sure we can still fetch it regardless.
+ */
+ collect_upstream_from_remote(the_repository, transport->remote,
+ NULL, &transport_ls_refs_options.ref_prefixes);
/*
* If there are no refs specified to fetch, then we just
diff --git a/remote.c b/remote.c
index 9acab2e01a..d4259fe7f3 100644
--- a/remote.c
+++ b/remote.c
@@ -1899,6 +1899,21 @@ int branch_merge_matches(struct branch *branch,
return refname_match(branch->merge[i]->src, refname);
}
+void collect_upstream_from_remote(struct repository *repo,
+ const struct remote *remote,
+ const char *refname,
+ struct strvec *tracked)
+{
+ struct branch *branch = repo_branch_get(repo, refname);
+
+ if (!branch_has_merge_config(branch) ||
+ strcmp(branch->remote_name, remote->name))
+ return;
+
+ for (int i = 0; i < branch->merge_nr; i++)
+ strvec_push(tracked, branch->merge[i]->src);
+}
+
__attribute__((format (printf,2,3)))
static char *error_buf(struct strbuf *err, const char *fmt, ...)
{
diff --git a/remote.h b/remote.h
index ac485a584d..003c8fd180 100644
--- a/remote.h
+++ b/remote.h
@@ -359,6 +359,15 @@ int branch_has_merge_config(struct branch *branch);
int branch_merge_matches(struct branch *, int n, const char *);
+/*
+ * If refname's branch builds on remote, add its upstream on remote to
+ * tracked. A NULL refname means the current branch.
+ */
+void collect_upstream_from_remote(struct repository *repo,
+ const struct remote *remote,
+ const char *refname,
+ struct strvec *tracked);
+
/* list of the remote in a group as configured */
struct remote_group_data {
const char *name;
--
gitgitgadget
next prev parent reply other threads:[~2026-10-30 10:52 UTC|newest]
Thread overview: 130+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-19 14:47 [PATCH] fetch: add config to avoid fetching every branch in shallow repo Harald Nordgren via GitGitGadget
2026-09-21 13:28 ` Phillip Wood
2026-09-21 21:45 ` Harald Nordgren
2026-09-22 13:00 ` Harald Nordgren
2026-09-22 14:53 ` Phillip Wood
2026-09-22 15:37 ` Harald Nordgren
2026-09-23 15:14 ` Phillip Wood
2026-09-22 17:11 ` Junio C Hamano
2026-09-22 21:40 ` Harald Nordgren
2026-09-23 15:19 ` Phillip Wood
2026-09-23 15:34 ` Junio C Hamano
2026-09-23 16:55 ` D. Ben Knoble
2026-09-23 19:50 ` Junio C Hamano
2026-09-24 17:10 ` D. Ben Knoble
2026-09-24 18:02 ` Junio C Hamano
2026-09-23 20:35 ` [PATCH v2] fetch: avoid fetching every branch of a new remote in a " Harald Nordgren via GitGitGadget
2026-09-23 21:38 ` Junio C Hamano
2026-09-25 10:49 ` [PATCH v3 0/4] " Harald Nordgren via GitGitGadget
2026-09-25 10:49 ` [PATCH v3 1/4] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-09-25 22:38 ` Junio C Hamano
2026-09-25 10:50 ` [PATCH v3 2/4] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-09-25 23:26 ` Junio C Hamano
2026-09-25 10:50 ` [PATCH v3 3/4] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-09-25 10:50 ` [PATCH v3 4/4] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-09-29 9:19 ` [PATCH v4 0/4] fetch: avoid fetching every branch of a new remote in a shallow repo Harald Nordgren via GitGitGadget
2026-09-29 9:19 ` [PATCH v4 1/4] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-09-29 9:19 ` [PATCH v4 2/4] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-09-29 9:27 ` Harald Nordgren
2026-09-29 20:17 ` Junio C Hamano
2026-09-29 9:19 ` [PATCH v4 3/4] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-09-29 9:19 ` [PATCH v4 4/4] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-09-29 19:36 ` [PATCH v4 0/4] fetch: avoid fetching every branch of a new remote in a shallow repo Junio C Hamano
2026-10-02 7:13 ` [PATCH v5 " Harald Nordgren via GitGitGadget
2026-10-02 7:13 ` [PATCH v5 1/4] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-10-02 7:13 ` [PATCH v5 2/4] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-02 7:13 ` [PATCH v5 3/4] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-02 16:28 ` Junio C Hamano
2026-10-02 7:13 ` [PATCH v5 4/4] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-04 8:31 ` [PATCH v6 0/4] fetch: avoid fetching every branch of a new remote in a shallow repo Harald Nordgren via GitGitGadget
2026-10-04 8:31 ` [PATCH v6 1/4] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-10-04 8:31 ` [PATCH v6 2/4] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-04 8:31 ` [PATCH v6 3/4] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-04 8:31 ` [PATCH v6 4/4] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-04 17:17 ` [PATCH v6 0/4] fetch: avoid fetching every branch of a new remote in a shallow repo Junio C Hamano
2026-10-04 19:51 ` Harald Nordgren
2026-10-05 12:17 ` Junio C Hamano
2026-10-05 18:09 ` Harald Nordgren
2026-10-07 21:56 ` [PATCH v7 " Harald Nordgren via GitGitGadget
2026-10-07 21:56 ` [PATCH v7 1/4] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-10-07 21:56 ` [PATCH v7 2/4] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-08 16:59 ` Junio C Hamano
2026-10-09 7:05 ` Harald Nordgren
2026-10-09 8:09 ` Harald Nordgren
2026-10-07 21:56 ` [PATCH v7 3/4] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-07 21:56 ` [PATCH v7 4/4] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-10 8:02 ` [PATCH v8 0/5] fetch: avoid fetching every branch of a new remote in a shallow repo Harald Nordgren via GitGitGadget
2026-10-10 8:02 ` [PATCH v8 1/5] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-10-10 8:02 ` [PATCH v8 2/5] fetch: extract collect_upstream_from_remote() helper Harald Nordgren via GitGitGadget
2026-10-10 17:11 ` Junio C Hamano
2026-10-10 18:36 ` Harald Nordgren
2026-10-10 8:02 ` [PATCH v8 3/5] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-10 8:02 ` [PATCH v8 4/5] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-10 17:16 ` Junio C Hamano
2026-10-10 8:02 ` [PATCH v8 5/5] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-14 7:04 ` [PATCH v9 0/5] fetch: avoid fetching every branch of a new remote in a shallow repo Harald Nordgren via GitGitGadget
2026-10-14 7:04 ` [PATCH v9 1/5] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-10-14 7:04 ` [PATCH v9 2/5] fetch: extract collect_upstream_from_remote() helper Harald Nordgren via GitGitGadget
2026-10-14 7:04 ` [PATCH v9 3/5] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-14 7:04 ` [PATCH v9 4/5] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-14 7:04 ` [PATCH v9 5/5] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-20 13:42 ` [PATCH v10 0/5] fetch: avoid fetching every branch of a new remote in a shallow repo Harald Nordgren via GitGitGadget
2026-10-20 13:42 ` [PATCH v10 1/5] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-10-24 15:08 ` D. Ben Knoble
2026-10-24 17:18 ` Harald Nordgren
2026-10-25 14:14 ` D. Ben Knoble
2026-10-25 16:47 ` Harald Nordgren
2026-10-25 22:15 ` Junio C Hamano
2026-10-26 8:21 ` Harald Nordgren
2026-10-26 15:48 ` Junio C Hamano
2026-10-27 17:03 ` Phillip Wood
2026-10-27 17:21 ` Junio C Hamano
2026-10-28 16:16 ` Phillip Wood
2026-10-28 17:42 ` Junio C Hamano
2026-10-28 20:57 ` Harald Nordgren
2026-10-29 16:26 ` Phillip Wood
2026-10-29 22:18 ` Junio C Hamano
2026-10-26 10:44 ` Phillip Wood
2026-10-26 15:51 ` Junio C Hamano
2026-10-26 9:44 ` Phillip Wood
2026-10-29 14:30 ` Ben Knoble
2026-10-29 14:50 ` Harald Nordgren
2026-10-29 22:21 ` Junio C Hamano
2026-10-30 10:14 ` Harald Nordgren
2026-10-20 13:42 ` [PATCH v10 2/5] fetch: extract collect_upstream_from_remote() helper Harald Nordgren via GitGitGadget
2026-10-24 15:08 ` D. Ben Knoble
2026-10-25 17:20 ` Harald Nordgren
2026-10-27 19:41 ` D. Ben Knoble
2026-10-20 13:42 ` [PATCH v10 3/5] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-24 15:09 ` D. Ben Knoble
2026-10-25 17:27 ` Harald Nordgren
2026-10-20 13:42 ` [PATCH v10 4/5] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-24 15:11 ` D. Ben Knoble
2026-10-20 13:42 ` [PATCH v10 5/5] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-24 15:13 ` D. Ben Knoble
2026-10-25 18:12 ` Harald Nordgren
2026-10-23 23:13 ` [PATCH v10 0/5] fetch: avoid fetching every branch of a new remote in a shallow repo Junio C Hamano
2026-10-24 15:15 ` D. Ben Knoble
2026-10-26 9:43 ` Phillip Wood
2026-10-26 15:44 ` Junio C Hamano
2026-10-27 12:22 ` Harald Nordgren
2026-10-27 17:04 ` Phillip Wood
2026-10-25 20:25 ` [PATCH v11 " Harald Nordgren via GitGitGadget
2026-10-25 20:25 ` [PATCH v11 1/5] fetch: add remote.<name>.refmap Harald Nordgren via GitGitGadget
2026-10-25 20:25 ` [PATCH v11 2/5] fetch: extract collect_upstream_from_remote() helper Harald Nordgren via GitGitGadget
2026-10-25 20:25 ` [PATCH v11 3/5] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-25 20:25 ` [PATCH v11 4/5] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-25 20:25 ` [PATCH v11 5/5] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-27 12:24 ` [PATCH v12 0/5] fetch: avoid fetching every branch of a new remote in a shallow repo Harald Nordgren via GitGitGadget
2026-10-27 12:24 ` [PATCH v12 1/5] fetch: add remote.<name>.fetchRefmap Harald Nordgren via GitGitGadget
2026-10-27 12:24 ` [PATCH v12 2/5] fetch: extract collect_upstream_from_remote() helper Harald Nordgren via GitGitGadget
2026-10-27 12:24 ` [PATCH v12 3/5] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-27 12:24 ` [PATCH v12 4/5] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-27 12:24 ` [PATCH v12 5/5] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-30 10:52 ` [PATCH v13 0/6] fetch: avoid fetching every branch of a new remote in a shallow repo Harald Nordgren via GitGitGadget
2026-10-30 10:52 ` [PATCH v13 1/6] fetch: add remote.<name>.fetchRefmap Harald Nordgren via GitGitGadget
2026-10-30 10:52 ` Harald Nordgren via GitGitGadget [this message]
2026-10-30 10:52 ` [PATCH v13 3/6] fetch: infer branches to fetch from a refmap-only remote Harald Nordgren via GitGitGadget
2026-10-30 10:52 ` [PATCH v13 4/6] remote: add "git remote add --limited-fetch" Harald Nordgren via GitGitGadget
2026-10-30 10:52 ` [PATCH v13 5/6] remote: default to --limited-fetch in a shallow repository Harald Nordgren via GitGitGadget
2026-10-30 10:52 ` [PATCH v13 6/6] remote: resolve @{push} through remote.<name>.fetchRefmap Harald Nordgren via GitGitGadget
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=3f5808cbf390f48ea41325dbe75ec76b17f6e97d.1793357550.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=haraldnordgren@gmail.com \
--cc=phillip.wood123@gmail.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