From: Jeff Hostetler <git@xxxxxxxxxxxxxxxxx> Teach rev-list 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/rev-list.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 0aa93d5..50c49ba 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -45,6 +45,7 @@ static const char rev_list_usage[] = " --left-right\n" " --count\n" " special purpose:\n" +" --allow-partial\n" " --bisect\n" " --bisect-vars\n" " --bisect-all" @@ -53,6 +54,9 @@ static const char rev_list_usage[] = static struct progress *progress; static unsigned progress_counter; +static int allow_partial; +static struct trace_key trace_partial = TRACE_KEY_INIT(PARTIAL); + static void finish_commit(struct commit *commit, void *data); static void show_commit(struct commit *commit, void *data) { @@ -178,8 +182,16 @@ static void finish_commit(struct commit *commit, void *data) static void finish_object(struct object *obj, const char *name, void *cb_data) { struct rev_list_info *info = cb_data; - if (obj->type == OBJ_BLOB && !has_object_file(&obj->oid)) + if (obj->type == OBJ_BLOB && !has_object_file(&obj->oid)) { + if (allow_partial) { + /* Assume a previous partial clone/fetch omitted it. */ + trace_printf_key( + &trace_partial, "omitted blob '%s' '%s'\n", + oid_to_hex(&obj->oid), name); + return; + } die("missing blob object '%s'", oid_to_hex(&obj->oid)); + } if (info->revs->verify_objects && !obj->parsed && obj->type != OBJ_COMMIT) parse_object(obj->oid.hash); } @@ -329,6 +341,14 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) show_progress = arg; continue; } + if (!strcmp(arg, "--allow-partial")) { + allow_partial = 1; + continue; + } + if (!strcmp(arg, "--no-allow-partial")) { + allow_partial = 0; + continue; + } usage(rev_list_usage); } -- 2.7.4