add: skip tracked paths outside sparse-checkout cone
When 'git add' adds a tracked file that is outside of the sparse-checkout cone, it checks the SKIP_WORKTREE bit to see if the file exists outside of the sparse-checkout cone. This is usually correct, except in the case of a merge conflict outside of the cone. Modify add_pathspec_matched_against_index() to be more careful about paths by checking the sparse-checkout patterns in addition to the SKIP_WORKTREE bit. This causes 'git add' to no longer allow files outside of the cone that removed the SKIP_WORKTREE bit due to a merge conflict. With only this change, users will only be able to add the file after adding the file to the sparse-checkout cone. A later change will allow users to force adding even though the file is outside of the sparse-checkout cone. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
105e8b014b
commit
49fdd51a23
@ -39,7 +39,8 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec,
|
||||
return;
|
||||
for (i = 0; i < istate->cache_nr; i++) {
|
||||
const struct cache_entry *ce = istate->cache[i];
|
||||
if (sw_action == PS_IGNORE_SKIP_WORKTREE && ce_skip_worktree(ce))
|
||||
if (sw_action == PS_IGNORE_SKIP_WORKTREE &&
|
||||
(ce_skip_worktree(ce) || !path_in_sparse_checkout(ce->name, istate)))
|
||||
continue;
|
||||
ce_path_match(istate, ce, pathspec, seen);
|
||||
}
|
||||
@ -70,7 +71,7 @@ char *find_pathspecs_matching_skip_worktree(const struct pathspec *pathspec)
|
||||
|
||||
for (i = 0; i < istate->cache_nr; i++) {
|
||||
struct cache_entry *ce = istate->cache[i];
|
||||
if (ce_skip_worktree(ce))
|
||||
if (ce_skip_worktree(ce) || !path_in_sparse_checkout(ce->name, istate))
|
||||
ce_path_match(istate, ce, pathspec, seen);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user