I have not looked at non-builtin commands yet, but I think it's not a big deal. We have several rounds before this series is good enough ;) So in short, sparse prefix will be stored in config, core.sparsecheckout. you have three new commands to enter/update/leave sparse checkout: git clone --path=prefix # clone with sparse checkout git checkout --path=prefix # limit/update checkout paths git checkout --full # stop sparse checkout Other operations should be normal. User attempts to do anything outside sparse checkout will get flagged. Git itself should not touch anything outside sparse checkout. One more thing. As files outside sparse checkout will not be checking out, .gitignore and .gitattributes from parent directories (outside sparse checkout) will be gone too. This may lead to surprise. Comments are welcome. Nguyễn Thái Ngọc Duy (12): git-grep: read config git-grep: support --no-external-grep Introduce sparse prefix Protect index with sparse prefix tests for sparse checkout, index protection Avoid accessing working directory outside sparse prefix tests for sparse checkout, worktree protection git-clone: support --path to do sparse clone tests for sparse clone git-checkout: support --full and --path to manipulate sparse checkout tests for checkout [--full|--path] git-status: print sparse checkout status builtin-add.c | 4 +- builtin-apply.c | 5 + builtin-checkout-index.c | 2 + builtin-checkout.c | 46 ++++++- builtin-clean.c | 3 + builtin-clone.c | 13 ++ builtin-commit.c | 13 ++- builtin-grep.c | 36 +++-- builtin-ls-files.c | 6 +- builtin-ls-tree.c | 2 +- builtin-merge-recursive.c | 6 +- builtin-mv.c | 2 +- builtin-read-tree.c | 5 + builtin-rev-parse.c | 4 + builtin-rm.c | 7 +- builtin-update-index.c | 37 ++++- cache.h | 19 +++ config.c | 7 + diff-lib.c | 5 +- diff.c | 3 +- entry.c | 3 + environment.c | 221 ++++++++++++++++++++++++++ read-cache.c | 112 +++++++++++++- setup.c | 90 +++++++++++- sha1_file.c | 3 + t/t2010-checkout-sparse.sh | 71 +++++++++ t/t2300-sparse-index.sh | 156 +++++++++++++++++++ t/t2300/diff-index-sub.expected | 3 + t/t2300/log.expected | 64 ++++++++ t/t2301-sparse-index-merge-recursive.sh | 226 +++++++++++++++++++++++++++ t/t2302-sparse-worktree.sh | 113 ++++++++++++++ t/t2302/add-u.expected | 1 + t/t2302/add.expected | 2 + t/t2302/commit.expected | 14 ++ t/t2302/diff-1.expected | 7 + t/t2302/diff-cc.expected | 9 + t/t2302/grep-work.expected | 2 + t/t2302/grep.expected | 2 + t/t2302/ls-files.expected | 2 + t/t2303-sparse-worktree-apply.sh | 62 ++++++++ t/t2303/apply-initial.patch | 14 ++ t/t2303/apply-inside.patch | 7 + t/t2303/apply-leading-dirs.patch | 3 + t/t2303/apply-outside.patch | 7 + t/t2303/apply-remove.patch | 7 + t/t2303/apply-rename.expected | 13 ++ t/t2303/apply-rename.patch | 4 + t/t2304-sparse-worktree-merge-recursive.sh | 233 ++++++++++++++++++++++++++++ t/t5703-clone-sparse.sh | 40 +++++ unpack-trees.c | 152 +++++++++++++++++-- unpack-trees.h | 4 +- wt-status.c | 12 +- 52 files changed, 1831 insertions(+), 53 deletions(-) create mode 100755 t/t2010-checkout-sparse.sh create mode 100755 t/t2300-sparse-index.sh create mode 100644 t/t2300/diff-index-sub.expected create mode 100644 t/t2300/log.expected create mode 100755 t/t2301-sparse-index-merge-recursive.sh create mode 100755 t/t2302-sparse-worktree.sh create mode 100644 t/t2302/add-u.expected create mode 100644 t/t2302/add.expected create mode 100644 t/t2302/commit.expected create mode 100644 t/t2302/diff-1.expected create mode 100644 t/t2302/diff-cc.expected create mode 100644 t/t2302/grep-work.expected create mode 100644 t/t2302/grep.expected create mode 100644 t/t2302/ls-files.expected create mode 100755 t/t2303-sparse-worktree-apply.sh create mode 100644 t/t2303/apply-initial.patch create mode 100644 t/t2303/apply-inside.patch create mode 100644 t/t2303/apply-leading-dirs.patch create mode 100644 t/t2303/apply-outside.patch create mode 100644 t/t2303/apply-remove.patch create mode 100644 t/t2303/apply-rename.expected create mode 100644 t/t2303/apply-rename.patch create mode 100755 t/t2304-sparse-worktree-merge-recursive.sh create mode 100755 t/t5703-clone-sparse.sh -- 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