David Turner <dturner@xxxxxxxxxxxxxxxx> writes: > Don't update files in the worktree from cache entries which are > flagged with CE_WT_REMOVE. > > When a user does a sparse checkout, git removes files that are marked > with CE_WT_REMOVE (because they are out-of-scope for the sparse > checkout). If those files are also marked CE_UPDATE (for instance, > because they differ in the branch that is being checked out and the > outgoing branch), git would previously recreate them. This patch > prevents them from being recreated. > > These erroneously-created files would also interfere with merges, > causing pre-merge revisions of out-of-scope files to appear in the > worktree. > > Signed-off-by: Anatole Shaw <git-devel@xxxxxxxxxxxx> > Signed-off-by: David Turner <dturner@xxxxxxxxxxxxxxxx> > --- That's much more readable and understandable ;-) Duy Cc'ed for final sanity check and possiible extra comments. Thanks. > t/t1090-sparse-checkout-scope.sh | 52 ++++++++++++++++++++++++++++++++++++++++ > unpack-trees.c | 2 +- > 2 files changed, 53 insertions(+), 1 deletion(-) > create mode 100755 t/t1090-sparse-checkout-scope.sh > > diff --git a/t/t1090-sparse-checkout-scope.sh b/t/t1090-sparse-checkout-scope.sh > new file mode 100755 > index 0000000..1f61eb3 > --- /dev/null > +++ b/t/t1090-sparse-checkout-scope.sh > @@ -0,0 +1,52 @@ > +#!/bin/sh > + > +test_description='sparse checkout scope tests' > + > +. ./test-lib.sh > + > +test_expect_success 'setup' ' > + echo "initial" >a && > + echo "initial" >b && > + echo "initial" >c && > + git add a b c && > + git commit -m "initial commit" > +' > + > +test_expect_success 'create feature branch' ' > + git checkout -b feature && > + echo "modified" >b && > + echo "modified" >c && > + git add b c && > + git commit -m "modification" > +' > + > +test_expect_success 'perform sparse checkout of master' ' > + git config --local --bool core.sparsecheckout true && > + echo "!/*" >.git/info/sparse-checkout && > + echo "/a" >>.git/info/sparse-checkout && > + echo "/c" >>.git/info/sparse-checkout && > + git checkout master && > + test_path_is_file a && > + test_path_is_missing b && > + test_path_is_file c > +' > + > +test_expect_success 'merge feature branch into sparse checkout of master' ' > + git merge feature && > + test_path_is_file a && > + test_path_is_missing b && > + test_path_is_file c && > + test "$(cat c)" = "modified" > +' > + > +test_expect_success 'return to full checkout of master' ' > + git checkout feature && > + echo "/*" >.git/info/sparse-checkout && > + git checkout master && > + test_path_is_file a && > + test_path_is_file b && > + test_path_is_file c && > + test "$(cat b)" = "modified" > +' > + > +test_done > diff --git a/unpack-trees.c b/unpack-trees.c > index 2927660..11a5300 100644 > --- a/unpack-trees.c > +++ b/unpack-trees.c > @@ -223,7 +223,7 @@ static int check_updates(struct unpack_trees_options *o) > for (i = 0; i < index->cache_nr; i++) { > struct cache_entry *ce = index->cache[i]; > > - if (ce->ce_flags & CE_UPDATE) { > + if (ce->ce_flags & CE_UPDATE && !(ce->ce_flags & CE_WT_REMOVE)) { > display_progress(progress, ++cnt); > ce->ce_flags &= ~CE_UPDATE; > if (o->update && !o->dry_run) { -- 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