mirror of
https://github.com/git/git
synced 2024-11-05 18:59:29 +00:00
fetch: Speed up fetch of large numbers of refs
When there are large numbers of refs, calling read_ref for each ref is inefficent (and infact downright slow) - so instead use for_each_ref to build up a string list of all the refs that we currently have, which significantly improves the volume. Signed-off-by: Julian Phillips <julian@quantumfyre.co.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
73cf0822b2
commit
b1a01e1c07
1 changed files with 14 additions and 3 deletions
|
@ -489,7 +489,8 @@ static int add_existing(const char *refname, const unsigned char *sha1,
|
||||||
int flag, void *cbdata)
|
int flag, void *cbdata)
|
||||||
{
|
{
|
||||||
struct string_list *list = (struct string_list *)cbdata;
|
struct string_list *list = (struct string_list *)cbdata;
|
||||||
string_list_insert(refname, list);
|
struct string_list_item *item = string_list_insert(refname, list);
|
||||||
|
item->util = (void *)sha1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -615,9 +616,14 @@ static void check_not_current_branch(struct ref *ref_map)
|
||||||
static int do_fetch(struct transport *transport,
|
static int do_fetch(struct transport *transport,
|
||||||
struct refspec *refs, int ref_count)
|
struct refspec *refs, int ref_count)
|
||||||
{
|
{
|
||||||
|
struct string_list existing_refs = { NULL, 0, 0, 0 };
|
||||||
|
struct string_list_item *peer_item = NULL;
|
||||||
struct ref *ref_map;
|
struct ref *ref_map;
|
||||||
struct ref *rm;
|
struct ref *rm;
|
||||||
int autotags = (transport->remote->fetch_tags == 1);
|
int autotags = (transport->remote->fetch_tags == 1);
|
||||||
|
|
||||||
|
for_each_ref(add_existing, &existing_refs);
|
||||||
|
|
||||||
if (transport->remote->fetch_tags == 2 && tags != TAGS_UNSET)
|
if (transport->remote->fetch_tags == 2 && tags != TAGS_UNSET)
|
||||||
tags = TAGS_SET;
|
tags = TAGS_SET;
|
||||||
if (transport->remote->fetch_tags == -1)
|
if (transport->remote->fetch_tags == -1)
|
||||||
|
@ -640,8 +646,13 @@ static int do_fetch(struct transport *transport,
|
||||||
check_not_current_branch(ref_map);
|
check_not_current_branch(ref_map);
|
||||||
|
|
||||||
for (rm = ref_map; rm; rm = rm->next) {
|
for (rm = ref_map; rm; rm = rm->next) {
|
||||||
if (rm->peer_ref)
|
if (rm->peer_ref) {
|
||||||
read_ref(rm->peer_ref->name, rm->peer_ref->old_sha1);
|
peer_item = string_list_lookup(rm->peer_ref->name,
|
||||||
|
&existing_refs);
|
||||||
|
if (peer_item)
|
||||||
|
hashcpy(rm->peer_ref->old_sha1,
|
||||||
|
peer_item->util);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tags == TAGS_DEFAULT && autotags)
|
if (tags == TAGS_DEFAULT && autotags)
|
||||||
|
|
Loading…
Reference in a new issue