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
@ -546,10 +546,9 @@ test_expect_failure 'merge with conflict outside cone' '
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
|
||||
# 2. Add the file with conflict markers
|
||||
# NEEDSWORK: Even though the merge conflict removed the
|
||||
# SKIP_WORKTREE bit from the index entry for folder1/a, we should
|
||||
# warn that this is a problematic add.
|
||||
test_all_match git add folder1/a &&
|
||||
test_sparse_match test_must_fail git add folder1/a &&
|
||||
grep "Disable or modify the sparsity rules" sparse-checkout-err &&
|
||||
test_sparse_unstaged folder1/a &&
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
|
||||
# 3. Rename the file to another sparse filename and
|
||||
@ -558,7 +557,9 @@ test_expect_failure 'merge with conflict outside cone' '
|
||||
# NEEDSWORK: This mode now fails, because folder2/z is
|
||||
# outside of the sparse-checkout cone and does not match an
|
||||
# existing index entry with the SKIP_WORKTREE bit cleared.
|
||||
test_all_match git add folder2 &&
|
||||
test_sparse_match test_must_fail git add folder2 &&
|
||||
grep "Disable or modify the sparsity rules" sparse-checkout-err &&
|
||||
test_sparse_unstaged folder2/z &&
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
|
||||
test_all_match git merge --continue &&
|
||||
@ -586,7 +587,9 @@ test_expect_failure 'cherry-pick/rebase with conflict outside cone' '
|
||||
# NEEDSWORK: Even though the merge conflict removed the
|
||||
# SKIP_WORKTREE bit from the index entry for folder1/a, we should
|
||||
# warn that this is a problematic add.
|
||||
test_all_match git add folder1/a &&
|
||||
test_sparse_match test_must_fail git add folder1/a &&
|
||||
grep "Disable or modify the sparsity rules" sparse-checkout-err &&
|
||||
test_sparse_unstaged folder1/a &&
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
|
||||
# 3. Rename the file to another sparse filename and
|
||||
@ -595,7 +598,9 @@ test_expect_failure 'cherry-pick/rebase with conflict outside cone' '
|
||||
# outside of the sparse-checkout cone and does not match an
|
||||
# existing index entry with the SKIP_WORKTREE bit cleared.
|
||||
run_on_all mv folder2/a folder2/z &&
|
||||
test_all_match git add folder2 &&
|
||||
test_sparse_match test_must_fail git add folder2 &&
|
||||
grep "Disable or modify the sparsity rules" sparse-checkout-err &&
|
||||
test_sparse_unstaged folder2/z &&
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
|
||||
test_all_match git $OPERATION --continue &&
|
||||
|
Reference in New Issue
Block a user