From: Sean Barag <sean@xxxxxxxxx> While Junio's request [1] was to avoids the unusual "write config then immediately read it" pattern that exists in `cmd_clone`, Johannes mentioned that --template can write new config values that aren't automatically included in the environment [2]. This requires a config re-read after `init_db` is called. Moving the initial config up does allow settings from config to be overwritten by ones provided via CLI options in a more natural way though, so that part of Junio's suggestion remains. [1] https://lore.kernel.org/git/pull.710.git.1598456751674.gitgitgadget@xxxxxxxxx/ [2] https://github.com/gitgitgadget/git/pull/727#issuecomment-689740195 Signed-off-by: Sean Barag <sean@xxxxxxxxx> Thanks-to: Junio C Hamano <gitster@xxxxxxxxx> Thanks-to: Johannes Schindelin <johannes.schindelin@xxxxxx> --- builtin/clone.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/builtin/clone.c b/builtin/clone.c index b087ee40c2..bf095815f0 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -851,8 +851,21 @@ static int checkout(int submodule_progress) return err; } +static int git_clone_config(const char *k, const char *v, void *cb) +{ + return git_default_config(k, v, cb); +} + static int write_one_config(const char *key, const char *value, void *data) { + /* + * give git_config_default a chance to write config values back to the environment, since + * git_config_set_multivar_gently only deals with config-file writes + */ + int apply_failed = git_default_config(key, value, data); + if (apply_failed) + return apply_failed; + return git_config_set_multivar_gently(key, value ? value : "true", CONFIG_REGEX_NONE, 0); @@ -964,6 +977,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix) struct strvec ref_prefixes = STRVEC_INIT; packet_trace_identity("clone"); + + git_config(git_clone_config, NULL); + argc = parse_options(argc, argv, prefix, builtin_clone_options, builtin_clone_usage, 0); @@ -1125,9 +1141,17 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (real_git_dir) git_dir = real_git_dir; + /* + * additional config can be injected with -c, make sure it's included + * after init_db, which clears the entire config environment. + */ write_config(&option_config); - git_config(git_default_config, NULL); + /* + * re-read config after init_db and write_config to pick up any config + * injected by --template and --config, respectively + */ + git_config(git_clone_config, NULL); if (option_bare) { if (option_mirror) -- gitgitgadget