Because a tag ref cannot be put to HEAD, HEAD will become detached. This is consistent with "git checkout <tag>". This is mostly useful in shallow clone, where it allows you to clone a tag in addtion to branches. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Although 'git clone --depth 1 --branch <tag>' still needs fixups on top. I'll do that later. Documentation/git-clone.txt | 5 +++-- builtin/clone.c | 14 ++++++++++++++ t/t5601-clone.sh | 9 +++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 4b8b26b..db2b29c 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -146,8 +146,9 @@ objects from the source repository into a pack in the cloned repository. -b <name>:: Instead of pointing the newly created HEAD to the branch pointed to by the cloned repository's HEAD, point to `<name>` branch - instead. In a non-bare repository, this is the branch that will - be checked out. + instead. `--branch` can also take tags and treat them like + detached HEAD. In a non-bare repository, this is the branch + that will be checked out. --upload-pack <upload-pack>:: -u <upload-pack>:: diff --git a/builtin/clone.c b/builtin/clone.c index 914fd6b..0d4b9ab 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -734,6 +734,14 @@ int cmd_clone(int argc, const char **argv, const char *prefix) strbuf_release(&head); if (!our_head_points_at) { + strbuf_addstr(&head, "refs/tags/"); + strbuf_addstr(&head, option_branch); + our_head_points_at = + find_ref_by_name(mapped_refs, head.buf); + strbuf_release(&head); + } + + if (!our_head_points_at) { warning(_("Remote branch %s not found in " "upstream %s, using HEAD instead"), option_branch, option_origin); @@ -776,6 +784,12 @@ int cmd_clone(int argc, const char **argv, const char *prefix) install_branch_config(0, head, option_origin, our_head_points_at->name); } + } else if (our_head_points_at) { + const struct ref *ref = our_head_points_at; + struct commit *c = lookup_commit_reference(ref->old_sha1); + /* Source had detached HEAD pointing somewhere. */ + update_ref(reflog_msg.buf, "HEAD", c->object.sha1, + NULL, REF_NODEREF, DIE_ON_ERR); } else if (remote_head) { /* Source had detached HEAD pointing somewhere. */ update_ref(reflog_msg.buf, "HEAD", remote_head->old_sha1, diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index e0b8db6..67869b4 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -271,4 +271,13 @@ test_expect_success 'clone from original with relative alternate' ' grep /src/\\.git/objects target-10/objects/info/alternates ' +test_expect_success 'clone checking out a tag' ' + git clone --branch=some-tag src dst.tag && + GIT_DIR=src/.git git rev-parse some-tag >expected && + test_cmp expected dst.tag/.git/HEAD && + GIT_DIR=dst.tag/.git git config remote.origin.fetch >fetch.actual && + echo "+refs/heads/*:refs/remotes/origin/*" >fetch.expected && + test_cmp fetch.expected fetch.actual +' + test_done -- 1.7.8.36.g69ee2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html