From 801f5ab223ca9a5c11905ebc16e20260bee84230 Mon Sep 17 00:00:00 2001 From: "Robin H. Johnson" Date: Sat, 22 Feb 2014 18:31:53 -0800 Subject: clone: allow initial sparse checkouts 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 Signed-off-by: Junio C Hamano --- 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 bf3dac0cef..c5fd261f77 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -14,6 +14,7 @@ SYNOPSIS [-o ] [-b ] [-u ] [--reference ] [--separate-git-dir ] [--depth ] [--[no-]single-branch] + [--sparse-checkout ] [--recursive | --recurse-submodules] [--] [] @@ -212,6 +213,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 :: + 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. :: The (possibly remote) repository to clone from. See the diff --git a/builtin/clone.c b/builtin/clone.c index 43e772ccdb..11373712ef 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) { -- cgit v1.2.1