]> git.ipfire.org Git - thirdparty/git.git/commitdiff
features: feature.manyFiles implies fast index writes
authorDerrick Stolee <derrickstolee@github.com>
Fri, 6 Jan 2023 16:31:56 +0000 (16:31 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Jan 2023 22:46:14 +0000 (07:46 +0900)
The recent addition of the index.skipHash config option allows index
writes to speed up by skipping the hash computation for the trailing
checksum. This is particularly critical for repositories with many files
at HEAD, so add this config option to two cases where users in that
scenario may opt-in to such behavior:

 1. The feature.manyFiles config option enables some options that are
    helpful for repositories with many files at HEAD.

 2. 'scalar register' and 'scalar reconfigure' set config options that
    optimize for large repositories.

In both of these cases, set index.skipHash=true to gain this
speedup. Add tests that demonstrate the proper way that
index.skipHash=true can override feature.manyFiles=true.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/feature.txt
read-cache.c
repo-settings.c
repository.h
scalar.c
t/t1600-index.sh

index 95975e50912c6f423820a5440d6696ac5326dc51..e52bc6b858470c60f09f52d4f9d2b9f17135483c 100644 (file)
@@ -23,6 +23,11 @@ feature.manyFiles::
        working directory. With many files, commands such as `git status` and
        `git checkout` may be slow and these new defaults improve performance:
 +
+* `index.skipHash=true` speeds up index writes by not computing a trailing
+  checksum. Note that this will cause Git versions earlier than 2.13.0 to
+  refuse to parse the index and Git versions earlier than 2.40.0 will report
+  a corrupted index during `git fsck`.
++
 * `index.version=4` enables path-prefix compression in the index.
 +
 * `core.untrackedCache=true` enables the untracked cache. This setting assumes
index d73a81e41ae6e8dca3bd752bd11b4bf6a108e634..feefa0f68ba74b7ffddd2ed6cf93c7991803728f 100644 (file)
@@ -2927,7 +2927,8 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
 
        f = hashfd(tempfile->fd, tempfile->filename.buf);
 
-       repo_config_get_bool(r, "index.skiphash", &f->skip_hash);
+       prepare_repo_settings(r);
+       f->skip_hash = r->settings.index_skip_hash;
 
        for (i = removed = extended = 0; i < entries; i++) {
                if (cache[i]->ce_flags & CE_REMOVE)
index 3021921c53d22a29ff4a677fc0f569f4818e8244..3dbd3f0e2ec33df0753780f4d84605b16ebdc2b3 100644 (file)
@@ -47,6 +47,7 @@ void prepare_repo_settings(struct repository *r)
        }
        if (manyfiles) {
                r->settings.index_version = 4;
+               r->settings.index_skip_hash = 1;
                r->settings.core_untracked_cache = UNTRACKED_CACHE_WRITE;
        }
 
@@ -61,6 +62,7 @@ void prepare_repo_settings(struct repository *r)
        repo_cfg_bool(r, "pack.usesparse", &r->settings.pack_use_sparse, 1);
        repo_cfg_bool(r, "core.multipackindex", &r->settings.core_multi_pack_index, 1);
        repo_cfg_bool(r, "index.sparse", &r->settings.sparse_index, 0);
+       repo_cfg_bool(r, "index.skiphash", &r->settings.index_skip_hash, r->settings.index_skip_hash);
 
        /*
         * The GIT_TEST_MULTI_PACK_INDEX variable is special in that
index 6c461c5b9def017947c90bd84140ae48556e252a..e8c67ffe16542425b3660b88f2dcf339a473369e 100644 (file)
@@ -42,6 +42,7 @@ struct repo_settings {
        struct fsmonitor_settings *fsmonitor; /* lazily loaded */
 
        int index_version;
+       int index_skip_hash;
        enum untracked_cache_setting core_untracked_cache;
 
        int pack_use_sparse;
index 6c52243cdf1f68bb3716891bfabbdf85fe26fcd4..b49bb8c24ec74d4eabdfca504275291f5d4bfa32 100644 (file)
--- a/scalar.c
+++ b/scalar.c
@@ -143,6 +143,7 @@ static int set_recommended_config(int reconfigure)
                { "credential.validate", "false", 1 }, /* GCM4W-only */
                { "gc.auto", "0", 1 },
                { "gui.GCWarning", "false", 1 },
+               { "index.skipHash", "false", 1 },
                { "index.threads", "true", 1 },
                { "index.version", "4", 1 },
                { "merge.stat", "false", 1 },
index 2f792bb8ffa491759f83979df4d68086fc710235..0ebbae130589b9ad748b85041def88588788d770 100755 (executable)
@@ -73,6 +73,17 @@ test_expect_success 'index.skipHash config option' '
        test_cmp expect hash &&
        git fsck &&
 
+       rm -f .git/index &&
+       git -c feature.manyFiles=true add a &&
+       test_trailing_hash .git/index >hash &&
+       cmp expect hash &&
+
+       rm -f .git/index &&
+       git -c feature.manyFiles=true \
+           -c index.skipHash=false add a &&
+       test_trailing_hash .git/index >hash &&
+       ! cmp expect hash &&
+
        test_commit start &&
        git -c protocol.file.allow=always submodule add ./ sub &&
        git config index.skipHash false &&