diff --git a/builtin/clone.c b/builtin/clone.c index 2ee1fa9846..20496bdad0 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -340,8 +340,9 @@ static void remove_junk_on_signal(int signo) static struct ref *wanted_peer_refs(const struct ref *refs, struct refspec *refspec) { - struct ref *local_refs = NULL; - struct ref **tail = &local_refs; + struct ref *head = copy_ref(find_ref_by_name(refs, "HEAD")); + struct ref *local_refs = head; + struct ref **tail = head ? &head->next : &local_refs; get_fetch_map(refs, refspec, &tail, 0); if (!option_mirror) @@ -354,8 +355,11 @@ static void write_remote_refs(const struct ref *local_refs) { const struct ref *r; - for (r = local_refs; r; r = r->next) + for (r = local_refs; r; r = r->next) { + if (!r->peer_ref) + continue; add_extra_ref(r->peer_ref->name, r->old_sha1, 0); + } pack_refs(PACK_REFS_ALL); clear_extra_refs(); diff --git a/t/t5707-clone-detached.sh b/t/t5707-clone-detached.sh index d63b1e390e..8b0d607df1 100755 --- a/t/t5707-clone-detached.sh +++ b/t/t5707-clone-detached.sh @@ -58,18 +58,18 @@ test_expect_success 'cloned HEAD is detached' ' head_is_detached detached-history ' -test_expect_failure 'clone repo (orphan detached HEAD)' ' +test_expect_success 'clone repo (orphan detached HEAD)' ' git checkout master^0 && echo four >file && git commit -a -m four && git clone "file://$PWD" detached-orphan ' -test_expect_failure 'cloned HEAD matches' ' +test_expect_success 'cloned HEAD matches' ' echo four >expect && git --git-dir=detached-orphan/.git log -1 --format=%s >actual && test_cmp expect actual ' -test_expect_failure 'cloned HEAD is detached' ' +test_expect_success 'cloned HEAD is detached' ' head_is_detached detached-orphan '