Merge branch 'ab/clone-no-tags'
"git clone" learned the "--no-tags" option not to fetch all tags initially, and also set up the tagopt not to follow any tags in subsequent fetches. * ab/clone-no-tags: tests: rename a test having to do with shallow submodules clone: add a --no-tags option to clone without tags tests: change "cd ... && git fetch" to "cd &&\n\tgit fetch"
This commit is contained in:
commit
a1fdc85f41
@ -13,7 +13,7 @@ SYNOPSIS
|
||||
[-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
|
||||
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
|
||||
[--dissociate] [--separate-git-dir <git dir>]
|
||||
[--depth <depth>] [--[no-]single-branch]
|
||||
[--depth <depth>] [--[no-]single-branch] [--no-tags]
|
||||
[--recurse-submodules] [--[no-]shallow-submodules]
|
||||
[--jobs <n>] [--] <repository> [<directory>]
|
||||
|
||||
@ -215,6 +215,18 @@ objects from the source repository into a pack in the cloned repository.
|
||||
branch when `--single-branch` clone was made, no remote-tracking
|
||||
branch is created.
|
||||
|
||||
--no-tags::
|
||||
Don't clone any tags, and set
|
||||
`remote.<remote>.tagOpt=--no-tags` in the config, ensuring
|
||||
that future `git pull` and `git fetch` operations won't follow
|
||||
any tags. Subsequent explicit tag fetches will still work,
|
||||
(see linkgit:git-fetch[1]).
|
||||
+
|
||||
Can be used in conjunction with `--single-branch` to clone and
|
||||
maintain a branch with no references other than a single cloned
|
||||
branch. This is useful e.g. to maintain minimal clones of the default
|
||||
branch of some repository for search indexing.
|
||||
|
||||
--recurse-submodules[=<pathspec]::
|
||||
After the clone is created, initialize and clone submodules
|
||||
within based on the provided pathspec. If no pathspec is
|
||||
|
@ -40,6 +40,7 @@ static const char * const builtin_clone_usage[] = {
|
||||
|
||||
static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
|
||||
static int option_local = -1, option_no_hardlinks, option_shared;
|
||||
static int option_no_tags;
|
||||
static int option_shallow_submodules;
|
||||
static int deepen;
|
||||
static char *option_template, *option_depth, *option_since;
|
||||
@ -120,6 +121,8 @@ static struct option builtin_clone_options[] = {
|
||||
N_("deepen history of shallow clone, excluding rev")),
|
||||
OPT_BOOL(0, "single-branch", &option_single_branch,
|
||||
N_("clone only one branch, HEAD or --branch")),
|
||||
OPT_BOOL(0, "no-tags", &option_no_tags,
|
||||
N_("don't clone any tags, and make later fetches not to follow them")),
|
||||
OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
|
||||
N_("any cloned submodules will be shallow")),
|
||||
OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
|
||||
@ -563,7 +566,7 @@ static struct ref *wanted_peer_refs(const struct ref *refs,
|
||||
} else
|
||||
get_fetch_map(refs, refspec, &tail, 0);
|
||||
|
||||
if (!option_mirror && !option_single_branch)
|
||||
if (!option_mirror && !option_single_branch && !option_no_tags)
|
||||
get_fetch_map(refs, tag_refspec, &tail, 0);
|
||||
|
||||
return local_refs;
|
||||
@ -652,7 +655,7 @@ static void update_remote_refs(const struct ref *refs,
|
||||
|
||||
if (refs) {
|
||||
write_remote_refs(mapped_refs);
|
||||
if (option_single_branch)
|
||||
if (option_single_branch && !option_no_tags)
|
||||
write_followtags(refs, msg);
|
||||
}
|
||||
|
||||
@ -1035,6 +1038,12 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||
git_config_set(key.buf, repo);
|
||||
strbuf_reset(&key);
|
||||
|
||||
if (option_no_tags) {
|
||||
strbuf_addf(&key, "remote.%s.tagOpt", option_origin);
|
||||
git_config_set(key.buf, "--no-tags");
|
||||
strbuf_reset(&key);
|
||||
}
|
||||
|
||||
if (option_required_reference.nr || option_optional_reference.nr)
|
||||
setup_reference();
|
||||
|
||||
|
@ -1319,6 +1319,7 @@ _git_clone ()
|
||||
--template=
|
||||
--depth
|
||||
--single-branch
|
||||
--no-tags
|
||||
--branch
|
||||
--recurse-submodules
|
||||
--no-single-branch
|
||||
|
@ -17,13 +17,20 @@ test_expect_success 'setup' '
|
||||
echo four >file &&
|
||||
git commit -a -m four &&
|
||||
git checkout master &&
|
||||
git tag five &&
|
||||
|
||||
# default clone
|
||||
git clone . dir_all &&
|
||||
|
||||
# default clone --no-tags
|
||||
git clone --no-tags . dir_all_no_tags &&
|
||||
|
||||
# default --single that follows HEAD=master
|
||||
git clone --single-branch . dir_master &&
|
||||
|
||||
# default --single that follows HEAD=master with no tags
|
||||
git clone --single-branch --no-tags . dir_master_no_tags &&
|
||||
|
||||
# default --single that follows HEAD=side
|
||||
git checkout side &&
|
||||
git clone --single-branch . dir_side &&
|
||||
@ -45,6 +52,9 @@ test_expect_success 'setup' '
|
||||
# explicit --single with tag
|
||||
git clone --single-branch --branch two . dir_tag &&
|
||||
|
||||
# explicit --single with tag and --no-tags
|
||||
git clone --single-branch --no-tags --branch two . dir_tag_no_tags &&
|
||||
|
||||
# advance both "master" and "side" branches
|
||||
git checkout side &&
|
||||
echo five >file &&
|
||||
@ -59,7 +69,8 @@ test_expect_success 'setup' '
|
||||
|
||||
test_expect_success 'by default all branches will be kept updated' '
|
||||
(
|
||||
cd dir_all && git fetch &&
|
||||
cd dir_all &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/remotes/origin |
|
||||
sed -e "/HEAD$/d" \
|
||||
-e "s|/remotes/origin/|/heads/|" >../actual
|
||||
@ -71,28 +82,82 @@ test_expect_success 'by default all branches will be kept updated' '
|
||||
|
||||
test_expect_success 'by default no tags will be kept updated' '
|
||||
(
|
||||
cd dir_all && git fetch &&
|
||||
cd dir_all &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/tags >../actual
|
||||
) &&
|
||||
git for-each-ref refs/tags >expect &&
|
||||
test_must_fail test_cmp expect actual
|
||||
test_must_fail test_cmp expect actual &&
|
||||
test_line_count = 2 actual
|
||||
'
|
||||
|
||||
test_expect_success 'clone with --no-tags' '
|
||||
(
|
||||
cd dir_all_no_tags &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/tags >../actual
|
||||
) &&
|
||||
>expect &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success '--single-branch while HEAD pointing at master' '
|
||||
(
|
||||
cd dir_master && git fetch &&
|
||||
cd dir_master &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/remotes/origin |
|
||||
sed -e "/HEAD$/d" \
|
||||
-e "s|/remotes/origin/|/heads/|" >../actual
|
||||
) &&
|
||||
# only follow master
|
||||
git for-each-ref refs/heads/master >expect &&
|
||||
test_cmp expect actual
|
||||
# get & check latest tags
|
||||
test_cmp expect actual &&
|
||||
(
|
||||
cd dir_master &&
|
||||
git fetch --tags &&
|
||||
git for-each-ref refs/tags >../actual
|
||||
) &&
|
||||
git for-each-ref refs/tags >expect &&
|
||||
test_cmp expect actual &&
|
||||
test_line_count = 2 actual
|
||||
'
|
||||
|
||||
test_expect_success '--single-branch while HEAD pointing at master and --no-tags' '
|
||||
(
|
||||
cd dir_master_no_tags &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/remotes/origin |
|
||||
sed -e "/HEAD$/d" \
|
||||
-e "s|/remotes/origin/|/heads/|" >../actual
|
||||
) &&
|
||||
# only follow master
|
||||
git for-each-ref refs/heads/master >expect &&
|
||||
test_cmp expect actual &&
|
||||
# get tags (noop)
|
||||
(
|
||||
cd dir_master_no_tags &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/tags >../actual
|
||||
) &&
|
||||
>expect &&
|
||||
test_cmp expect actual &&
|
||||
test_line_count = 0 actual &&
|
||||
# get tags with --tags overrides tagOpt
|
||||
(
|
||||
cd dir_master_no_tags &&
|
||||
git fetch --tags &&
|
||||
git for-each-ref refs/tags >../actual
|
||||
) &&
|
||||
git for-each-ref refs/tags >expect &&
|
||||
test_cmp expect actual &&
|
||||
test_line_count = 2 actual
|
||||
'
|
||||
|
||||
test_expect_success '--single-branch while HEAD pointing at side' '
|
||||
(
|
||||
cd dir_side && git fetch &&
|
||||
cd dir_side &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/remotes/origin |
|
||||
sed -e "/HEAD$/d" \
|
||||
-e "s|/remotes/origin/|/heads/|" >../actual
|
||||
@ -104,7 +169,8 @@ test_expect_success '--single-branch while HEAD pointing at side' '
|
||||
|
||||
test_expect_success '--single-branch with explicit --branch side' '
|
||||
(
|
||||
cd dir_side2 && git fetch &&
|
||||
cd dir_side2 &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/remotes/origin |
|
||||
sed -e "/HEAD$/d" \
|
||||
-e "s|/remotes/origin/|/heads/|" >../actual
|
||||
@ -116,16 +182,29 @@ test_expect_success '--single-branch with explicit --branch side' '
|
||||
|
||||
test_expect_success '--single-branch with explicit --branch with tag fetches updated tag' '
|
||||
(
|
||||
cd dir_tag && git fetch &&
|
||||
cd dir_tag &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/tags >../actual
|
||||
) &&
|
||||
git for-each-ref refs/tags >expect &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success '--single-branch with explicit --branch with tag fetches updated tag despite --no-tags' '
|
||||
(
|
||||
cd dir_tag_no_tags &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/tags >../actual
|
||||
) &&
|
||||
git for-each-ref refs/tags/two >expect &&
|
||||
test_cmp expect actual &&
|
||||
test_line_count = 1 actual
|
||||
'
|
||||
|
||||
test_expect_success '--single-branch with --mirror' '
|
||||
(
|
||||
cd dir_mirror && git fetch &&
|
||||
cd dir_mirror &&
|
||||
git fetch &&
|
||||
git for-each-ref refs > ../actual
|
||||
) &&
|
||||
git for-each-ref refs >expect &&
|
||||
@ -134,7 +213,8 @@ test_expect_success '--single-branch with --mirror' '
|
||||
|
||||
test_expect_success '--single-branch with explicit --branch and --mirror' '
|
||||
(
|
||||
cd dir_mirror_side && git fetch &&
|
||||
cd dir_mirror_side &&
|
||||
git fetch &&
|
||||
git for-each-ref refs > ../actual
|
||||
) &&
|
||||
git for-each-ref refs >expect &&
|
||||
@ -143,7 +223,8 @@ test_expect_success '--single-branch with explicit --branch and --mirror' '
|
||||
|
||||
test_expect_success '--single-branch with detached' '
|
||||
(
|
||||
cd dir_detached && git fetch &&
|
||||
cd dir_detached &&
|
||||
git fetch &&
|
||||
git for-each-ref refs/remotes/origin |
|
||||
sed -e "/HEAD$/d" \
|
||||
-e "s|/remotes/origin/|/heads/|" >../actual
|
||||
|
Loading…
Reference in New Issue
Block a user