Re: [BUG] `git clone '-c KEY=VALUE'` no longer works
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 25, 2025, 22:03 UTC
- Message-ID
- <xmqq8qftrcqb.fsf@gitster.g>
- In-Reply-To
- <xmqqo6oqucka.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 6 quoted lines
> The right right thing to do at this point may be to fix the > regression and at the same time mark the "feature" as deprecated, > and remove it following the usual deprecation procedure, but that > certainly sounds like an unnecessary waste of engineering effort. > > So, I dunno.
The first step of the "right right thing" may look something like this. As this thread analyzed so far, this awkward lenience exists only in "clone -c <key>=<value>" in that the keyname is trimmed, so isolating the damage within the clone's code path would be the right approach, if we want to keep this awkward lenience alive a little bit longer.
This function receives the string_list that accumulated the "-c<STRING>" and "--config <STRING>" command line parameters (plus some internally generated ones related to submodules) and feeds them one at a time to git_config_parse_parameter() that expects the <key>=<value> pair to be fed.
builtin/clone.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
diff --git c/builtin/clone.c w/builtin/clone.c index c990f398ef..4ea8c92a6b 100644 --- c/builtin/clone.c +++ w/builtin/clone.c @@ -779,7 +779,26 @@ static void write_config(struct string_list *config) int i; for (i = 0; i < config->nr; i++) { - if (git_config_parse_parameter(config->items[i].string, + /* + * NEEDSWORK: a backward compatibility wart that made + * us tolerate (note the leading whitespace before + * the variable name) + * + * $ git clone '-c foo.bar=baz' + * + * and treated as if the leading whitespace before the + * variable name did not exist. Apparently a third + * party tool "Bamboo" relies on this past stupidity + * of ours. + * + * Eventually we should deprecate and remove this. + */ + const char *trimleft = config->items[i].string; + + while (*trimleft && isspace(*trimleft)) + trimleft++; + + if (git_config_parse_parameter(trimleft, write_one_config, NULL) < 0) die(_("unable to write parameters to config file")); }