On Fri, Jul 17, 2015 at 05:19:27PM -0400, David Turner wrote: > 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. Thank you both for catching this. Just a small suggestion. Perhaps we should do this instead. apply_sparse_checkout() is the function where all "action" manipulation (add, delete, update files..) for sparse checkout occurs and it should not ask to delete and update both at the same time. -- 8< -- diff --git a/unpack-trees.c b/unpack-trees.c index 2927660..d6cf849 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -224,6 +224,9 @@ static int check_updates(struct unpack_trees_options *o) struct cache_entry *ce = index->cache[i]; if (ce->ce_flags & CE_UPDATE) { + if (ce->ce_flags & CE_WT_REMOVE) + die("BUG: both update and delete flags are set on %s", + ce->name); display_progress(progress, ++cnt); ce->ce_flags &= ~CE_UPDATE; if (o->update && !o->dry_run) { @@ -293,6 +296,7 @@ static int apply_sparse_checkout(struct index_state *istate, if (!(ce->ce_flags & CE_UPDATE) && verify_uptodate_sparse(ce, o)) return -1; ce->ce_flags |= CE_WT_REMOVE; + ce->ce_flags &= ~CE_UPDATE; } if (was_skip_worktree && !ce_skip_worktree(ce)) { if (verify_absent_sparse(ce, ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN, o)) -- 8< -- -- Duy -- 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