summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Tan <jonathantanmy@google.com>2018-09-27 19:24:05 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-10-07 00:53:15 (GMT)
commit01775651481ecd9c7288a85cfb7999f7f38ab37c (patch)
tree3e2dfaec7103a81426e4d8dd3a7e16ddd6fa0587
parent99bcb883cb2bd2d27939a831a66d794770427e98 (diff)
downloadgit-01775651481ecd9c7288a85cfb7999f7f38ab37c.zip
git-01775651481ecd9c7288a85cfb7999f7f38ab37c.tar.gz
git-01775651481ecd9c7288a85cfb7999f7f38ab37c.tar.bz2
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 <remote> <sha-1>" will be done in a subsequent patch. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--fetch-pack.c2
-rwxr-xr-xt/t5702-protocol-v2.sh4
-rw-r--r--transport.c13
3 files changed, 16 insertions, 3 deletions
diff --git a/fetch-pack.c b/fetch-pack.c
index 75047a4..15652b4 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 3beeed4..e32b5b4 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 5fb9ff6..4329cca 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: