From 5a7d5b683f869d3e3884a89775241afa515da9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= Date: Mon, 16 Jan 2012 16:46:15 +0700 Subject: clone: allow --branch to take a tag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because a tag ref cannot be put to HEAD, HEAD will become detached. This is consistent with "git checkout ". 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 Signed-off-by: Junio C Hamano --- builtin/clone.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'builtin/clone.c') diff --git a/builtin/clone.c b/builtin/clone.c index 3cfedb3a9..651b4cc20 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -420,6 +420,15 @@ static struct ref *find_remote_branch(const struct ref *refs, const char *branch strbuf_addstr(&head, branch); ref = find_ref_by_name(refs, head.buf); strbuf_release(&head); + + if (ref) + return ref; + + strbuf_addstr(&head, "refs/tags/"); + strbuf_addstr(&head, branch); + ref = find_ref_by_name(refs, head.buf); + strbuf_release(&head); + return ref; } @@ -441,8 +450,12 @@ static struct ref *wanted_peer_refs(const struct ref *refs, if (!remote_head && option_branch) warning(_("Could not find remote branch %s to clone."), option_branch); - else + else { get_fetch_map(remote_head, refspec, &tail, 0); + + /* if --branch=tag, pull the requested tag explicitly */ + get_fetch_map(remote_head, tag_refspec, &tail, 0); + } } else get_fetch_map(refs, refspec, &tail, 0); @@ -515,6 +528,11 @@ static void update_head(const struct ref *our, const struct ref *remote, update_ref(msg, "HEAD", our->old_sha1, NULL, 0, DIE_ON_ERR); install_branch_config(0, head, option_origin, our->name); } + } else if (our) { + struct commit *c = lookup_commit_reference(our->old_sha1); + /* --branch specifies a non-branch (i.e. tags), detach HEAD */ + update_ref(msg, "HEAD", c->object.sha1, + NULL, REF_NODEREF, DIE_ON_ERR); } else if (remote) { /* * We know remote HEAD points to a non-branch, or -- cgit v1.2.1