Skip to content
  • Ævar Arnfjörð Bjarmason's avatar
    clone: add a --no-tags option to clone without tags · 0dab2468
    Ævar Arnfjörð Bjarmason authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Add a --no-tags option to clone without fetching any tags.
    
    Without this change there's no easy way to clone a repository without
    also fetching its tags.
    
    When supplying --single-branch the primary remote branch will be
    cloned, but in addition tags will be followed & retrieved. Now
    --no-tags can be added --single-branch to clone a repository without
    tags, and which only tracks a single upstream branch.
    
    This option works without --single-branch as well, and will do a
    normal clone but not fetch any tags.
    
    Many git commands pay some fixed overhead as a function of the number
    of references. E.g. creating ~40k tags in linux.git will cause a
    command like `git log -1 >/dev/null` to run in over a second instead
    of in a matter of milliseconds, in addition numerous other things will
    slow down, e.g. "git log <TAB>" with the bash completion will slowly
    show ~40k references instead of 1.
    
    The user might want to avoid all of that overhead to simply use a
    repository like that to browse the "master" branch, or something like
    a CI tool might want to keep that one branch up-to-date without caring
    about any other references.
    
    Without this change the only way of accomplishing this was either by
    manually tweaking the config in a fresh repository:
    
        git init git &&
        cat >git/.git/config <<EOF &&
        [remote "origin"]
            url = git@github.com:git/git.git
            tagOpt = --no-tags
            fetch = +refs/heads/master:refs/remotes/origin/master
        [branch "master"]
            remote = origin
            merge = refs/heads/master
        EOF
        cd git &&
        git pull
    
    Which requires hardcoding the "master" name, which may not be the main
    --single-branch would have retrieved, or alternatively by setting
    tagOpt=--no-tags right after cloning & deleting any existing tags:
    
        git clone --single-branch git@github.com:git/git.git &&
        cd git &&
        git config remote.origin.tagOpt --no-tags &&
        git tag -l | xargs git tag -d
    
    Which of course was also subtly buggy if --branch was pointed at a
    tag, leaving the user in a detached head:
    
        git clone --single-branch --branch v2.12.0 git@github.com:git/git.git &&
        cd git &&
        git config remote.origin.tagOpt --no-tags &&
        git tag -l | xargs git tag -d
    
    Now all this complexity becomes the much simpler:
    
        git clone --single-branch --no-tags git@github.com:git/git.git
    
    Or in the case of cloning a single tag "branch":
    
        git clone --single-branch --branch v2.12.0 --no-tags git@github.com:git/git.git
    
    Signed-off-by: default avatarÆvar Arnfjörð Bjarmason <avarab@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    0dab2468