clone: allow configurable default for `-o`/`--origin`
While the default remote name of "origin" can be changed at clone-time
with `git clone`'s `--origin` option, it was previously not possible
to specify a default value for the name of that remote. Add support for
a new `clone.defaultRemoteName` config, with the newly-created remote
name resolved in priority order:
1. (Highest priority) A remote name passed directly to `git clone -o`
2. A `clone.defaultRemoteName=new_name` in config `git clone -c`
3. A `clone.defaultRemoteName` value set in `/path/to/template/config`,
where `--template=/path/to/template` is provided
4. A `clone.defaultRemoteName` value set in a non-template config file
5. The default value of `origin`
Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Helped-by: Derrick Stolee <stolee@gmail.com>
Helped-by: Andrei Rybak <rybak.a.v@gmail.com>
Signed-off-by: Sean Barag <sean@barag.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Sean Barag committedOct 1, 2020 at 03:46 UTCde9ed3ef3740f8227cc924e845032954d1f1b1b7
new file mode 100644index 0000000000..47de36a5fe--- /dev/null+++ b/Documentation/config/clone.txt@@ -0,0 +1,4 @@+clone.defaultRemoteName::+ The name of the remote to create when cloning a repository. Defaults to+ `origin`, and can be overridden by passing the `--origin` command-line+ option to linkgit:git-clone[1].
Documentation/git-clone.txt
+3-2
index c898310099..f04bf6e6ba 100644--- a/Documentation/git-clone.txt+++ b/Documentation/git-clone.txt@@ -183,8 +183,9 @@ objects from the source repository into a pack in the cloned repository. -o <name>:: --origin <name>::- Instead of using the remote name `origin` to keep track- of the upstream repository, use `<name>`.+ Instead of using the remote name `origin` to keep track of the upstream+ repository, use `<name>`. Overrides `clone.defaultRemoteName` from the+ config. -b <name>:: --branch <name>::
builtin/clone.c
+19-7
index c33fa127ce..a144e7f35b 100644--- a/builtin/clone.c+++ b/builtin/clone.c@@ -53,7 +53,7 @@ static int option_shallow_submodules; static int deepen; static char *option_template, *option_depth, *option_since; static char *option_origin = NULL;-static char *remote_name = "origin";+static char *remote_name = NULL; static char *option_branch = NULL; static struct string_list option_not = STRING_LIST_INIT_NODUP; static const char *real_git_dir;@@ -854,6 +854,10 @@ static int checkout(int submodule_progress) static int git_clone_config(const char *k, const char *v, void *cb) {+ if (!strcmp(k, "clone.defaultremotename")) {+ free(remote_name);+ remote_name = xstrdup(v);+ } return git_default_config(k, v, cb); }@@ -1010,12 +1014,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix) option_no_checkout = 1; }- if (option_origin)- remote_name = option_origin;-- if (!valid_remote_name(remote_name))- die(_("'%s' is not a valid remote name"), remote_name);- repo_name = argv[0]; path = get_repo_path(repo_name, &is_bundle);@@ -1158,6 +1156,19 @@ int cmd_clone(int argc, const char **argv, const char *prefix) */ git_config(git_clone_config, NULL);+ /*+ * apply the remote name provided by --origin only after this second+ * call to git_config, to ensure it overrides all config-based values.+ */+ if (option_origin != NULL)+ remote_name = xstrdup(option_origin);++ if (remote_name == NULL)+ remote_name = xstrdup("origin");++ if (!valid_remote_name(remote_name))+ die(_("'%s' is not a valid remote name"), remote_name);+ if (option_bare) { if (option_mirror) src_ref_prefix = "refs/";@@ -1358,6 +1369,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) junk_mode = JUNK_LEAVE_REPO; err = checkout(submodule_progress);+ free(remote_name); strbuf_release(&reflog_msg); strbuf_release(&branch_top); strbuf_release(&key);