mirror of
https://github.com/git/git.git
synced 2024-05-09 14:56:07 +02:00
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>
This commit is contained in:
parent
75ca3906b1
commit
de9ed3ef37
|
@ -334,6 +334,8 @@ include::config/checkout.txt[]
|
||||||
|
|
||||||
include::config/clean.txt[]
|
include::config/clean.txt[]
|
||||||
|
|
||||||
|
include::config/clone.txt[]
|
||||||
|
|
||||||
include::config/color.txt[]
|
include::config/color.txt[]
|
||||||
|
|
||||||
include::config/column.txt[]
|
include::config/column.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].
|
|
@ -183,8 +183,9 @@ objects from the source repository into a pack in the cloned repository.
|
||||||
|
|
||||||
-o <name>::
|
-o <name>::
|
||||||
--origin <name>::
|
--origin <name>::
|
||||||
Instead of using the remote name `origin` to keep track
|
Instead of using the remote name `origin` to keep track of the upstream
|
||||||
of the upstream repository, use `<name>`.
|
repository, use `<name>`. Overrides `clone.defaultRemoteName` from the
|
||||||
|
config.
|
||||||
|
|
||||||
-b <name>::
|
-b <name>::
|
||||||
--branch <name>::
|
--branch <name>::
|
||||||
|
|
|
@ -53,7 +53,7 @@ static int option_shallow_submodules;
|
||||||
static int deepen;
|
static int deepen;
|
||||||
static char *option_template, *option_depth, *option_since;
|
static char *option_template, *option_depth, *option_since;
|
||||||
static char *option_origin = NULL;
|
static char *option_origin = NULL;
|
||||||
static char *remote_name = "origin";
|
static char *remote_name = NULL;
|
||||||
static char *option_branch = NULL;
|
static char *option_branch = NULL;
|
||||||
static struct string_list option_not = STRING_LIST_INIT_NODUP;
|
static struct string_list option_not = STRING_LIST_INIT_NODUP;
|
||||||
static const char *real_git_dir;
|
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)
|
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);
|
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;
|
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];
|
repo_name = argv[0];
|
||||||
|
|
||||||
path = get_repo_path(repo_name, &is_bundle);
|
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);
|
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_bare) {
|
||||||
if (option_mirror)
|
if (option_mirror)
|
||||||
src_ref_prefix = "refs/";
|
src_ref_prefix = "refs/";
|
||||||
|
@ -1358,6 +1369,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||||
junk_mode = JUNK_LEAVE_REPO;
|
junk_mode = JUNK_LEAVE_REPO;
|
||||||
err = checkout(submodule_progress);
|
err = checkout(submodule_progress);
|
||||||
|
|
||||||
|
free(remote_name);
|
||||||
strbuf_release(&reflog_msg);
|
strbuf_release(&reflog_msg);
|
||||||
strbuf_release(&branch_top);
|
strbuf_release(&branch_top);
|
||||||
strbuf_release(&key);
|
strbuf_release(&key);
|
||||||
|
|
|
@ -19,6 +19,13 @@ test_expect_success 'clone -o' '
|
||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rejects invalid -o/--origin' '
|
||||||
|
|
||||||
|
test_must_fail git clone -o "bad...name" parent clone-bad-name 2>err &&
|
||||||
|
test_i18ngrep "'\''bad...name'\'' is not a valid remote name" err
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'disallows --bare with --origin' '
|
test_expect_success 'disallows --bare with --origin' '
|
||||||
|
|
||||||
test_must_fail git clone -o foo --bare parent clone-bare-o 2>err &&
|
test_must_fail git clone -o foo --bare parent clone-bare-o 2>err &&
|
||||||
|
@ -63,6 +70,21 @@ test_expect_success 'prefers -c config over --template config' '
|
||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'prefers config "clone.defaultRemoteName" over default' '
|
||||||
|
|
||||||
|
test_config_global clone.defaultRemoteName from_config &&
|
||||||
|
git clone parent clone-config-origin &&
|
||||||
|
git -C clone-config-origin rev-parse --verify refs/remotes/from_config/master
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'prefers --origin over -c config' '
|
||||||
|
|
||||||
|
git clone -c clone.defaultRemoteName=inline --origin from_option parent clone-o-and-inline-config &&
|
||||||
|
git -C clone-o-and-inline-config rev-parse --verify refs/remotes/from_option/master
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'redirected clone does not show progress' '
|
test_expect_success 'redirected clone does not show progress' '
|
||||||
|
|
||||||
git clone "file://$(pwd)/parent" clone-redirected >out 2>err &&
|
git clone "file://$(pwd)/parent" clone-redirected >out 2>err &&
|
||||||
|
|
Loading…
Reference in New Issue