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 <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									ad0fb65999
								
							
						
					
					
						commit
						c6cc4c5afd
					
				|  | @ -345,6 +345,8 @@ include::config/difftool.txt[] | ||||||
|  |  | ||||||
| include::config/fastimport.txt[] | include::config/fastimport.txt[] | ||||||
|  |  | ||||||
|  | include::config/feature.txt[] | ||||||
|  |  | ||||||
| include::config/fetch.txt[] | include::config/fetch.txt[] | ||||||
|  |  | ||||||
| include::config/format.txt[] | include::config/format.txt[] | ||||||
|  |  | ||||||
|  | @ -86,7 +86,9 @@ core.untrackedCache:: | ||||||
| 	it will automatically be removed, if set to `false`. Before | 	it will automatically be removed, if set to `false`. Before | ||||||
| 	setting it to `true`, you should check that mtime is working | 	setting it to `true`, you should check that mtime is working | ||||||
| 	properly on your system. | 	properly on your system. | ||||||
| 	See linkgit:git-update-index[1]. `keep` by default. | 	See linkgit:git-update-index[1]. `keep` by default, unless | ||||||
|  | 	`feature.manyFiles` is enabled which sets this setting to | ||||||
|  | 	`true` by default. | ||||||
|  |  | ||||||
| core.checkStat:: | core.checkStat:: | ||||||
| 	When missing or is set to `default`, many fields in the stat | 	When missing or is set to `default`, many fields in the stat | ||||||
|  |  | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | feature.*:: | ||||||
|  | 	The config settings that start with `feature.` modify the defaults of | ||||||
|  | 	a group of other config settings. These groups are created by the Git | ||||||
|  | 	developer community as recommended defaults and are subject to change. | ||||||
|  | 	In particular, new config options may be added with different defaults. | ||||||
|  |  | ||||||
|  | feature.manyFiles:: | ||||||
|  | 	Enable config options that optimize for repos with many files in the | ||||||
|  | 	working directory. With many files, commands such as `git status` and | ||||||
|  | 	`git checkout` may be slow and these new defaults improve performance: | ||||||
|  | + | ||||||
|  | * `index.version=4` enables path-prefix compression in the index. | ||||||
|  | + | ||||||
|  | * `core.untrackedCache=true` enables the untracked cache. This setting assumes | ||||||
|  | that mtime is working on your machine. | ||||||
|  | @ -24,3 +24,4 @@ index.threads:: | ||||||
| index.version:: | index.version:: | ||||||
| 	Specify the version with which new index files should be | 	Specify the version with which new index files should be | ||||||
| 	initialized.  This does not affect existing repositories. | 	initialized.  This does not affect existing repositories. | ||||||
|  | 	If `feature.manyFiles` is enabled, then the default is 4. | ||||||
|  |  | ||||||
|  | @ -36,9 +36,12 @@ void prepare_repo_settings(struct repository *r) | ||||||
| 		free(strval); | 		free(strval); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if (!repo_config_get_bool(r, "pack.usesparse", &value)) | 	if (!repo_config_get_bool(r, "pack.usesparse", &value)) | ||||||
| 		r->settings.pack_use_sparse = value; | 		r->settings.pack_use_sparse = value; | ||||||
|  | 	if (!repo_config_get_bool(r, "feature.manyfiles", &value) && value) { | ||||||
|  | 		UPDATE_DEFAULT_BOOL(r->settings.index_version, 4); | ||||||
|  | 		UPDATE_DEFAULT_BOOL(r->settings.core_untracked_cache, UNTRACKED_CACHE_WRITE); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/* Hack for test programs like test-dump-untracked-cache */ | 	/* Hack for test programs like test-dump-untracked-cache */ | ||||||
| 	if (ignore_untracked_cache_config) | 	if (ignore_untracked_cache_config) | ||||||
|  |  | ||||||
|  | @ -59,17 +59,38 @@ test_expect_success 'out of bounds index.version issues warning' ' | ||||||
| 	) | 	) | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_expect_success 'GIT_INDEX_VERSION takes precedence over config' ' | test_index_version () { | ||||||
|  | 	INDEX_VERSION_CONFIG=$1 && | ||||||
|  | 	FEATURE_MANY_FILES=$2 && | ||||||
|  | 	ENV_VAR_VERSION=$3 | ||||||
|  | 	EXPECTED_OUTPUT_VERSION=$4 && | ||||||
| 	( | 	( | ||||||
| 		rm -f .git/index && | 		rm -f .git/index && | ||||||
| 		GIT_INDEX_VERSION=4 && | 		rm -f .git/config && | ||||||
| 		export GIT_INDEX_VERSION && | 		if test "$INDEX_VERSION_CONFIG" -ne 0 | ||||||
| 		git config --add index.version 2 && | 		then | ||||||
|  | 			git config --add index.version $INDEX_VERSION_CONFIG | ||||||
|  | 		fi && | ||||||
|  | 		git config --add feature.manyFiles $FEATURE_MANY_FILES | ||||||
|  | 		if test "$ENV_VAR_VERSION" -ne 0 | ||||||
|  | 		then | ||||||
|  | 			GIT_INDEX_VERSION=$ENV_VAR_VERSION && | ||||||
|  | 			export GIT_INDEX_VERSION | ||||||
|  | 		else | ||||||
|  | 			unset GIT_INDEX_VERSION | ||||||
|  | 		fi && | ||||||
| 		git add a 2>&1 && | 		git add a 2>&1 && | ||||||
| 		echo 4 >expect && | 		echo $EXPECTED_OUTPUT_VERSION >expect && | ||||||
| 		test-tool index-version <.git/index >actual && | 		test-tool index-version <.git/index >actual && | ||||||
| 		test_cmp expect actual | 		test_cmp expect actual | ||||||
| 	) | 	) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | test_expect_success 'index version config precedence' ' | ||||||
|  | 	test_index_version 2 false 4 4 && | ||||||
|  | 	test_index_version 2 true 0 2 && | ||||||
|  | 	test_index_version 0 true 0 4 && | ||||||
|  | 	test_index_version 0 true 2 2 | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Derrick Stolee
						Derrick Stolee