From: Jeff Hostetler <git@xxxxxxxxxxxxxxxxx> Teach index-pack to optionally not complain when there are missing blobs. This is for use following a partial clone or fetch when the server omitted certain blobs. Signed-off-by: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> --- builtin/index-pack.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/builtin/index-pack.c b/builtin/index-pack.c index f4b87c6..8f99408 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -13,7 +13,7 @@ #include "thread-utils.h" static const char index_pack_usage[] = -"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])"; +"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--allow-partial] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])"; struct object_entry { struct pack_idx_entry idx; @@ -81,6 +81,9 @@ static int show_resolving_progress; static int show_stat; static int check_self_contained_and_connected; +static int allow_partial; +static struct trace_key trace_partial = TRACE_KEY_INIT(PARTIAL); + static struct progress *progress; /* We always read in 4kB chunks. */ @@ -220,9 +223,18 @@ static unsigned check_object(struct object *obj) if (!(obj->flags & FLAG_CHECKED)) { unsigned long size; int type = sha1_object_info(obj->oid.hash, &size); - if (type <= 0) + if (type <= 0) { + if (allow_partial > 0 && obj->type == OBJ_BLOB) { + /* Assume a previous partial clone/fetch omitted it. */ + trace_printf_key( + &trace_partial, "omitted blob '%s'\n", + oid_to_hex(&obj->oid)); + obj->flags |= FLAG_CHECKED; + return 0; + } die(_("did not receive expected object %s"), oid_to_hex(&obj->oid)); + } if (type != obj->type) die(_("object %s: expected type %s, found %s"), oid_to_hex(&obj->oid), @@ -1718,6 +1730,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) die(_("bad %s"), arg); } else if (skip_prefix(arg, "--max-input-size=", &arg)) { max_input_size = strtoumax(arg, NULL, 10); + } else if (!strcmp(arg, "--allow-partial")) { + allow_partial = 1; + } else if (!strcmp(arg, "--no-allow-partial")) { + allow_partial = 0; } else usage(index_pack_usage); continue; -- 2.7.4