]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: set pack.useSparse=true by default
authorDerrick Stolee <dstolee@microsoft.com>
Fri, 20 Mar 2020 12:38:09 +0000 (12:38 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Mar 2020 21:22:31 +0000 (14:22 -0700)
The pack.useSparse config option was introduced by 3d036eb0
(pack-objects: create pack.useSparse setting, 2019-01-19) and was
first available in v2.21.0. When enabled, the pack-objects process
during 'git push' will use a sparse tree walk when deciding which
trees and blobs to send to the remote. The algorithm was introduced
by d5d2e93 (revision: implement sparse algorithm, 2019-01-16) and
has been in production use by VFS for Git since around that time.
The features.experimental config option also enabled pack.useSparse,
so hopefully that has also increased exposure.

It is worth noting that pack.useSparse has a possibility of
sending more objects across a push, but requires a special
arrangement of exact _copies_ across directories. There is a test
in t5322-pack-objects-sparse.sh that demonstrates this possibility.
This test uses the --sparse option to "git pack-objects" but we
can make it implied by the config value to demonstrate that the
default value has changed.

While updating that test, I noticed that the documentation did not
include an option for --no-sparse, which is now more important than
it was before.

Since the downside is unlikely but the upside is significant, set
the default value of pack.useSparse to true. Remove it from the
set of options implied by features.experimental.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/feature.txt
Documentation/config/pack.txt
Documentation/git-pack-objects.txt
repo-settings.c
t/t5322-pack-objects-sparse.sh

index 875f8c8a66f36464314d47decf433a82121a395b..4e3a5c0cebc90d1222de23d89db10d6eebfcc4d4 100644 (file)
@@ -12,9 +12,6 @@ feature.experimental::
        setting if you are interested in providing feedback on experimental
        features. The new default values are:
 +
-* `pack.useSparse=true` uses a new algorithm when constructing a pack-file
-which can improve `git push` performance in repos with many files.
-+
 * `fetch.negotiationAlgorithm=skipping` may improve fetch negotiation times by
 skipping more commits at a time, reducing the number of round trips.
 +
index 0dac5805816ff6e9c133097be5cd9ae14e67da41..837f1b16792fe2200afe011cc1dc0868b6590fe6 100644 (file)
@@ -119,8 +119,8 @@ pack.useSparse::
        objects. This can have significant performance benefits when
        computing a pack to send a small change. However, it is possible
        that extra objects are added to the pack-file if the included
-       commits contain certain types of direct renames. Default is `false`
-       unless `feature.experimental` is enabled.
+       commits contain certain types of direct renames. Default is
+       `true`.
 
 pack.writeBitmaps (deprecated)::
        This is a deprecated synonym for `repack.writeBitmaps`.
index fecdf2600cc9e2c5fe7535231deaab79fc0a7278..eaa2f2a4041f2eed78aea08131b1120fb195aaf7 100644 (file)
@@ -14,7 +14,7 @@ SYNOPSIS
        [--local] [--incremental] [--window=<n>] [--depth=<n>]
        [--revs [--unpacked | --all]] [--keep-pack=<pack-name>]
        [--stdout [--filter=<filter-spec>] | base-name]
-       [--shallow] [--keep-true-parents] [--sparse] < object-list
+       [--shallow] [--keep-true-parents] [--[no-]sparse] < object-list
 
 
 DESCRIPTION
@@ -196,14 +196,16 @@ depth is 4095.
        Add --no-reuse-object if you want to force a uniform compression
        level on all data no matter the source.
 
---sparse::
-       Use the "sparse" algorithm to determine which objects to include in
+--[no-]sparse::
+       Toggle the "sparse" algorithm to determine which objects to include in
        the pack, when combined with the "--revs" option. This algorithm
        only walks trees that appear in paths that introduce new objects.
        This can have significant performance benefits when computing
        a pack to send a small change. However, it is possible that extra
        objects are added to the pack-file if the included commits contain
-       certain types of direct renames.
+       certain types of direct renames. If this option is not included,
+       it defaults to the value of `pack.useSparse`, which is true unless
+       otherwise specified.
 
 --thin::
        Create a "thin" pack by omitting the common objects between a
index a703e407a3f0a9c55c9a18ad1db6bf345f1165dd..dc6817daa9537c3877dae686368ef58708ac0512 100644 (file)
@@ -45,6 +45,8 @@ void prepare_repo_settings(struct repository *r)
 
        if (!repo_config_get_bool(r, "pack.usesparse", &value))
                r->settings.pack_use_sparse = value;
+       UPDATE_DEFAULT_BOOL(r->settings.pack_use_sparse, 1);
+
        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);
@@ -52,7 +54,6 @@ void prepare_repo_settings(struct repository *r)
        if (!repo_config_get_bool(r, "fetch.writecommitgraph", &value))
                r->settings.fetch_write_commit_graph = value;
        if (!repo_config_get_bool(r, "feature.experimental", &value) && value) {
-               UPDATE_DEFAULT_BOOL(r->settings.pack_use_sparse, 1);
                UPDATE_DEFAULT_BOOL(r->settings.fetch_negotiation_algorithm, FETCH_NEGOTIATION_SKIPPING);
                UPDATE_DEFAULT_BOOL(r->settings.fetch_write_commit_graph, 1);
        }
index 7124b5581a0e3e31ae9b78b46aec9f059eeb7c1a..6e5d6bdb0a738743c19d0c7a8de2656740f054fb 100755 (executable)
@@ -105,6 +105,7 @@ test_expect_success 'non-sparse pack-objects' '
        test_cmp required_objects.txt nonsparse_required_objects.txt
 '
 
+# --sparse is enabled by default by pack.useSparse
 test_expect_success 'sparse pack-objects' '
        git rev-parse                   \
                topic1                  \
@@ -112,7 +113,7 @@ test_expect_success 'sparse pack-objects' '
                topic1:f3               \
                topic1:f3/f4            \
                topic1:f3/f4/data.txt | sort >expect_sparse_objects.txt &&
-       git pack-objects --stdout --revs --sparse <packinput.txt >sparse.pack &&
+       git pack-objects --stdout --revs <packinput.txt >sparse.pack &&
        git index-pack -o sparse.idx sparse.pack &&
        git show-index <sparse.idx | awk "{print \$2}" >sparse_objects.txt &&
        test_cmp expect_sparse_objects.txt sparse_objects.txt