Skip to content

Commit 86a5a0c

Browse files
committed
repo-settings: create feature.manyFiles setting
The feature.manyFiles setting is suitable for repos with many files in the working directory. By setting index.version=4 and core.untrackedCache=true, commands such as 'git status' should improve. While adding this setting, modify the index version precedence tests to check how this setting overrides the default for index.version is unset. Signed-off-by: Derrick Stolee <[email protected]>
1 parent 49be7a7 commit 86a5a0c

File tree

5 files changed

+45
-7
lines changed

5 files changed

+45
-7
lines changed

Documentation/config/core.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ core.untrackedCache::
8686
it will automatically be removed, if set to `false`. Before
8787
setting it to `true`, you should check that mtime is working
8888
properly on your system.
89-
See linkgit:git-update-index[1]. `keep` by default.
89+
See linkgit:git-update-index[1]. `keep` by default, unless
90+
`feature.manyFiles` is enabled which sets this setting to
91+
`true` by default.
9092

9193
core.checkStat::
9294
When missing or is set to `default`, many fields in the stat

Documentation/config/feature.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,14 @@ feature.manyCommits::
1212
* `core.commitGraph=true` enables reading the commit-graph file.
1313
+
1414
* `gc.writeCommitGraph=true` enables writing the commit-graph file during
15-
garbage collection.
15+
garbage collection.
16+
17+
feature.manyFiles::
18+
Enable config options that optimize for repos with many files in the
19+
working directory. With many files, commands such as `git status` and
20+
`git checkout` may be slow and these new defaults improve performance:
21+
+
22+
* `index.version=4` enables path-prefix compression in the index.
23+
+
24+
* `core.untrackedCache=true` enables the untracked cache. This setting assumes
25+
that mtime is working on your machine.

Documentation/config/index.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ index.threads::
2424
index.version::
2525
Specify the version with which new index files should be
2626
initialized. This does not affect existing repositories.
27+
If `feature.manyFiles` is enabled, then the default is 4.

repo-settings.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ void prepare_repo_settings(struct repository *r)
4343
UPDATE_DEFAULT(r->settings.core_commit_graph, 1);
4444
UPDATE_DEFAULT(r->settings.gc_write_commit_graph, 1);
4545
}
46+
if (!repo_config_get_bool(r, "feature.manyfiles", &value) && value) {
47+
UPDATE_DEFAULT(r->settings.index_version, 4);
48+
UPDATE_DEFAULT(r->settings.core_untracked_cache, UNTRACKED_CACHE_WRITE);
49+
}
4650

4751
/* Hack for test programs like test-dump-untracked-cache */
4852
if (ignore_untracked_cache_config)

t/t1600-index.sh

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,38 @@ test_expect_success 'out of bounds index.version issues warning' '
5959
)
6060
'
6161

62-
test_expect_success 'GIT_INDEX_VERSION takes precedence over config' '
62+
test_index_version () {
63+
INDEX_VERSION_CONFIG=$1 &&
64+
FEATURE_MANY_FILES=$2 &&
65+
ENV_VAR_VERSION=$3
66+
EXPECTED_OUTPUT_VERSION=$4 &&
6367
(
6468
rm -f .git/index &&
65-
GIT_INDEX_VERSION=4 &&
66-
export GIT_INDEX_VERSION &&
67-
git config --add index.version 2 &&
69+
rm -f .git/config &&
70+
if test "$INDEX_VERSION_CONFIG" -ne 0
71+
then
72+
git config --add index.version $INDEX_VERSION_CONFIG
73+
fi &&
74+
git config --add feature.manyFiles $FEATURE_MANY_FILES
75+
if test "$ENV_VAR_VERSION" -ne 0
76+
then
77+
GIT_INDEX_VERSION=$ENV_VAR_VERSION &&
78+
export GIT_INDEX_VERSION
79+
else
80+
unset GIT_INDEX_VERSION
81+
fi &&
6882
git add a 2>&1 &&
69-
echo 4 >expect &&
83+
echo $EXPECTED_OUTPUT_VERSION >expect &&
7084
test-tool index-version <.git/index >actual &&
7185
test_cmp expect actual
7286
)
87+
}
88+
89+
test_expect_success 'index version config precedence' '
90+
test_index_version 2 false 4 4 &&
91+
test_index_version 2 true 0 2 &&
92+
test_index_version 0 true 0 4 &&
93+
test_index_version 0 true 2 2
7394
'
7495

7596
test_done

0 commit comments

Comments
 (0)