summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2014-02-22 18:31:53 -0800
committerJunio C Hamano <gitster@pobox.com>2014-02-25 09:54:07 -0800
commit801f5ab223ca9a5c11905ebc16e20260bee84230 (patch)
tree872e00d9a4de22c14c0a10291598e6f6ca6e2a2b
parent5f95c9f850b19b368c43ae399cc831b17a26a5ac (diff)
downloadgit-rj/clone-checkout-sparse.tar.gz
clone: allow initial sparse checkoutsrj/clone-checkout-sparse
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@gentoo.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--Documentation/git-clone.txt5
-rw-r--r--builtin/clone.c24
2 files changed, 29 insertions, 0 deletions
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 <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>]
@@ -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 <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 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) {