Presently if you want to perform a sparse checkout, you must either do a full clone and then recheckout, or do a git init, manually set up sparse, and then fetch and checkout. This patch implements easily accessible sparse checkouts during clone, in the --sparse-checkout option. $ git clone REPO --sparse-checkout PATH Signed-off-by: Robin H. Johnson <robbat2@xxxxxxxxxx> --- Documentation/git-clone.txt | 5 +++++ builtin/clone.c | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 0363d00..1c21207 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -14,6 +14,7 @@ SYNOPSIS [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>] [--separate-git-dir <git dir>] [--depth <depth>] [--[no-]single-branch] + [--sparse-checkout <path>] [--recursive | --recurse-submodules] [--] <repository> [<directory>] @@ -209,6 +210,10 @@ objects from the source repository into a pack in the cloned repository. The result is Git repository can be separated from working tree. +--sparse-checkout <path>:: + Perform the initial checkout as a sparse checkout, checking out only the + paths specified by this option. This option may occur multiple times, with + one path per instance. <repository>:: The (possibly remote) repository to clone from. See the diff --git a/builtin/clone.c b/builtin/clone.c index 43e772c..1137371 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -48,6 +48,7 @@ static int option_verbosity; static int option_progress = -1; static struct string_list option_config; static struct string_list option_reference; +static struct string_list option_sparse_checkout_path; static int opt_parse_reference(const struct option *opt, const char *arg, int unset) { @@ -97,6 +98,8 @@ static struct option builtin_clone_options[] = { N_("separate git dir from working tree")), OPT_STRING_LIST('c', "config", &option_config, N_("key=value"), N_("set config inside the new repository")), + OPT_STRING_LIST(0, "sparse-checkout", &option_sparse_checkout_path, N_("path"), + N_("set path for sparse checkout")), OPT_END() }; @@ -270,6 +273,24 @@ static void setup_reference(void) for_each_string_list(&option_reference, add_one_reference, NULL); } +static void setup_sparse_checkout(void) +{ + FILE *info_sparse_checkout_fp; + struct string_list_item *item; + char *path = git_pathdup("info/sparse-checkout"); + git_config_set("core.sparsecheckout", "true"); + safe_create_leading_directories(path); + info_sparse_checkout_fp = fopen(path, "w"); + if (!info_sparse_checkout_fp) + die(_("unable to create %s"), path); + for_each_string_list_item(item, &option_sparse_checkout_path) { + fprintf(info_sparse_checkout_fp, "%s\n", item->string); + } + fclose(info_sparse_checkout_fp); + adjust_shared_perm(path); + free(path); +} + static void copy_alternates(struct strbuf *src, struct strbuf *dst, const char *src_repo) { @@ -873,6 +894,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix) init_db(option_template, INIT_DB_QUIET); write_config(&option_config); + if(option_sparse_checkout_path.nr) + setup_sparse_checkout(); + git_config(git_default_config, NULL); if (option_bare) { -- 1.9.0.291.g027825b.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html