зеркало из https://github.com/microsoft/git.git
commit: integrate with sparse-index
Update 'git commit' to allow using the sparse-index in memory without
expanding to a full one. The only place that had an ensure_full_index()
call was in cache_tree_update(). The recursive algorithm for
update_one() was already updated in 2de37c536
(cache-tree: integrate
with sparse directory entries, 2021-03-03) to handle sparse directory
entries in the index.
Most of this change involves testing different command-line options that
allow specifying which on-disk changes should be included in the commit.
This includes no options (only take currently-staged changes), -a (take
all tracked changes), and --include (take a list of specific changes).
To simplify testing that these options do not expand the index, update
the test that previously verified that 'git status' does not expand the
index with a helper method, ensure_not_expanded().
This allows 'git commit' to operate much faster when the sparse-checkout
cone is much smaller than the full list of files at HEAD.
Here are the relevant lines from p2000-sparse-operations.sh:
Test HEAD~1 HEAD
----------------------------------------------------------------------------------
2000.14: git commit -a -m A (full-v3) 0.35(0.26+0.06) 0.36(0.28+0.07) +2.9%
2000.15: git commit -a -m A (full-v4) 0.32(0.26+0.05) 0.34(0.28+0.06) +6.3%
2000.16: git commit -a -m A (sparse-v3) 0.63(0.59+0.06) 0.04(0.05+0.05) -93.7%
2000.17: git commit -a -m A (sparse-v4) 0.64(0.59+0.08) 0.04(0.04+0.04) -93.8%
It is important to compare the full-index case to the sparse-index case,
so the improvement for index version v4 is actually an 88% improvement in
this synthetic example.
In a real repository with over two million files at HEAD and 60,000
files in the sparse-checkout definition, the time for 'git commit -a'
went from 2.61 seconds to 134ms. I compared this to the result if the
index only contained the paths in the sparse-checkout definition and
found the theoretical optimum to be 120ms, so the out-of-cone paths only
add a 12% overhead.
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
This commit is contained in:
Родитель
3e1d03c41b
Коммит
cd94f82005
|
@ -1682,6 +1682,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
|
|||
if (argc == 2 && !strcmp(argv[1], "-h"))
|
||||
usage_with_options(builtin_commit_usage, builtin_commit_options);
|
||||
|
||||
prepare_repo_settings(the_repository);
|
||||
the_repository->settings.command_requires_full_index = 0;
|
||||
|
||||
status_init_config(&s, git_commit_config);
|
||||
s.commit_template = 1;
|
||||
status_format = STATUS_FORMAT_NONE; /* Ignore status.short */
|
||||
|
|
|
@ -461,8 +461,6 @@ int cache_tree_update(struct index_state *istate, int flags)
|
|||
if (i)
|
||||
return i;
|
||||
|
||||
ensure_full_index(istate);
|
||||
|
||||
if (!istate->cache_tree)
|
||||
istate->cache_tree = cache_tree();
|
||||
|
||||
|
|
|
@ -262,6 +262,34 @@ test_expect_success 'add, commit, checkout' '
|
|||
test_all_match git checkout -
|
||||
'
|
||||
|
||||
test_expect_success 'commit including unstaged changes' '
|
||||
init_repos &&
|
||||
|
||||
write_script edit-file <<-\EOF &&
|
||||
echo $1 >$2
|
||||
EOF
|
||||
|
||||
run_on_all ../edit-file 1 a &&
|
||||
run_on_all ../edit-file 1 deep/a &&
|
||||
|
||||
test_all_match git commit -m "-a" -a &&
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
|
||||
run_on_all ../edit-file 2 a &&
|
||||
run_on_all ../edit-file 2 deep/a &&
|
||||
|
||||
test_all_match git commit -m "--include" --include deep/a &&
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
test_all_match git commit -m "--include" --include a &&
|
||||
test_all_match git status --porcelain=v2 &&
|
||||
|
||||
run_on_all ../edit-file 3 a &&
|
||||
run_on_all ../edit-file 3 deep/a &&
|
||||
|
||||
test_all_match git commit -m "--amend" -a --amend &&
|
||||
test_all_match git status --porcelain=v2
|
||||
'
|
||||
|
||||
test_expect_success 'status/add: outside sparse cone' '
|
||||
init_repos &&
|
||||
|
||||
|
@ -514,14 +542,25 @@ test_expect_success 'sparse-index is expanded and converted back' '
|
|||
test_region index ensure_full_index trace2.txt
|
||||
'
|
||||
|
||||
test_expect_success 'sparse-index is not expanded' '
|
||||
init_repos &&
|
||||
|
||||
ensure_not_expanded () {
|
||||
rm -f trace2.txt &&
|
||||
echo >>sparse-index/untracked.txt &&
|
||||
GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
|
||||
git -C sparse-index status &&
|
||||
git -C sparse-index "$@" &&
|
||||
test_region ! index ensure_full_index trace2.txt
|
||||
}
|
||||
|
||||
test_expect_success 'sparse-index is not expanded' '
|
||||
init_repos &&
|
||||
|
||||
ensure_not_expanded status &&
|
||||
ensure_not_expanded commit --allow-empty -m empty &&
|
||||
echo >>sparse-index/a &&
|
||||
ensure_not_expanded commit -a -m a &&
|
||||
echo >>sparse-index/a &&
|
||||
ensure_not_expanded commit --include a -m a &&
|
||||
echo >>sparse-index/deep/deeper1/a &&
|
||||
ensure_not_expanded commit --include deep/deeper1/a -m deeper
|
||||
'
|
||||
|
||||
# NEEDSWORK: a sparse-checkout behaves differently from a full checkout
|
||||
|
|
Загрузка…
Ссылка в новой задаче