From: Phillip Wood <phillip.wood123@gmail.com>
To: Harald Nordgren via GitGitGadget <gitgitgadget@gmail.com>,
git@vger.kernel.org
Cc: "D. Ben Knoble" <ben.knoble@gmail.com>,
Harald Nordgren <haraldnordgren@gmail.com>
Subject: Re: [PATCH v10 1/5] fetch: add remote.<name>.refmap
Date: Mon, 26 Oct 2026 09:44:36 +0000 [thread overview]
Message-ID: <e6af5d1e-4ca1-48a5-8a84-5e0cefbdbc2b@gmail.com> (raw)
In-Reply-To: <ba7f1354cd5492ef964ad4d1d398b5ecfc4e0086.1792503778.git.gitgitgadget@gmail.com>
Hi Harald
On 20/10/2026 14:42, Harald Nordgren via GitGitGadget wrote:
> From: Harald Nordgren <haraldnordgren@gmail.com>
>
> Add a per-remote config variable, remote.<name>.refmap, that provides
> the default value for --refmap the same way remote.<name>.fetch
> already provides the default refspecs to fetch.
The second half of this sentence seems redundant to me. Can we please
call the new config setting "remote.<name>.fetchRefmap" so that it is
clear it applies to fetches. That would also allow us to add a matching
"remote.<name>.pushRefmap" in the future to map the refnames of refs
that are pushed without setting up a default set of refs to push.
> Like --refmap itself,
> it only maps refs that are actually being fetched, so it has nothing
> to do when there is nothing explicit to fetch, on the command line or
> via remote.<name>.fetch.
So the default value behaves like the option - why wouldn't it?
> A refspec-less fetch with a refmap configured but nothing else to say
> what to fetch falls back to the same defaults as a remote with no
> refspec or refmap at all. Only an explicit --refmap given on the
> command line with no command-line refspec to go with it is still
> rejected, since that combination is a plain mistake to type, unlike a
> remote.<name>.refmap configured on its own. A remote.<name>.fetch
> that is also configured is used as before.
I'm afraid I cannot understand what this paragraph is trying to say.
> diff --git a/Documentation/config/remote.adoc b/Documentation/config/remote.adoc
>
> +remote.<name>.refmap::
> + The default value of the `--refmap` option for linkgit:git-fetch[1].
> + Used to map remote refs being fetched to remote-tracking refs to
> + store. See the `--refmap` entry in linkgit:git-fetch[1].
I'm not sure we need to link to the git fetch documentation twice. It
would be useful to explain how this interacts with remote.<name>.fetch.
The documentation for "--refmap" says that if it is given the refspec
config is ignored - so does setting this mean remote.<name>.fetch is
ignored?
> diff --git a/Documentation/fetch-options.adoc b/Documentation/fetch-options.adoc
> ++
> +`remote.<name>.refmap` provides the default value for this option, the
> +same way `remote.<name>.fetch` provides the default refspecs to fetch.
As above the second half of this sentence doesn't really add anything.
Thanks
Phillip
>
> `-t`::
> `--tags`::
> diff --git a/builtin/fetch.c b/builtin/fetch.c
> index 1f76ae6242..ffcb5ba29a 100644
> --- a/builtin/fetch.c
> +++ b/builtin/fetch.c
> @@ -518,6 +518,12 @@ static struct ref *get_ref_map(struct remote *remote,
> struct ref *rm;
> struct ref *ref_map = NULL;
> struct ref **tail = &ref_map;
> + /*
> + * The --refmap command line option, if given, takes precedence
> + * over remote.<name>.refmap.
> + */
> + struct refspec *effective_refmap =
> + refmap.nr ? &refmap : remote ? &remote->refmap : NULL;
>
> /* opportunistically-updated references: */
> struct ref *orefs = NULL, **oref_tail = &orefs;
> @@ -561,8 +567,8 @@ static struct ref *get_ref_map(struct remote *remote,
> * by ref_remove_duplicates() in favor of one of these
> * opportunistic entries with FETCH_HEAD_IGNORE.
> */
> - if (refmap.nr)
> - fetch_refspec = &refmap;
> + if (effective_refmap && effective_refmap->nr)
> + fetch_refspec = effective_refmap;
> else
> fetch_refspec = &remote->fetch;
>
> diff --git a/remote.c b/remote.c
> index 49ee2ea318..c9252a90f4 100644
> --- a/remote.c
> +++ b/remote.c
> @@ -152,6 +152,7 @@ static struct remote *make_remote(struct remote_state *remote_state,
> ret->name = xstrndup(name, len);
> refspec_init_push(&ret->push, the_hash_algo);
> refspec_init_fetch(&ret->fetch, the_hash_algo);
> + refspec_init_fetch(&ret->refmap, the_hash_algo);
> string_list_init_dup(&ret->server_options);
> string_list_init_dup(&ret->negotiation_restrict);
> string_list_init_dup(&ret->negotiation_include);
> @@ -176,6 +177,7 @@ static void remote_clear(struct remote *remote)
>
> refspec_clear(&remote->push);
> refspec_clear(&remote->fetch);
> + refspec_clear(&remote->refmap);
>
> free((char *)remote->receivepack);
> free((char *)remote->uploadpack);
> @@ -539,6 +541,12 @@ static int handle_config(const char *key, const char *value,
> return -1;
> refspec_append(&remote->fetch, v);
> free(v);
> + } else if (!strcmp(subkey, "refmap")) {
> + char *v;
> + if (git_config_string(&v, key, value))
> + return -1;
> + refspec_append(&remote->refmap, v);
> + free(v);
> } else if (!strcmp(subkey, "receivepack")) {
> char *v;
> if (git_config_string(&v, key, value))
> @@ -995,7 +1003,9 @@ void ref_push_report_free(struct ref_push_report *report)
>
> int remote_find_tracking(struct remote *remote, struct refspec_item *refspec)
> {
> - return refspec_find_match(&remote->fetch, refspec);
> + if (remote->fetch.nr)
> + return refspec_find_match(&remote->fetch, refspec);
> + return refspec_find_match(&remote->refmap, refspec);
> }
>
> static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen,
> diff --git a/remote.h b/remote.h
> index cca02033b9..ac485a584d 100644
> --- a/remote.h
> +++ b/remote.h
> @@ -90,6 +90,12 @@ struct remote {
>
> struct refspec fetch;
>
> + /*
> + * How to map refs fetched without an explicit destination into our
> + * own namespace, the same as the --refmap command line option.
> + */
> + struct refspec refmap;
> +
> /*
> * The setting for whether to fetch tags (as a separate rule from the
> * configured refspecs);
> diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
> index 17c0be499c..ec5cd9dca6 100755
> --- a/t/t5510-fetch.sh
> +++ b/t/t5510-fetch.sh
> @@ -927,6 +927,69 @@ test_expect_success 'explicit --refmap option overrides remote.*.fetch' '
> )
> '
>
> +test_expect_success 'remote.*.refmap acts like --refmap on the command line' '
> + test_when_finished "git -C three config --unset remote.origin.refmap" &&
> + git branch -f side &&
> + git -C three config remote.origin.refmap \
> + "refs/heads/*:refs/remotes/other/*" &&
> + (
> + cd three &&
> + git update-ref refs/remotes/origin/main base-origin-main &&
> + o=$(git rev-parse --verify refs/remotes/origin/main) &&
> + git fetch origin main &&
> + n=$(git rev-parse --verify refs/remotes/origin/main) &&
> + test "$o" = "$n" &&
> + test_must_fail git rev-parse --verify refs/remotes/origin/side &&
> + git rev-parse --verify refs/remotes/other/main
> + )
> +'
> +
> +check_fetched_refs () {
> + git for-each-ref --format="%(refname)" refs/remotes/ >actual &&
> + cat >expect &&
> + test_cmp expect actual
> +}
> +
> +test_expect_success 'remote.<name>.refmap without tracking (baseline)' '
> + test_when_finished "rm -fr fetch-refmap-baseline fetch-refmap-upstream" &&
> + git init -b main fetch-refmap-upstream &&
> + test_commit -C fetch-refmap-upstream base &&
> + git -C fetch-refmap-upstream branch other &&
> + git init fetch-refmap-baseline &&
> + (
> + cd fetch-refmap-baseline &&
> + git remote add origin ../fetch-refmap-upstream &&
> +
> + # Without fetch refspec, but with fetch refmap.
> + git config --unset-all remote.origin.fetch &&
> + git config remote.origin.refmap "+refs/heads/*:refs/remotes/origin/*" &&
> +
> + # Nothing tracked, nothing fetched, no error.
> + git fetch origin &&
> + check_fetched_refs <<-\EOF &&
> + EOF
> +
> + # Nothing tracked, explicit ref on the command line.
> + git fetch origin main &&
> + check_fetched_refs <<-\EOF &&
> + refs/remotes/origin/main
> + EOF
> +
> + # With both refmap and fetch configured, remote.<name>.fetch
> + # wins: a refspec-less fetch follows it as usual, and
> + # remote.<name>.refmap plays no part in deciding what to
> + # fetch, only in remapping something that is already being
> + # fetched by name.
> + git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" &&
> + git fetch origin &&
> + check_fetched_refs <<-\EOF
> + refs/remotes/origin/HEAD
> + refs/remotes/origin/main
> + refs/remotes/origin/other
> + EOF
> + )
> +'
> +
> test_expect_success 'explicitly empty --refmap option disables remote.*.fetch' '
> git branch -f side &&
> (
next prev parent reply other threads:[~2026-10-26 9:44 UTC|newest]
Thread overview: 122+ 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 [this message]
2026-10-29 14:30 ` Ben Knoble
2026-10-29 14:50 ` Harald Nordgren
2026-10-29 22:21 ` Junio C Hamano
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
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=e6af5d1e-4ca1-48a5-8a84-5e0cefbdbc2b@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=haraldnordgren@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.