Re: [PATCH v2] Limit refs to fetch to minimum in shallow clones
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:52:43
Nguyễn Thái Ngọc Duy [off-list ref] writes:
The main purpose of shallow clones is to reduce download by only fetching objects up to a certain depth from the given refs. The number of objects depends on how many refs to follow. So: - Only fetch HEAD or the ref specified by --branch - Only fetch tags that point to downloaded objects More tags/branches can be fetched later using git-fetch as usual. Signed-off-by: Nguyễn Thái Ngọc Duy <redacted> --- Only lightly tested, but seems to work.
Thanks. Perhaps you would want to add tests so that you do not have to say "lightly tested"?
quoted hunk
diff --git a/builtin/clone.c b/builtin/clone.c index efe8b6c..8de9248 100644 --- a/builtin/clone.c +++ b/builtin/clone.c@@ -48,6 +48,7 @@ static int option_verbosity; static int option_progress; static struct string_list option_config; static struct string_list option_reference; +static char *src_ref_prefix = "refs/heads/";
Would this be const?
quoted hunk
static int opt_parse_reference(const struct option *opt, const char *arg, int unset) {@@ -427,9 +428,27 @@ static struct ref *wanted_peer_refs(const struct ref *refs, struct ref *local_refs = head; struct ref **tail = head ? &head->next : &local_refs; - get_fetch_map(refs, refspec, &tail, 0); - if (!option_mirror) - get_fetch_map(refs, tag_refspec, &tail, 0); + if (option_depth) { + struct ref *remote_head = NULL; + + if (!option_branch) + remote_head = guess_remote_head(head, refs, 0); + else { + struct strbuf sb = STRBUF_INIT; + strbuf_addstr(&sb, src_ref_prefix); + strbuf_addstr(&sb, option_branch); + remote_head = find_ref_by_name(refs, sb.buf); + strbuf_release(&sb); + } + + if (remote_head) + get_fetch_map(remote_head, refspec, &tail, 0);
What happens when we fail to find any remote_head and make no call to get_fetch_map() here? I am wondering if that should trigger an error here. Also this breaks 5500 for rather obvious reasons, as the point of this patch is to reduce the object transferred when a shallow clone is made. Perhaps there should be an option to give users the historical "all branches equally shallow" behaviour?