]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t1092: test 'git restore' with sparse index
authorDerrick Stolee <stolee@gmail.com>
Tue, 26 May 2026 20:26:33 +0000 (20:26 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 27 May 2026 04:42:59 +0000 (13:42 +0900)
A user reported that 'git restore --staged .' causes the sparse index to
expand. This is somewhat natural because the '.' pathspec means 'check
every path'. However, the restore will not update paths marked with the
SKIP_WORKTREE bit, so we shouldn't need to process such entries.

For now, establish the current behavior, including the sparse index
expansion, in the t1092 test case as a baseline.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t1092-sparse-checkout-compatibility.sh

index d98cb4ac113c67a503438dd1911394e178061262..d69434e7ab6ce0ae34ff15df08291170af0206d7 100755 (executable)
@@ -2573,4 +2573,54 @@ test_expect_success 'sparse-index is not expanded: merge-ours' '
        ensure_not_expanded merge -s ours merge-right
 '
 
+test_expect_success 'restore --staged with sparse definition' '
+       init_repos &&
+
+       # Stage changes within the sparse definition
+       test_all_match git checkout -b restore-staged-1 base &&
+       test_all_match git reset --soft update-deep &&
+       test_all_match git restore --staged . &&
+       test_all_match git status --porcelain=v2 &&
+       test_all_match git diff --cached
+'
+
+test_expect_success 'restore --staged with outside sparse definition' '
+       init_repos &&
+
+       # Stage changes that include paths outside the sparse definition.
+       # Although the working tree differs between full and sparse checkouts
+       # after restore, the state of the index should be the same.
+       test_all_match git checkout -b restore-staged-2 base &&
+       test_all_match git reset --soft update-folder1 &&
+       test_sparse_match git restore --staged . &&
+       git -C full-checkout restore --staged . &&
+       test_all_match git ls-files -s -- folder1 &&
+       test_all_match git diff --cached -- folder1
+'
+
+test_expect_success 'restore --staged with wildcards' '
+       init_repos &&
+
+       test_all_match git checkout -b restore-staged-3 base &&
+       test_all_match git reset --soft update-deep &&
+       test_all_match git restore --staged "deep/*" &&
+       test_all_match git status --porcelain=v2 &&
+       test_all_match git diff --cached
+'
+
+test_expect_success 'sparse-index is expanded: restore --staged' '
+       init_repos &&
+
+       git -C sparse-index checkout -b restore-staged-exp base &&
+       git -C sparse-index reset --soft update-folder1 &&
+       ensure_expanded restore --staged .
+'
+
+test_expect_success 'sparse-index is expanded: restore --source --staged' '
+       init_repos &&
+
+       git -C sparse-index checkout -b restore-source-staged base &&
+       ensure_expanded restore --source update-folder1 --staged .
+'
+
 test_done