]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jt/clone-unborn-head'
authorJunio C Hamano <gitster@pobox.com>
Thu, 18 Feb 2021 01:21:40 +0000 (17:21 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Feb 2021 01:21:40 +0000 (17:21 -0800)
"git clone" tries to locally check out the branch pointed at by
HEAD of the remote repository after it is done, but the protocol
did not convey the information necessary to do so when copying an
empty repository.  The protocol v2 learned how to do so.

* jt/clone-unborn-head:
  clone: respect remote unborn HEAD
  connect, transport: encapsulate arg in struct
  ls-refs: report unborn targets of symrefs

1  2 
builtin/clone.c
builtin/fetch.c
connect.c
ls-refs.c
remote.h
t/t5606-clone-options.sh
t/t5701-git-serve.sh
t/t5702-protocol-v2.sh

diff --cc builtin/clone.c
index e335734b4cfd32560b5d0cfa8a60426fa5c9514c,09dcd97a2e7342dceadd71c928c11566e0e0b08b..51e844a2de0a236f3ecd0305b3a5726aed80f5e6
@@@ -1326,8 -1330,19 +1330,19 @@@ int cmd_clone(int argc, const char **ar
                remote_head = NULL;
                option_no_checkout = 1;
                if (!option_bare) {
-                       const char *branch = git_default_branch_name(0);
-                       char *ref = xstrfmt("refs/heads/%s", branch);
+                       const char *branch;
+                       char *ref;
+                       if (transport_ls_refs_options.unborn_head_target &&
+                           skip_prefix(transport_ls_refs_options.unborn_head_target,
+                                       "refs/heads/", &branch)) {
+                               ref = transport_ls_refs_options.unborn_head_target;
+                               transport_ls_refs_options.unborn_head_target = NULL;
+                               create_symref("HEAD", ref, reflog_msg.buf);
+                       } else {
 -                              branch = git_default_branch_name();
++                              branch = git_default_branch_name(0);
+                               ref = xstrfmt("refs/heads/%s", branch);
+                       }
  
                        install_branch_config(0, branch, remote_name, ref);
                        free(ref);
diff --cc builtin/fetch.c
Simple merge
diff --cc connect.c
Simple merge
diff --cc ls-refs.c
index 5ff5473869fa19aa08d655cb1dcc7485d71dbbbd,32deb7be448d20dc8d0cf21e4c7e3b14fda512d1..88f6c3f60d8ef61373a1bfed33f49c877b6af320
+++ b/ls-refs.c
@@@ -61,9 -98,9 +98,9 @@@ static int send_ref(const char *refname
                            strip_namespace(symref_target));
        }
  
-       if (data->peel) {
+       if (data->peel && oid) {
                struct object_id peeled;
 -              if (!peel_ref(refname, &peeled))
 +              if (!peel_iterated_oid(oid, &peeled))
                        strbuf_addf(&refline, " peeled:%s", oid_to_hex(&peeled));
        }
  
@@@ -90,8 -144,8 +144,9 @@@ int ls_refs(struct repository *r, struc
        struct ls_refs_data data;
  
        memset(&data, 0, sizeof(data));
 +      strvec_init(&data.prefixes);
  
+       ensure_config_read();
        git_config(ls_refs_config, NULL);
  
        while (packet_reader_read(request) == PACKET_READ_NORMAL) {
        if (request->status != PACKET_READ_FLUSH)
                die(_("expected flush after ls-refs arguments"));
  
-       head_ref_namespaced(send_ref, &data);
+       send_possibly_unborn_head(&data);
 -      for_each_namespaced_ref(send_ref, &data);
 +      if (!data.prefixes.nr)
 +              strvec_push(&data.prefixes, "");
 +      for_each_fullref_in_prefixes(get_git_namespace(), data.prefixes.v,
 +                                   send_ref, &data, 0);
        packet_flush(1);
        strvec_clear(&data.prefixes);
        return 0;
diff --cc remote.h
Simple merge
Simple merge
Simple merge
Simple merge