]> git.ipfire.org Git - thirdparty/git.git/commit
worktree: integrate with sparse-index
authorShuqi Liang <cheskaqiqi@gmail.com>
Tue, 6 Jun 2023 17:26:33 +0000 (13:26 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Jun 2023 19:13:58 +0000 (12:13 -0700)
commit8fac776f441c69af60825452a3b5d4adecd47ad9
treeae526497bf7f5f5bfffa0245a9979b62ab6137f6
parentfe86abd7511a9a6862d5706c6fa1d9b57a63ba09
worktree: integrate with sparse-index

The index is read in 'worktree.c' at two points:

1.The 'validate_no_submodules' function, which checks if there are any
submodules present in the worktree.

2.The 'check_clean_worktree' function, which verifies if a worktree is
'clean', i.e., there are no untracked or modified but uncommitted files.
This is done by running the 'git status' command, and an error message
is thrown if the worktree is not clean. Given that 'git status' is
already sparse-aware, the function is also sparse-aware.

Hence we can just set the requires-full-index to false for
"git worktree".

Add tests that verify that 'git worktree' behaves correctly when the
sparse index is enabled and test to ensure the index is not expanded.

The `p2000` tests demonstrate a ~20% execution time reduction for
'git worktree' using a sparse index:

(Note:the p2000 test results didn't reflect the huge speedup because of
the index reading time is minuscule comparing to the filesystem
operations.)

Test                                       before  after
-----------------------------------------------------------------------
2000.102: git worktree add....(full-v3)    3.15    2.82  -10.5%
2000.103: git worktree add....(full-v4)    3.14    2.84  -9.6%
2000.104: git worktree add....(sparse-v3)  2.59    2.14  -16.4%
2000.105: git worktree add....(sparse-v4)  2.10    1.57  -25.2%

Helped-by: Victoria Dye <vdye@github.com>
Signed-off-by: Shuqi Liang <cheskaqiqi@gmail.com>
Acked-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/worktree.c
t/perf/p2000-sparse-operations.sh
t/t1092-sparse-checkout-compatibility.sh