From: Jeff Hostetler <git@xxxxxxxxxxxxxxxxx> Teach clone to accept --partial-by-size=n and --partial-special arguments to request that the server omit certain blobs from the generated packfile. Signed-off-by: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> --- builtin/clone.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/builtin/clone.c b/builtin/clone.c index 3f63edb..e5a5904 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -56,6 +56,8 @@ static struct string_list option_required_reference = STRING_LIST_INIT_NODUP; static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP; static int option_dissociate; static int max_jobs = -1; +static const char *partial_by_size; +static int partial_special; static struct option builtin_clone_options[] = { OPT__VERBOSITY(&option_verbosity), @@ -112,6 +114,11 @@ static struct option builtin_clone_options[] = { TRANSPORT_FAMILY_IPV4), OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"), TRANSPORT_FAMILY_IPV6), + OPT_STRING(0, "partial-by-size", &partial_by_size, + N_("size"), + N_("only include blobs smaller than this")), + OPT_BOOL(0, "partial-special", &partial_special, + N_("only include blobs for git special files")), OPT_END() }; @@ -625,6 +632,9 @@ static void update_remote_refs(const struct ref *refs, if (check_connectivity) { struct check_connected_options opt = CHECK_CONNECTED_INIT; + if (partial_by_size || partial_special) + opt.allow_partial = 1; + opt.transport = transport; opt.progress = transport->progress; @@ -1021,6 +1031,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix) warning(_("--shallow-since is ignored in local clones; use file:// instead.")); if (option_not.nr) warning(_("--shallow-exclude is ignored in local clones; use file:// instead.")); + if (partial_by_size) + warning(_("--partial-by-size is ignored in local clones; use file:// instead.")); + if (partial_special) + warning(_("--partial-special is ignored in local clones; use file:// instead.")); if (!access(mkpath("%s/shallow", path), F_OK)) { if (option_local > 0) warning(_("source repository is shallow, ignoring --local")); @@ -1052,6 +1066,18 @@ int cmd_clone(int argc, const char **argv, const char *prefix) transport_set_option(transport, TRANS_OPT_UPLOADPACK, option_upload_pack); + if (partial_by_size) { + transport_set_option(transport, TRANS_OPT_PARTIAL_BY_SIZE, + partial_by_size); + if (transport->smart_options) + transport->smart_options->partial_by_size = partial_by_size; + } + if (partial_special) { + transport_set_option(transport, TRANS_OPT_PARTIAL_SPECIAL, "yes"); + if (transport->smart_options) + transport->smart_options->partial_special = 1; + } + if (transport->smart_options && !deepen) transport->smart_options->check_self_contained_and_connected = 1; -- 2.7.4