This allows you to do "git clone --branch=v1.7.8 git.git" and work right away from there. No big deal, just one more convenient step, I think. --branch taking a tag may be confusing though. We can still have master in this case instead of detached HEAD, which may make more sense because we use --branch. I don't care much which way should be used. Like? Dislike? Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/clone.c | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) diff --git a/builtin/clone.c b/builtin/clone.c index 8f29912..97af4bd 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -23,6 +23,7 @@ #include "branch.h" #include "remote.h" #include "run-command.h" +#include "tag.h" /* * Overall FIXMEs: @@ -721,6 +722,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); @@ -750,7 +759,16 @@ int cmd_clone(int argc, const char **argv, const char *prefix) reflog_msg.buf); } - if (our_head_points_at) { + if (our_head_points_at && + !prefixcmp(our_head_points_at->name, "refs/tags/")) { + const struct ref *ref = our_head_points_at; + struct object *o; + + /* Detached HEAD */ + o = deref_tag(parse_object(ref->old_sha1), NULL, 0); + update_ref(reflog_msg.buf, "HEAD", o->sha1, NULL, + REF_NODEREF, DIE_ON_ERR); + } else if (our_head_points_at) { /* Local default branch link */ create_symref("HEAD", our_head_points_at->name, NULL); if (!option_bare) { -- 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