Merge branch 'ds/maintenance-pack-refs'
"git maintenance" tool learned a new "pack-refs" maintenance task. * ds/maintenance-pack-refs: maintenance: incremental strategy runs pack-refs weekly maintenance: add pack-refs task
This commit is contained in:
commit
d494433d26
@ -15,8 +15,9 @@ maintenance.strategy::
|
|||||||
* `none`: This default setting implies no task are run at any schedule.
|
* `none`: This default setting implies no task are run at any schedule.
|
||||||
* `incremental`: This setting optimizes for performing small maintenance
|
* `incremental`: This setting optimizes for performing small maintenance
|
||||||
activities that do not delete any data. This does not schedule the `gc`
|
activities that do not delete any data. This does not schedule the `gc`
|
||||||
task, but runs the `prefetch` and `commit-graph` tasks hourly and the
|
task, but runs the `prefetch` and `commit-graph` tasks hourly, the
|
||||||
`loose-objects` and `incremental-repack` tasks daily.
|
`loose-objects` and `incremental-repack` tasks daily, and the `pack-refs`
|
||||||
|
task weekly.
|
||||||
|
|
||||||
maintenance.<task>.enabled::
|
maintenance.<task>.enabled::
|
||||||
This boolean config option controls whether the maintenance task
|
This boolean config option controls whether the maintenance task
|
||||||
|
@ -145,6 +145,12 @@ incremental-repack::
|
|||||||
which is a special case that attempts to repack all pack-files
|
which is a special case that attempts to repack all pack-files
|
||||||
into a single pack-file.
|
into a single pack-file.
|
||||||
|
|
||||||
|
pack-refs::
|
||||||
|
The `pack-refs` task collects the loose reference files and
|
||||||
|
collects them into a single file. This speeds up operations that
|
||||||
|
need to iterate across many references. See linkgit:git-pack-refs[1]
|
||||||
|
for more information.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
-------
|
-------
|
||||||
--auto::
|
--auto::
|
||||||
|
23
builtin/gc.c
23
builtin/gc.c
@ -54,7 +54,6 @@ static const char *prune_worktrees_expire = "3.months.ago";
|
|||||||
static unsigned long big_pack_threshold;
|
static unsigned long big_pack_threshold;
|
||||||
static unsigned long max_delta_cache_size = DEFAULT_DELTA_CACHE_SIZE;
|
static unsigned long max_delta_cache_size = DEFAULT_DELTA_CACHE_SIZE;
|
||||||
|
|
||||||
static struct strvec pack_refs_cmd = STRVEC_INIT;
|
|
||||||
static struct strvec reflog = STRVEC_INIT;
|
static struct strvec reflog = STRVEC_INIT;
|
||||||
static struct strvec repack = STRVEC_INIT;
|
static struct strvec repack = STRVEC_INIT;
|
||||||
static struct strvec prune = STRVEC_INIT;
|
static struct strvec prune = STRVEC_INIT;
|
||||||
@ -163,6 +162,15 @@ static void gc_config(void)
|
|||||||
git_config(git_default_config, NULL);
|
git_config(git_default_config, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct maintenance_run_opts;
|
||||||
|
static int maintenance_task_pack_refs(MAYBE_UNUSED struct maintenance_run_opts *opts)
|
||||||
|
{
|
||||||
|
struct strvec pack_refs_cmd = STRVEC_INIT;
|
||||||
|
strvec_pushl(&pack_refs_cmd, "pack-refs", "--all", "--prune", NULL);
|
||||||
|
|
||||||
|
return run_command_v_opt(pack_refs_cmd.v, RUN_GIT_CMD);
|
||||||
|
}
|
||||||
|
|
||||||
static int too_many_loose_objects(void)
|
static int too_many_loose_objects(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -518,8 +526,8 @@ static void gc_before_repack(void)
|
|||||||
if (done++)
|
if (done++)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pack_refs && run_command_v_opt(pack_refs_cmd.v, RUN_GIT_CMD))
|
if (pack_refs && maintenance_task_pack_refs(NULL))
|
||||||
die(FAILED_RUN, pack_refs_cmd.v[0]);
|
die(FAILED_RUN, "pack-refs");
|
||||||
|
|
||||||
if (prune_reflogs && run_command_v_opt(reflog.v, RUN_GIT_CMD))
|
if (prune_reflogs && run_command_v_opt(reflog.v, RUN_GIT_CMD))
|
||||||
die(FAILED_RUN, reflog.v[0]);
|
die(FAILED_RUN, reflog.v[0]);
|
||||||
@ -556,7 +564,6 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
|||||||
if (argc == 2 && !strcmp(argv[1], "-h"))
|
if (argc == 2 && !strcmp(argv[1], "-h"))
|
||||||
usage_with_options(builtin_gc_usage, builtin_gc_options);
|
usage_with_options(builtin_gc_usage, builtin_gc_options);
|
||||||
|
|
||||||
strvec_pushl(&pack_refs_cmd, "pack-refs", "--all", "--prune", NULL);
|
|
||||||
strvec_pushl(&reflog, "reflog", "expire", "--all", NULL);
|
strvec_pushl(&reflog, "reflog", "expire", "--all", NULL);
|
||||||
strvec_pushl(&repack, "repack", "-d", "-l", NULL);
|
strvec_pushl(&repack, "repack", "-d", "-l", NULL);
|
||||||
strvec_pushl(&prune, "prune", "--expire", NULL);
|
strvec_pushl(&prune, "prune", "--expire", NULL);
|
||||||
@ -1224,6 +1231,7 @@ enum maintenance_task_label {
|
|||||||
TASK_INCREMENTAL_REPACK,
|
TASK_INCREMENTAL_REPACK,
|
||||||
TASK_GC,
|
TASK_GC,
|
||||||
TASK_COMMIT_GRAPH,
|
TASK_COMMIT_GRAPH,
|
||||||
|
TASK_PACK_REFS,
|
||||||
|
|
||||||
/* Leave as final value */
|
/* Leave as final value */
|
||||||
TASK__COUNT
|
TASK__COUNT
|
||||||
@ -1255,6 +1263,11 @@ static struct maintenance_task tasks[] = {
|
|||||||
maintenance_task_commit_graph,
|
maintenance_task_commit_graph,
|
||||||
should_write_commit_graph,
|
should_write_commit_graph,
|
||||||
},
|
},
|
||||||
|
[TASK_PACK_REFS] = {
|
||||||
|
"pack-refs",
|
||||||
|
maintenance_task_pack_refs,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int compare_tasks_by_selection(const void *a_, const void *b_)
|
static int compare_tasks_by_selection(const void *a_, const void *b_)
|
||||||
@ -1339,6 +1352,8 @@ static void initialize_maintenance_strategy(void)
|
|||||||
tasks[TASK_INCREMENTAL_REPACK].schedule = SCHEDULE_DAILY;
|
tasks[TASK_INCREMENTAL_REPACK].schedule = SCHEDULE_DAILY;
|
||||||
tasks[TASK_LOOSE_OBJECTS].enabled = 1;
|
tasks[TASK_LOOSE_OBJECTS].enabled = 1;
|
||||||
tasks[TASK_LOOSE_OBJECTS].schedule = SCHEDULE_DAILY;
|
tasks[TASK_LOOSE_OBJECTS].schedule = SCHEDULE_DAILY;
|
||||||
|
tasks[TASK_PACK_REFS].enabled = 1;
|
||||||
|
tasks[TASK_PACK_REFS].schedule = SCHEDULE_WEEKLY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,6 +343,18 @@ test_expect_success 'maintenance.incremental-repack.auto' '
|
|||||||
test_subcommand git multi-pack-index write --no-progress <trace-B
|
test_subcommand git multi-pack-index write --no-progress <trace-B
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'pack-refs task' '
|
||||||
|
for n in $(test_seq 1 5)
|
||||||
|
do
|
||||||
|
git branch -f to-pack/$n HEAD || return 1
|
||||||
|
done &&
|
||||||
|
GIT_TRACE2_EVENT="$(pwd)/pack-refs.txt" \
|
||||||
|
git maintenance run --task=pack-refs &&
|
||||||
|
ls .git/refs/heads/ >after &&
|
||||||
|
test_must_be_empty after &&
|
||||||
|
test_subcommand git pack-refs --all --prune <pack-refs.txt
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success '--auto and --schedule incompatible' '
|
test_expect_success '--auto and --schedule incompatible' '
|
||||||
test_must_fail git maintenance run --auto --schedule=daily 2>err &&
|
test_must_fail git maintenance run --auto --schedule=daily 2>err &&
|
||||||
test_i18ngrep "at most one" err
|
test_i18ngrep "at most one" err
|
||||||
@ -396,18 +408,32 @@ test_expect_success 'maintenance.strategy inheritance' '
|
|||||||
git maintenance run --schedule=hourly --quiet &&
|
git maintenance run --schedule=hourly --quiet &&
|
||||||
GIT_TRACE2_EVENT="$(pwd)/incremental-daily.txt" \
|
GIT_TRACE2_EVENT="$(pwd)/incremental-daily.txt" \
|
||||||
git maintenance run --schedule=daily --quiet &&
|
git maintenance run --schedule=daily --quiet &&
|
||||||
|
GIT_TRACE2_EVENT="$(pwd)/incremental-weekly.txt" \
|
||||||
|
git maintenance run --schedule=weekly --quiet &&
|
||||||
|
|
||||||
test_subcommand git commit-graph write --split --reachable \
|
test_subcommand git commit-graph write --split --reachable \
|
||||||
--no-progress <incremental-hourly.txt &&
|
--no-progress <incremental-hourly.txt &&
|
||||||
test_subcommand ! git prune-packed --quiet <incremental-hourly.txt &&
|
test_subcommand ! git prune-packed --quiet <incremental-hourly.txt &&
|
||||||
test_subcommand ! git multi-pack-index write --no-progress \
|
test_subcommand ! git multi-pack-index write --no-progress \
|
||||||
<incremental-hourly.txt &&
|
<incremental-hourly.txt &&
|
||||||
|
test_subcommand ! git pack-refs --all --prune \
|
||||||
|
<incremental-hourly.txt &&
|
||||||
|
|
||||||
test_subcommand git commit-graph write --split --reachable \
|
test_subcommand git commit-graph write --split --reachable \
|
||||||
--no-progress <incremental-daily.txt &&
|
--no-progress <incremental-daily.txt &&
|
||||||
test_subcommand git prune-packed --quiet <incremental-daily.txt &&
|
test_subcommand git prune-packed --quiet <incremental-daily.txt &&
|
||||||
test_subcommand git multi-pack-index write --no-progress \
|
test_subcommand git multi-pack-index write --no-progress \
|
||||||
<incremental-daily.txt &&
|
<incremental-daily.txt &&
|
||||||
|
test_subcommand ! git pack-refs --all --prune \
|
||||||
|
<incremental-daily.txt &&
|
||||||
|
|
||||||
|
test_subcommand git commit-graph write --split --reachable \
|
||||||
|
--no-progress <incremental-weekly.txt &&
|
||||||
|
test_subcommand git prune-packed --quiet <incremental-weekly.txt &&
|
||||||
|
test_subcommand git multi-pack-index write --no-progress \
|
||||||
|
<incremental-weekly.txt &&
|
||||||
|
test_subcommand git pack-refs --all --prune \
|
||||||
|
<incremental-weekly.txt &&
|
||||||
|
|
||||||
# Modify defaults
|
# Modify defaults
|
||||||
git config maintenance.commit-graph.schedule daily &&
|
git config maintenance.commit-graph.schedule daily &&
|
||||||
|
Loading…
Reference in New Issue
Block a user