builtin/gc.c: make gc.cruftPacks
enabled by default
Back in5b92477f89
(builtin/gc.c: conditionally avoid pruning objects via loose, 2022-05-20), `git gc` learned the `--cruft` option and `gc.cruftPacks` configuration to opt-in to writing cruft packs when collecting or pruning unreachable objects. Cruft packs were introduced with the merge ina50036da1a
(Merge branch 'tb/cruft-packs', 2022-06-03). They address the problem of "loose object explosions", where Git will write out many individual loose objects when there is a large number of unreachable objects that have not yet aged past `--prune=<date>`. Instead of keeping track of those unreachable yet recent objects via their loose object file's mtime, cruft packs collect all unreachable objects into a single pack with a corresponding `*.mtimes` file that acts as a table to store the mtimes of all unreachable objects. This prevents the need to store unreachable objects as loose as they age out of the repository, and avoids the problem of loose object explosions. Beyond avoiding loose object explosions, cruft packs also act as a more efficient mechanism to store unreachable objects as they age out of a repository. This is because pairs of similar unreachable objects serve as delta bases for one another. In5b92477f89
, the feature was introduced as experimental. Since then, GitHub has been running these patches in every repository generating hundreds of millions of cruft packs along the way. The feature is battle-tested, and avoids many pathological cases such as above. Users who either run `git gc` manually, or via `git maintenance` can benefit from having cruft packs. As such, enable cruft pack generation to take place by default (by making `gc.cruftPacks` have the default of "true" rather than "false). Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
c58100ab5d
commit
e3e24de1bf
@ -14,9 +14,6 @@ feature.experimental::
|
|||||||
+
|
+
|
||||||
* `fetch.negotiationAlgorithm=skipping` may improve fetch negotiation times by
|
* `fetch.negotiationAlgorithm=skipping` may improve fetch negotiation times by
|
||||||
skipping more commits at a time, reducing the number of round trips.
|
skipping more commits at a time, reducing the number of round trips.
|
||||||
+
|
|
||||||
* `gc.cruftPacks=true` reduces disk space used by unreachable objects during
|
|
||||||
garbage collection, preventing loose object explosions.
|
|
||||||
|
|
||||||
feature.manyFiles::
|
feature.manyFiles::
|
||||||
Enable config options that optimize for repos with many files in the
|
Enable config options that optimize for repos with many files in the
|
||||||
|
@ -84,7 +84,7 @@ gc.packRefs::
|
|||||||
gc.cruftPacks::
|
gc.cruftPacks::
|
||||||
Store unreachable objects in a cruft pack (see
|
Store unreachable objects in a cruft pack (see
|
||||||
linkgit:git-repack[1]) instead of as loose objects. The default
|
linkgit:git-repack[1]) instead of as loose objects. The default
|
||||||
is `false`.
|
is `true`.
|
||||||
|
|
||||||
gc.pruneExpire::
|
gc.pruneExpire::
|
||||||
When 'git gc' is run, it will call 'prune --expire 2.weeks.ago'
|
When 'git gc' is run, it will call 'prune --expire 2.weeks.ago'
|
||||||
|
@ -54,9 +54,10 @@ other housekeeping tasks (e.g. rerere, working trees, reflog...) will
|
|||||||
be performed as well.
|
be performed as well.
|
||||||
|
|
||||||
|
|
||||||
--cruft::
|
--[no-]cruft::
|
||||||
When expiring unreachable objects, pack them separately into a
|
When expiring unreachable objects, pack them separately into a
|
||||||
cruft pack instead of storing them as loose objects.
|
cruft pack instead of storing them as loose objects. `--cruft`
|
||||||
|
is on by default.
|
||||||
|
|
||||||
--prune=<date>::
|
--prune=<date>::
|
||||||
Prune loose objects older than date (default is 2 weeks ago,
|
Prune loose objects older than date (default is 2 weeks ago,
|
||||||
|
@ -611,8 +611,8 @@ result of repeatedly resetting the objects' mtimes to the present time.
|
|||||||
|
|
||||||
If you are GC-ing repositories in a mixed version environment, consider omitting
|
If you are GC-ing repositories in a mixed version environment, consider omitting
|
||||||
the `--cruft` option when using linkgit:git-repack[1] and linkgit:git-gc[1], and
|
the `--cruft` option when using linkgit:git-repack[1] and linkgit:git-gc[1], and
|
||||||
leaving the `gc.cruftPacks` configuration unset until all writers understand
|
setting the `gc.cruftPacks` configuration to "false" until all writers
|
||||||
cruft packs.
|
understand cruft packs.
|
||||||
|
|
||||||
=== Alternatives
|
=== Alternatives
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ static const char * const builtin_gc_usage[] = {
|
|||||||
|
|
||||||
static int pack_refs = 1;
|
static int pack_refs = 1;
|
||||||
static int prune_reflogs = 1;
|
static int prune_reflogs = 1;
|
||||||
static int cruft_packs = -1;
|
static int cruft_packs = 1;
|
||||||
static int aggressive_depth = 50;
|
static int aggressive_depth = 50;
|
||||||
static int aggressive_window = 250;
|
static int aggressive_window = 250;
|
||||||
static int gc_auto_threshold = 6700;
|
static int gc_auto_threshold = 6700;
|
||||||
@ -608,10 +608,6 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
|||||||
if (prune_expire && parse_expiry_date(prune_expire, &dummy))
|
if (prune_expire && parse_expiry_date(prune_expire, &dummy))
|
||||||
die(_("failed to parse prune expiry value %s"), prune_expire);
|
die(_("failed to parse prune expiry value %s"), prune_expire);
|
||||||
|
|
||||||
prepare_repo_settings(the_repository);
|
|
||||||
if (cruft_packs < 0)
|
|
||||||
cruft_packs = the_repository->settings.gc_cruft_packs;
|
|
||||||
|
|
||||||
if (aggressive) {
|
if (aggressive) {
|
||||||
strvec_push(&repack, "-f");
|
strvec_push(&repack, "-f");
|
||||||
if (aggressive_depth > 0)
|
if (aggressive_depth > 0)
|
||||||
|
@ -216,11 +216,9 @@ assert_no_cruft_packs () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for argv in \
|
for argv in \
|
||||||
"gc --cruft" \
|
"gc" \
|
||||||
"-c gc.cruftPacks=true gc" \
|
"-c gc.cruftPacks=true gc" \
|
||||||
"-c gc.cruftPacks=false gc --cruft" \
|
"-c gc.cruftPacks=false gc --cruft"
|
||||||
"-c feature.experimental=true gc" \
|
|
||||||
"-c gc.cruftPacks=true -c feature.experimental=false gc"
|
|
||||||
do
|
do
|
||||||
test_expect_success "git $argv generates a cruft pack" '
|
test_expect_success "git $argv generates a cruft pack" '
|
||||||
test_when_finished "rm -fr repo" &&
|
test_when_finished "rm -fr repo" &&
|
||||||
@ -244,11 +242,9 @@ do
|
|||||||
done
|
done
|
||||||
|
|
||||||
for argv in \
|
for argv in \
|
||||||
"gc" \
|
"gc --no-cruft" \
|
||||||
"-c gc.cruftPacks=false gc" \
|
"-c gc.cruftPacks=false gc" \
|
||||||
"-c gc.cruftPacks=true gc --no-cruft" \
|
"-c gc.cruftPacks=true gc --no-cruft"
|
||||||
"-c feature.expiremental=true -c gc.cruftPacks=false gc" \
|
|
||||||
"-c feature.experimental=false gc"
|
|
||||||
do
|
do
|
||||||
test_expect_success "git $argv does not generate a cruft pack" '
|
test_expect_success "git $argv does not generate a cruft pack" '
|
||||||
test_when_finished "rm -fr repo" &&
|
test_when_finished "rm -fr repo" &&
|
||||||
|
Loading…
Reference in New Issue
Block a user