* Hard reset of a subdirectory in a sparse checkout setting @ 2013-03-22 10:28 Kirill Müller 2013-03-23 9:59 ` Duy Nguyen 2013-03-24 5:06 ` [PATCH] checkout: add --sparse for restoring files in sparse checkout mode Nguyễn Thái Ngọc Duy 0 siblings, 2 replies; 17+ messages in thread From: Kirill Müller @ 2013-03-22 10:28 UTC (permalink / raw) To: git Hi I can't find a neat way to "git reset --hard" a subdirectory of a checkout without reading in directories or files which are excluded by a sparse checkout. This has been asked on StackOverflow in greater detail, but the "right" answer is still missing: http://stackoverflow.com/q/15404535/946850 The options I see are: - git checkout . (will restore excluded directories) - git reset --hard (won't accept a path argument) - git diff | patch -R (awkward) What's the proper way to do this in Git? The script below illustrates the problem. The proper command should be inserted below the "How to make files ..." comment -- the current command "git checkout -- a" will restore the file a/c/ac which is supposed to be excluded by the sparse checkout. Note that I do not want to explicitly restore a/a and a/b, I only "know" a and want to restore everything below. And I also don't "know" b, or which other directories reside on the same level as a. Thank you for your help. Cheers Kirill #!/bin/sh rm -rf repo; git init repo; cd repo for f in a b; do for g in a b c; do mkdir -p $f/$g touch $f/$g/$f$g git add $f/$g git commit -m "added $f/$g" done done git config core.sparsecheckout true echo a/a > .git/info/sparse-checkout echo a/b >> .git/info/sparse-checkout echo b/a >> .git/info/sparse-checkout git read-tree -m -u HEAD echo "After read-tree:" find * -type f rm a/a/aa rm a/b/ab echo >> b/a/ba echo "After modifying:" find * -type f git status # How to make files a/* reappear without changing b and without recreating a/c? git checkout -- a echo "After checkout:" git status find * -type f ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Hard reset of a subdirectory in a sparse checkout setting 2013-03-22 10:28 Hard reset of a subdirectory in a sparse checkout setting Kirill Müller @ 2013-03-23 9:59 ` Duy Nguyen 2013-03-23 13:02 ` Kirill Müller 2013-03-24 5:06 ` [PATCH] checkout: add --sparse for restoring files in sparse checkout mode Nguyễn Thái Ngọc Duy 1 sibling, 1 reply; 17+ messages in thread From: Duy Nguyen @ 2013-03-23 9:59 UTC (permalink / raw) To: Kirill Müller; +Cc: git On Fri, Mar 22, 2013 at 5:28 PM, Kirill Müller <kirill.mueller@ivt.baug.ethz.ch> wrote: > I can't find a neat way to "git reset --hard" a subdirectory of a checkout > without reading in directories or files which are excluded by a sparse > checkout. This has been asked on StackOverflow in greater detail, but the > "right" answer is still missing: http://stackoverflow.com/q/15404535/946850 > > The options I see are: > > - git checkout . (will restore excluded directories) > > - git reset --hard (won't accept a path argument) > > - git diff | patch -R (awkward) Another way is git diff --name-only -z|xargs -0 git checkout > What's the proper way to do this in Git? I think adding --sparse to git checkout may be more user-friendly. And it looks like a simple change. I'll make a patch soon (I need some time to recall how sparse checkout interacts with git-checkout). -- Duy ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Hard reset of a subdirectory in a sparse checkout setting 2013-03-23 9:59 ` Duy Nguyen @ 2013-03-23 13:02 ` Kirill Müller 0 siblings, 0 replies; 17+ messages in thread From: Kirill Müller @ 2013-03-23 13:02 UTC (permalink / raw) To: Duy Nguyen; +Cc: git On 03/23/2013 10:59 AM, Duy Nguyen wrote: > On Fri, Mar 22, 2013 at 5:28 PM, Kirill Müller > <kirill.mueller@ivt.baug.ethz.ch> wrote: >> What's the proper way to do this in Git? > I think adding --sparse to git checkout may be more user-friendly. And > it looks like a simple change. I'll make a patch soon (I need some > time to recall how sparse checkout interacts with git-checkout). Thanks for looking into it. Would it mean an extra switch to the checkout command, or default behavior? -Kirill ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH] checkout: add --sparse for restoring files in sparse checkout mode 2013-03-22 10:28 Hard reset of a subdirectory in a sparse checkout setting Kirill Müller 2013-03-23 9:59 ` Duy Nguyen @ 2013-03-24 5:06 ` Nguyễn Thái Ngọc Duy 2013-03-24 6:12 ` Eric Sunshine ` (2 more replies) 1 sibling, 3 replies; 17+ messages in thread From: Nguyễn Thái Ngọc Duy @ 2013-03-24 5:06 UTC (permalink / raw) To: git; +Cc: kirill.mueller, Nguyễn Thái Ngọc Duy "git checkout -- <paths>" is usually used to restore all modified files in <paths>. In sparse checkout mode, this command is overloaded with another meaning: to add back all files in <paths> that are excluded by sparse patterns. Add "--sparse" option to do what normal mode does: restore all modified files and nothing else. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> --- I'm not sure if rejecting --sparse when it has no effects (e.g. switching branches or interactive mode) like this patch does is a good idea. I think it's good in general to spot unused options. On the other hand, people may want to add an alias "co = checkout --sparse" to make this behavior "default". In that case silently ignoring --sparse may be a good idea. Documentation/git-checkout.txt | 7 +++++++ builtin/checkout.c | 18 ++++++++++++++++-- t/t1011-read-tree-sparse-checkout.sh | 12 ++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 8edcdca..45a2b53 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of the working tree. Afterwards you will be ready to prepare your new files, repopulating the working tree, by copying them from elsewhere, extracting a tarball, etc. + +--sparse:: + In sparse checkout mode, `git checkout -- <paths>` would + update all entries matched by <paths> regardless sparse + patterns. This option only updates entries matched by <paths> + and sparse patterns. + -m:: --merge:: When switching branches, diff --git a/builtin/checkout.c b/builtin/checkout.c index a9c1b5a..3a32145 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -35,6 +35,7 @@ struct checkout_opts { int force_detach; int writeout_stage; int overwrite_ignore; + int sparse; const char *new_branch; const char *new_branch_force; @@ -224,7 +225,7 @@ static int checkout_paths(const struct checkout_opts *opts, struct checkout state; static char *ps_matched; unsigned char rev[20]; - int flag; + int flag, sparse; struct commit *head; int errs = 0; int stage = opts->writeout_stage; @@ -254,9 +255,13 @@ static int checkout_paths(const struct checkout_opts *opts, die(_("Cannot update paths and switch to branch '%s' at the same time."), opts->new_branch); - if (opts->patch_mode) + if (opts->patch_mode) { + if (opts->sparse != -1) + die(_("--[no-]sparse cannot be used in interactive mode")); return run_add_interactive(revision, "--patch=checkout", opts->pathspec); + } + sparse = opts->sparse != -1 ? opts->sparse : 0; lock_file = xcalloc(1, sizeof(struct lock_file)); @@ -275,6 +280,8 @@ static int checkout_paths(const struct checkout_opts *opts, struct cache_entry *ce = active_cache[pos]; if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) continue; + if (sparse && ce_skip_worktree(ce)) + continue; match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched); } @@ -315,6 +322,8 @@ static int checkout_paths(const struct checkout_opts *opts, struct cache_entry *ce = active_cache[pos]; if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) continue; + if (sparse && ce_skip_worktree(ce)) + continue; if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) { if (!ce_stage(ce)) { errs |= checkout_entry(ce, &state, NULL); @@ -963,6 +972,9 @@ static int checkout_branch(struct checkout_opts *opts, if (opts->pathspec) die(_("paths cannot be used with switching branches")); + if (opts->sparse != -1) + die(_("--[no-]sparse can only be used with paths")); + if (opts->patch_mode) die(_("'%s' cannot be used with switching branches"), "--patch"); @@ -1029,6 +1041,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) OPT_STRING(0, "conflict", &conflict_style, N_("style"), N_("conflict style (merge or diff3)")), OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks interactively")), + OPT_BOOL(0, "sparse", &opts.sparse, N_("limit pathspecs to sparse entries only")), { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL, N_("second guess 'git checkout no-such-branch'"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, @@ -1039,6 +1052,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) memset(&new, 0, sizeof(new)); opts.overwrite_ignore = 1; opts.prefix = prefix; + opts.sparse = -1; gitmodules_config(); git_config(git_checkout_config, &opts); diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh index 5c0053a..1441fbe 100755 --- a/t/t1011-read-tree-sparse-checkout.sh +++ b/t/t1011-read-tree-sparse-checkout.sh @@ -250,4 +250,16 @@ EOF test_cmp expected actual ' +test_expect_success 'checkout --sparse' ' + echo "*" >.git/info/sparse-checkout && + git checkout -f top && + test -f init.t && + echo sub >.git/info/sparse-checkout && + git checkout && + echo modified >> sub/added && + git checkout --sparse . && + ! test -f init.t && + git diff --exit-code HEAD +' + test_done -- 1.8.2.83.gc99314b ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode 2013-03-24 5:06 ` [PATCH] checkout: add --sparse for restoring files in sparse checkout mode Nguyễn Thái Ngọc Duy @ 2013-03-24 6:12 ` Eric Sunshine 2013-03-24 18:17 ` Jonathan Nieder 2013-03-30 10:02 ` [PATCH v2] checkout: add --no-widen " Nguyễn Thái Ngọc Duy 2 siblings, 0 replies; 17+ messages in thread From: Eric Sunshine @ 2013-03-24 6:12 UTC (permalink / raw) To: Nguyễn Thái Ngọc Duy; +Cc: Git List, kirill.mueller On Sun, Mar 24, 2013 at 1:06 AM, Nguyễn Thái Ngọc Duy <pclouds@gmail.com> wrote: > diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt > index 8edcdca..45a2b53 100644 > --- a/Documentation/git-checkout.txt > +++ b/Documentation/git-checkout.txt > @@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of the working tree. > +--sparse:: > + In sparse checkout mode, `git checkout -- <paths>` would > + update all entries matched by <paths> regardless sparse s/regardless/regardless of/ > + patterns. This option only updates entries matched by <paths> > + and sparse patterns. > + ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode 2013-03-24 5:06 ` [PATCH] checkout: add --sparse for restoring files in sparse checkout mode Nguyễn Thái Ngọc Duy 2013-03-24 6:12 ` Eric Sunshine @ 2013-03-24 18:17 ` Jonathan Nieder 2013-03-24 19:50 ` Kirill Müller 2013-03-25 1:34 ` Duy Nguyen 2013-03-30 10:02 ` [PATCH v2] checkout: add --no-widen " Nguyễn Thái Ngọc Duy 2 siblings, 2 replies; 17+ messages in thread From: Jonathan Nieder @ 2013-03-24 18:17 UTC (permalink / raw) To: Nguyễn Thái Ngọc Duy; +Cc: git, kirill.mueller Hi, Nguyễn Thái Ngọc Duy wrote: > --- a/Documentation/git-checkout.txt > +++ b/Documentation/git-checkout.txt > @@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of the working tree. > Afterwards you will be ready to prepare your new files, repopulating the > working tree, by copying them from elsewhere, extracting a tarball, etc. > > + > +--sparse:: > + In sparse checkout mode, `git checkout -- <paths>` would > + update all entries matched by <paths> regardless sparse > + patterns. This option only updates entries matched by <paths> > + and sparse patterns. Hm, should this be the default? In principle, I would expect git checkout -- . to make the worktree match the index, respecting the sparse checkout. And something like git checkout --widen -- . to change the sparse checkout pattern. But of course it is easily possible that I am missing some details of how sparse checkout is used in practice. What do you think? Jonathan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode 2013-03-24 18:17 ` Jonathan Nieder @ 2013-03-24 19:50 ` Kirill Müller 2013-03-25 1:34 ` Duy Nguyen 1 sibling, 0 replies; 17+ messages in thread From: Kirill Müller @ 2013-03-24 19:50 UTC (permalink / raw) To: Jonathan Nieder; +Cc: Nguyễn Thái Ngọc Duy, git Hi On 03/24/2013 07:17 PM, Jonathan Nieder wrote: > Hi, > > Nguyễn Thái Ngọc Duy wrote: > >> --- a/Documentation/git-checkout.txt >> +++ b/Documentation/git-checkout.txt >> @@ -180,6 +180,13 @@ branch by running "git rm -rf ." from the top level of the working tree. >> Afterwards you will be ready to prepare your new files, repopulating the >> working tree, by copying them from elsewhere, extracting a tarball, etc. >> >> + >> +--sparse:: >> + In sparse checkout mode, `git checkout -- <paths>` would >> + update all entries matched by <paths> regardless sparse >> + patterns. This option only updates entries matched by <paths> >> + and sparse patterns. > Hm, should this be the default? > > In principle, I would expect > > git checkout -- . > > to make the worktree match the index, respecting the sparse checkout. > And something like > > git checkout --widen -- . > > to change the sparse checkout pattern. But of course it is easily > possible that I am missing some details of how sparse checkout is > used in practice. > > What do you think? Thank you for your opinion. I'd second that. When I do a sparse checkout, I want to see only the directories I have included and not excluded, unless I explicitly change that. -Kirill ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode 2013-03-24 18:17 ` Jonathan Nieder 2013-03-24 19:50 ` Kirill Müller @ 2013-03-25 1:34 ` Duy Nguyen 2013-03-25 1:57 ` Jonathan Nieder 1 sibling, 1 reply; 17+ messages in thread From: Duy Nguyen @ 2013-03-25 1:34 UTC (permalink / raw) To: Jonathan Nieder; +Cc: git, kirill.mueller On Mon, Mar 25, 2013 at 1:17 AM, Jonathan Nieder <jrnieder@gmail.com> wrote: >> +--sparse:: >> + In sparse checkout mode, `git checkout -- <paths>` would >> + update all entries matched by <paths> regardless sparse >> + patterns. This option only updates entries matched by <paths> >> + and sparse patterns. > > Hm, should this be the default? > > In principle, I would expect > > git checkout -- . > > to make the worktree match the index, respecting the sparse checkout. > And something like > > git checkout --widen -- . > > to change the sparse checkout pattern. But of course it is easily > possible that I am missing some details of how sparse checkout is > used in practice. > > What do you think? Changing the default may involve a painful transition phase (e.g. "add -u"). I think making it the default via alias should be good enough in most cases. We also need to think how it impacts checkout usage in scripts. I think it might be ok, but I haven't finished my morning coffee yet, so.. -- Duy ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode 2013-03-25 1:34 ` Duy Nguyen @ 2013-03-25 1:57 ` Jonathan Nieder 0 siblings, 0 replies; 17+ messages in thread From: Jonathan Nieder @ 2013-03-25 1:57 UTC (permalink / raw) To: Duy Nguyen; +Cc: git, kirill.mueller Duy Nguyen wrote: > On Mon, Mar 25, 2013 at 1:17 AM, Jonathan Nieder <jrnieder@gmail.com> wrote: >> Hm, should this be the default? >> >> In principle, I would expect >> >> git checkout -- . >> >> to make the worktree match the index, respecting the sparse checkout. >> And something like >> >> git checkout --widen -- . >> >> to change the sparse checkout pattern. [...] > Changing the default may involve a painful transition phase (e.g. "add > -u"). I don't think it needs to. There aren't many people using sparse checkout even these days, and I think they'd generally be happy about the change. But if we want to be conservative until some later point (like 2.1), perhaps --sparse should be named something like --no-widen? That way, I can do git checkout --no-widen -- . to make the worktree match the index, respecting the sparse checkout. And I can do git checkout --widen -- . to change the sparse checkout pattern. Meanwhile the confusing command git checkout -- . would be ill-defined for sparse checkouts --- in past git versions, if I understand you correctly it acted like --widen, while in some unspecified future version it may change to mean --no-widen. No need for warnings because I doubt anyone is relying on either behavior. Would that work? Jonathan ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode 2013-03-24 5:06 ` [PATCH] checkout: add --sparse for restoring files in sparse checkout mode Nguyễn Thái Ngọc Duy 2013-03-24 6:12 ` Eric Sunshine 2013-03-24 18:17 ` Jonathan Nieder @ 2013-03-30 10:02 ` Nguyễn Thái Ngọc Duy 2013-04-01 4:48 ` Jonathan Nieder 2013-04-12 23:12 ` [PATCH v3] checkout: add --ignore-skip-worktree-bits " Nguyễn Thái Ngọc Duy 2 siblings, 2 replies; 17+ messages in thread From: Nguyễn Thái Ngọc Duy @ 2013-03-30 10:02 UTC (permalink / raw) To: git Cc: kirill.mueller, Junio C Hamano, Jonathan Niedier, Nguyễn Thái Ngọc Duy "git checkout -- <paths>" is usually used to restore all modified files in <paths>. In sparse checkout mode, this command is overloaded with another meaning: to add back all files in <paths> that are excluded by sparse patterns. Add "--no-widen" option to do what normal mode does: restore all modified files and nothing else. The user can make it "default" by putting it to an alias (e.g. "co = checkout --no-widen") and get back to the original behavior with "git co --widen". Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> --- --sparse -> --no-widen and git-checkout does not error out when the option is specified but has no effects. Let's see how it works out. We could change the default from --widen to --no-widen later. Documentation/git-checkout.txt | 11 +++++++++++ builtin/checkout.c | 7 +++++++ t/t1011-read-tree-sparse-checkout.sh | 12 ++++++++++++ 3 files changed, 30 insertions(+) diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 8edcdca..538b8b8 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -180,6 +180,17 @@ branch by running "git rm -rf ." from the top level of the working tree. Afterwards you will be ready to prepare your new files, repopulating the working tree, by copying them from elsewhere, extracting a tarball, etc. +--no-widen:: + In sparse checkout mode, `git checkout -- <paths>` would + update all entries matched by <paths> regardless of sparse + patterns. This option only updates entries matched by <paths> + and sparse patterns. + +--widen:: + Revert the effect of `--no-widen` if specified and make + `git checkout -- <paths>` update all entries matched by + <paths> regardless of sparse patterns. + -m:: --merge:: When switching branches, diff --git a/builtin/checkout.c b/builtin/checkout.c index a9c1b5a..246de33 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -35,6 +35,7 @@ struct checkout_opts { int force_detach; int writeout_stage; int overwrite_ignore; + int widen_sparse; const char *new_branch; const char *new_branch_force; @@ -275,6 +276,8 @@ static int checkout_paths(const struct checkout_opts *opts, struct cache_entry *ce = active_cache[pos]; if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) continue; + if (!opts->widen_sparse && ce_skip_worktree(ce)) + continue; match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched); } @@ -315,6 +318,8 @@ static int checkout_paths(const struct checkout_opts *opts, struct cache_entry *ce = active_cache[pos]; if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) continue; + if (!opts->widen_sparse && ce_skip_worktree(ce)) + continue; if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) { if (!ce_stage(ce)) { errs |= checkout_entry(ce, &state, NULL); @@ -1029,6 +1034,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) OPT_STRING(0, "conflict", &conflict_style, N_("style"), N_("conflict style (merge or diff3)")), OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks interactively")), + OPT_BOOL(0, "widen", &opts.widen_sparse, N_("do not limit pathspecs to sparse entries only (default)")), { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL, N_("second guess 'git checkout no-such-branch'"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, @@ -1039,6 +1045,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) memset(&new, 0, sizeof(new)); opts.overwrite_ignore = 1; opts.prefix = prefix; + opts.widen_sparse = 1; gitmodules_config(); git_config(git_checkout_config, &opts); diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh index 5c0053a..4a45714 100755 --- a/t/t1011-read-tree-sparse-checkout.sh +++ b/t/t1011-read-tree-sparse-checkout.sh @@ -250,4 +250,16 @@ EOF test_cmp expected actual ' +test_expect_success 'checkout --no-widen' ' + echo "*" >.git/info/sparse-checkout && + git checkout -f top && + test -f init.t && + echo sub >.git/info/sparse-checkout && + git checkout && + echo modified >> sub/added && + git checkout --no-widen . && + ! test -f init.t && + git diff --exit-code HEAD +' + test_done -- 1.8.2.83.gc99314b ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode 2013-03-30 10:02 ` [PATCH v2] checkout: add --no-widen " Nguyễn Thái Ngọc Duy @ 2013-04-01 4:48 ` Jonathan Nieder 2013-04-01 5:12 ` Junio C Hamano 2013-04-01 5:13 ` Duy Nguyen 2013-04-12 23:12 ` [PATCH v3] checkout: add --ignore-skip-worktree-bits " Nguyễn Thái Ngọc Duy 1 sibling, 2 replies; 17+ messages in thread From: Jonathan Nieder @ 2013-04-01 4:48 UTC (permalink / raw) To: Nguyễn Thái Ngọc Duy; +Cc: git, kirill.mueller, Junio C Hamano Hi, Nguyễn Thái Ngọc Duy wrote: > "git checkout -- <paths>" is usually used to restore all modified > files in <paths>. In sparse checkout mode, this command is overloaded > with another meaning: to add back all files in <paths> that are > excluded by sparse patterns. > > Add "--no-widen" option to do what normal mode does: restore all > modified files and nothing else. In an ideal world, I would like "git checkout --widen" to modify the .git/info/sparse-checkout file, to be able to do: git clone --sparse-checkout=Documentation git://repo.or.cz/git.git cd git git checkout --widen -- README COPYING INSTALL and hack on a tree with Documentation/, README, COPYING, and INSTALL present with no actual code to distract. And "git checkout --no-widen" could be a way to ask to respect the existing sparse pattern. This patch isn't about tweaking the sparse-checkout pattern; instead, it's about how "git checkout" interacts with the skip-worktree bit. Maybe a good name would be --respect-skip-worktree? [...] > --- a/Documentation/git-checkout.txt > +++ b/Documentation/git-checkout.txt > @@ -180,6 +180,17 @@ branch by running "git rm -rf ." from the top level of the working tree. > Afterwards you will be ready to prepare your new files, repopulating the > working tree, by copying them from elsewhere, extracting a tarball, etc. > > +--no-widen:: > + In sparse checkout mode, `git checkout -- <paths>` would > + update all entries matched by <paths> regardless of sparse > + patterns. This option only updates entries matched by <paths> > + and sparse patterns. > + > +--widen:: > + Revert the effect of `--no-widen` if specified and make > + `git checkout -- <paths>` update all entries matched by > + <paths> regardless of sparse patterns. Perhaps, combining the descriptions of the positive and negative forms: --respect-skip-worktree:: By default, `git checkout -- <paths>` creates or updates files matching <paths> regardless of the skip-worktree bit. This option makes 'git checkout' skips entries with the skip-worktree bit set, which can be useful in sparse checkout mode. I'm afraid I can't imagine when --no-respect-skip-worktree would be useful. That can easily be a failure of my imagination, though. What do you think? Thanks, Jonathan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode 2013-04-01 4:48 ` Jonathan Nieder @ 2013-04-01 5:12 ` Junio C Hamano 2013-04-01 5:13 ` Duy Nguyen 1 sibling, 0 replies; 17+ messages in thread From: Junio C Hamano @ 2013-04-01 5:12 UTC (permalink / raw) To: Jonathan Nieder Cc: Nguyễn Thái Ngọc Duy, git, kirill.mueller Jonathan Nieder <jrnieder@gmail.com> writes: > Nguyễn Thái Ngọc Duy wrote: > >> "git checkout -- <paths>" is usually used to restore all modified >> files in <paths>. In sparse checkout mode, this command is overloaded >> with another meaning: to add back all files in <paths> that are >> excluded by sparse patterns. >> >> Add "--no-widen" option to do what normal mode does: restore all >> modified files and nothing else. > > In an ideal world, I would like "git checkout --widen" to modify the > .git/info/sparse-checkout file, to be able to do: > > git clone --sparse-checkout=Documentation git://repo.or.cz/git.git > cd git > git checkout --widen -- README COPYING INSTALL > > and hack on a tree with Documentation/, README, COPYING, and INSTALL > present with no actual code to distract. And "git checkout --no-widen" > could be a way to ask to respect the existing sparse pattern. Yeah, I think the above makes tons of sense, and --widen would be an ideal name for that optional behaviour. When you are limited by your original sparse pathspecs, that would be a way to explicitly widen the paths you interact with. In that sense, making it off by default would be a sensible thing to do. When you limited yourself to a subset of dir/, you do not want "git checkout dir/" to automatically widen it by accident. > This patch isn't about tweaking the sparse-checkout pattern; instead, > it's about how "git checkout" interacts with the skip-worktree bit. > Maybe a good name would be --respect-skip-worktree? Yeah, but when would one want to say --no-respect without widening the sparce pathspecs? ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode 2013-04-01 4:48 ` Jonathan Nieder 2013-04-01 5:12 ` Junio C Hamano @ 2013-04-01 5:13 ` Duy Nguyen 2013-04-01 6:18 ` Jonathan Nieder 1 sibling, 1 reply; 17+ messages in thread From: Duy Nguyen @ 2013-04-01 5:13 UTC (permalink / raw) To: Jonathan Nieder; +Cc: Git Mailing List, Kirill Müller, Junio C Hamano On Mon, Apr 1, 2013 at 11:48 AM, Jonathan Nieder <jrnieder@gmail.com> wrote: > Hi, > > Nguyễn Thái Ngọc Duy wrote: > >> "git checkout -- <paths>" is usually used to restore all modified >> files in <paths>. In sparse checkout mode, this command is overloaded >> with another meaning: to add back all files in <paths> that are >> excluded by sparse patterns. >> >> Add "--no-widen" option to do what normal mode does: restore all >> modified files and nothing else. > > In an ideal world, I would like "git checkout --widen" to modify the > .git/info/sparse-checkout file, to be able to do: > > git clone --sparse-checkout=Documentation git://repo.or.cz/git.git > cd git > git checkout --widen -- README COPYING INSTALL > > and hack on a tree with Documentation/, README, COPYING, and INSTALL > present with no actual code to distract. And "git checkout --no-widen" > could be a way to ask to respect the existing sparse pattern. In an ideal world, I would spend more time on this and add --edit-sparse, which opens up $EDITOR, lets you edit the patterns and reapplies the patterns after $EDITOR exits (catching faults if possible). Unfortunately I don't use sparse checkout as much as before and therefore have little motivation to do it. I would really like narrow clone to replace sparse checkout, but I haven't made much progress on that front either. I'll try to get back on that once pathspec-magics topic is settled. > This patch isn't about tweaking the sparse-checkout pattern; instead, > it's about how "git checkout" interacts with the skip-worktree bit. > Maybe a good name would be --respect-skip-worktree? I'm bad at naming. If nobody objects, I'll take this as the new option name. >> --- a/Documentation/git-checkout.txt >> +++ b/Documentation/git-checkout.txt >> @@ -180,6 +180,17 @@ branch by running "git rm -rf ." from the top level of the working tree. >> Afterwards you will be ready to prepare your new files, repopulating the >> working tree, by copying them from elsewhere, extracting a tarball, etc. >> >> +--no-widen:: >> + In sparse checkout mode, `git checkout -- <paths>` would >> + update all entries matched by <paths> regardless of sparse >> + patterns. This option only updates entries matched by <paths> >> + and sparse patterns. >> + >> +--widen:: >> + Revert the effect of `--no-widen` if specified and make >> + `git checkout -- <paths>` update all entries matched by >> + <paths> regardless of sparse patterns. > > Perhaps, combining the descriptions of the positive and negative forms: > > --respect-skip-worktree:: > By default, `git checkout -- <paths>` creates or updates files > matching <paths> regardless of the skip-worktree bit. This > option makes 'git checkout' skips entries with the > skip-worktree bit set, which can be useful in sparse checkout > mode. OK > I'm afraid I can't imagine when --no-respect-skip-worktree would be > useful. That can easily be a failure of my imagination, though. There may be scripts that expect "git checkout -- foo" to reset everything in "foo". Or maybe you just want to check out a single file and do not bother to edit sparse patterns as you won't need it for long. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode 2013-04-01 5:13 ` Duy Nguyen @ 2013-04-01 6:18 ` Jonathan Nieder 0 siblings, 0 replies; 17+ messages in thread From: Jonathan Nieder @ 2013-04-01 6:18 UTC (permalink / raw) To: Duy Nguyen; +Cc: Git Mailing List, Kirill Müller, Junio C Hamano Duy Nguyen wrote: > On Mon, Apr 1, 2013 at 11:48 AM, Jonathan Nieder <jrnieder@gmail.com> wrote: >> I'm afraid I can't imagine when --no-respect-skip-worktree would be >> useful. That can easily be a failure of my imagination, though. > > There may be scripts that expect "git checkout -- foo" to reset > everything in "foo". Or maybe you just want to check out a single file > and do not bother to edit sparse patterns as you won't need it for > long. Those scripts are bringing suffering on themselves by using porcelain instead of "git checkout-index". The usual way to look at a single file from the index is "git show :git.c >git.c". So you've convinced me. I think --respect-skip-worktree can be just the normal behavior (and that there's no need for a --no-respect option). That would let me do: git clone --no-checkout git://repo.or.cz/git.git cd git echo '/Documentation/' >.git/info/sparse-checkout git config core.sparsecheckout true git checkout printf '%s\n' /README /INSTALL /COPYING >>.git/info/sparse-checkout git checkout ... hack hack hack ... # return to what the index has git checkout . without having to see any pesky actual source (*.c) files. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v3] checkout: add --ignore-skip-worktree-bits in sparse checkout mode 2013-03-30 10:02 ` [PATCH v2] checkout: add --no-widen " Nguyễn Thái Ngọc Duy 2013-04-01 4:48 ` Jonathan Nieder @ 2013-04-12 23:12 ` Nguyễn Thái Ngọc Duy 2013-05-14 9:27 ` Müller Kirill 1 sibling, 1 reply; 17+ messages in thread From: Nguyễn Thái Ngọc Duy @ 2013-04-12 23:12 UTC (permalink / raw) To: git Cc: Jonathan Nieder, Junio C Hamano, kirill.mueller, Nguyễn Thái Ngọc Duy "git checkout -- <paths>" is usually used to restore all modified files in <paths>. In sparse checkout mode, this command is overloaded with another meaning: to add back all files in <paths> that are excluded by sparse patterns. As the former makes more sense for day-to-day use. Switch it to the default and the latter enabled with --ignore-skip-worktree-bits. While at there, add info/sparse-checkout to gitrepository-layout.txt Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> --- Documentation/git-checkout.txt | 6 ++++++ Documentation/gitrepository-layout.txt | 4 ++++ builtin/checkout.c | 5 +++++ t/t1011-read-tree-sparse-checkout.sh | 24 ++++++++++++++++++++++++ t/t3001-ls-files-others-exclude.sh | 2 +- 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 8edcdca..23a9413 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -180,6 +180,12 @@ branch by running "git rm -rf ." from the top level of the working tree. Afterwards you will be ready to prepare your new files, repopulating the working tree, by copying them from elsewhere, extracting a tarball, etc. +--ignore-skip-worktree-bits:: + In sparse checkout mode, `git checkout -- <paths>` would + update only entries matched by <paths> and sparse patterns + in $GIT_DIR/info/sparse-checkout. This option ignores + the sparse patterns and adds back any files in <paths>. + -m:: --merge:: When switching branches, diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt index f0eef76..817337f 100644 --- a/Documentation/gitrepository-layout.txt +++ b/Documentation/gitrepository-layout.txt @@ -184,6 +184,10 @@ info/exclude:: 'git clean' look at it but the core Git commands do not look at it. See also: linkgit:gitignore[5]. +info/sparse-checkout:: + This file stores sparse checkout patterns. + See also: linkgit:git-read-tree[1]. + remotes:: Stores shorthands for URL and default refnames for use when interacting with remote repositories via 'git fetch', diff --git a/builtin/checkout.c b/builtin/checkout.c index f8033f4..4ed1ee7 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -35,6 +35,7 @@ struct checkout_opts { int force_detach; int writeout_stage; int overwrite_ignore; + int ignore_skipworktree; const char *new_branch; const char *new_branch_force; @@ -278,6 +279,8 @@ static int checkout_paths(const struct checkout_opts *opts, for (pos = 0; pos < active_nr; pos++) { struct cache_entry *ce = active_cache[pos]; ce->ce_flags &= ~CE_MATCHED; + if (!opts->ignore_skipworktree && ce_skip_worktree(ce)) + continue; if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) /* * "git checkout tree-ish -- path", but this entry @@ -1058,6 +1061,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) OPT_STRING(0, "conflict", &conflict_style, N_("style"), N_("conflict style (merge or diff3)")), OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks interactively")), + OPT_BOOL(0, "ignore-skip-worktree-bits", &opts.ignore_skipworktree, + N_("do not limit pathspecs to sparse entries only")), { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL, N_("second guess 'git checkout no-such-branch'"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh index 5c0053a..0c74bee 100755 --- a/t/t1011-read-tree-sparse-checkout.sh +++ b/t/t1011-read-tree-sparse-checkout.sh @@ -250,4 +250,28 @@ EOF test_cmp expected actual ' +test_expect_success 'checkout without --ignore-skip-worktree-bits' ' + echo "*" >.git/info/sparse-checkout && + git checkout -f top && + test_path_is_file init.t && + echo sub >.git/info/sparse-checkout && + git checkout && + echo modified >> sub/added && + git checkout . && + test_path_is_missing init.t && + git diff --exit-code HEAD +' + +test_expect_success 'checkout with --ignore-skip-worktree-bits' ' + echo "*" >.git/info/sparse-checkout && + git checkout -f top && + test_path_is_file init.t && + echo sub >.git/info/sparse-checkout && + git checkout && + echo modified >> sub/added && + git checkout --ignore-skip-worktree-bits . && + test_path_is_file init.t && + git diff --exit-code HEAD +' + test_done diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh index efb7ebc..2d274bf 100755 --- a/t/t3001-ls-files-others-exclude.sh +++ b/t/t3001-ls-files-others-exclude.sh @@ -103,7 +103,7 @@ test_expect_success \ test_cmp expect output' test_expect_success 'restore gitignore' ' - git checkout $allignores && + git checkout --ignore-skip-worktree-bits $allignores && rm .git/index ' -- 1.8.2.82.gc24b958 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v3] checkout: add --ignore-skip-worktree-bits in sparse checkout mode 2013-04-12 23:12 ` [PATCH v3] checkout: add --ignore-skip-worktree-bits " Nguyễn Thái Ngọc Duy @ 2013-05-14 9:27 ` Müller Kirill 2013-05-14 10:21 ` Duy Nguyen 0 siblings, 1 reply; 17+ messages in thread From: Müller Kirill @ 2013-05-14 9:27 UTC (permalink / raw) To: Nguyễn Thái Ngọc Duy Cc: git, Jonathan Nieder, Junio C Hamano Thank you, this looks nice. What needs to be done that this will eventually reach the git in my favorite distribution? Which version of Git will this be? Cheers Kirill On Sat, 2013-04-13 at 09:12 +1000, Nguyễn Thái Ngọc Duy wrote: > "git checkout -- <paths>" is usually used to restore all modified > files in <paths>. In sparse checkout mode, this command is overloaded > with another meaning: to add back all files in <paths> that are > excluded by sparse patterns. > > As the former makes more sense for day-to-day use. Switch it to the > default and the latter enabled with --ignore-skip-worktree-bits. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3] checkout: add --ignore-skip-worktree-bits in sparse checkout mode 2013-05-14 9:27 ` Müller Kirill @ 2013-05-14 10:21 ` Duy Nguyen 0 siblings, 0 replies; 17+ messages in thread From: Duy Nguyen @ 2013-05-14 10:21 UTC (permalink / raw) To: Müller Kirill; +Cc: git, Jonathan Nieder, Junio C Hamano On Tue, May 14, 2013 at 4:27 PM, Müller Kirill <kirill.mueller@ivt.baug.ethz.ch> wrote: > Thank you, this looks nice. What needs to be done that this will > eventually reach the git in my favorite distribution? Which version of > Git will this be? It'll be in the upcoming 1.8.3. -- Duy ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2013-05-14 10:22 UTC | newest] Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2013-03-22 10:28 Hard reset of a subdirectory in a sparse checkout setting Kirill Müller 2013-03-23 9:59 ` Duy Nguyen 2013-03-23 13:02 ` Kirill Müller 2013-03-24 5:06 ` [PATCH] checkout: add --sparse for restoring files in sparse checkout mode Nguyễn Thái Ngọc Duy 2013-03-24 6:12 ` Eric Sunshine 2013-03-24 18:17 ` Jonathan Nieder 2013-03-24 19:50 ` Kirill Müller 2013-03-25 1:34 ` Duy Nguyen 2013-03-25 1:57 ` Jonathan Nieder 2013-03-30 10:02 ` [PATCH v2] checkout: add --no-widen " Nguyễn Thái Ngọc Duy 2013-04-01 4:48 ` Jonathan Nieder 2013-04-01 5:12 ` Junio C Hamano 2013-04-01 5:13 ` Duy Nguyen 2013-04-01 6:18 ` Jonathan Nieder 2013-04-12 23:12 ` [PATCH v3] checkout: add --ignore-skip-worktree-bits " Nguyễn Thái Ngọc Duy 2013-05-14 9:27 ` Müller Kirill 2013-05-14 10:21 ` Duy Nguyen
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.