From 01775651481ecd9c7288a85cfb7999f7f38ab37c Mon Sep 17 00:00:00 2001 From: Jonathan Tan Date: Thu, 27 Sep 2018 12:24:05 -0700 Subject: transport: do not list refs if possible When all refs to be fetched are exact OIDs, it is possible to perform a fetch without requiring the remote to list refs if protocol v2 is used. Teach Git to do this. This currently has an effect only for lazy fetches done from partial clones. The change necessary to likewise optimize "git fetch " will be done in a subsequent patch. Signed-off-by: Jonathan Tan Signed-off-by: Junio C Hamano --- fetch-pack.c | 2 +- t/t5702-protocol-v2.sh | 4 ++++ transport.c | 13 +++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fetch-pack.c b/fetch-pack.c index 75047a4b2a..15652b4776 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -1598,7 +1598,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args, if (nr_sought) nr_sought = remove_duplicates_in_refs(sought, nr_sought); - if (!ref) { + if (version != protocol_v2 && !ref) { packet_flush(fd[1]); die(_("no matching remote head")); } diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh index 3beeed4546..e32b5b4e3e 100755 --- a/t/t5702-protocol-v2.sh +++ b/t/t5702-protocol-v2.sh @@ -286,6 +286,10 @@ test_expect_success 'dynamically fetch missing object' ' grep "version 2" trace ' +test_expect_success 'when dynamically fetching missing object, do not list refs' ' + ! grep "git> command=ls-refs" trace +' + test_expect_success 'partial fetch' ' rm -rf client "$(pwd)/trace" && git init client && diff --git a/transport.c b/transport.c index 5fb9ff6b56..4329cca8e5 100644 --- a/transport.c +++ b/transport.c @@ -341,8 +341,17 @@ static int fetch_refs_via_pack(struct transport *transport, args.server_options = transport->server_options; args.negotiation_tips = data->options.negotiation_tips; - if (!data->got_remote_heads) - refs_tmp = get_refs_via_connect(transport, 0, NULL); + if (!data->got_remote_heads) { + int i; + int must_list_refs = 0; + for (i = 0; i < nr_heads; i++) { + if (!to_fetch[i]->exact_oid) { + must_list_refs = 1; + break; + } + } + refs_tmp = handshake(transport, 0, NULL, must_list_refs); + } switch (data->version) { case protocol_v2: -- cgit v1.2.3