clone: write detached HEAD in bare repositories
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Mon, 16 Jan 2012 09:46:08 +0000 (16:46 +0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 17 Jan 2012 00:26:24 +0000 (16:26 -0800)
If we don't write, HEAD is still at refs/heads/master as initialized
by init-db, which may or may not match remote's HEAD.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/clone.c
t/t5601-clone.sh

index 9dcc5fe775dc8dd38bb905869ee87a9dc685dfcf..91862f79636b4b85d061a313b3566b01b06d6753 100644 (file)
@@ -764,12 +764,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
                }
        } else if (remote_head) {
                /* Source had detached HEAD pointing somewhere. */
-               if (!option_bare) {
-                       update_ref(reflog_msg.buf, "HEAD",
-                                  remote_head->old_sha1,
-                                  NULL, REF_NODEREF, DIE_ON_ERR);
-                       our_head_points_at = remote_head;
-               }
+               update_ref(reflog_msg.buf, "HEAD", remote_head->old_sha1,
+                          NULL, REF_NODEREF, DIE_ON_ERR);
+               our_head_points_at = remote_head;
        } else {
                /* Nothing to checkout out */
                if (!option_no_checkout)
index 49821eb4679cd302714ad26ff0947c2980216e00..e0b8db6c536a488389fb573f4e5cb15d552b7e98 100755 (executable)
@@ -12,7 +12,10 @@ test_expect_success setup '
                cd src &&
                >file &&
                git add file &&
-               git commit -m initial
+               git commit -m initial &&
+               echo 1 >file &&
+               git add file &&
+               git commit -m updated
        )
 
 '
@@ -88,6 +91,26 @@ test_expect_success 'clone --mirror' '
 
 '
 
+test_expect_success 'clone --mirror with detached HEAD' '
+
+       ( cd src && git checkout HEAD^ && git rev-parse HEAD >../expected ) &&
+       git clone --mirror src mirror.detached &&
+       ( cd src && git checkout - ) &&
+       GIT_DIR=mirror.detached git rev-parse HEAD >actual &&
+       test_cmp expected actual
+
+'
+
+test_expect_success 'clone --bare with detached HEAD' '
+
+       ( cd src && git checkout HEAD^ && git rev-parse HEAD >../expected ) &&
+       git clone --bare src bare.detached &&
+       ( cd src && git checkout - ) &&
+       GIT_DIR=bare.detached git rev-parse HEAD >actual &&
+       test_cmp expected actual
+
+'
+
 test_expect_success 'clone --bare names the local repository <name>.git' '
 
        git clone --bare src &&