Browse Source
A "git gc"'s big brother has been introduced to take care of more repository maintenance tasks, not limited to the object database cleaning. * ds/maintenance-part-1: maintenance: add trace2 regions for task execution maintenance: add auto condition for commit-graph task maintenance: use pointers to check --auto maintenance: create maintenance.<task>.enabled config maintenance: take a lock on the objects directory maintenance: add --task option maintenance: add commit-graph task maintenance: initialize task array maintenance: replace run_auto_gc() maintenance: add --quiet option maintenance: create basic maintenance runnermaint
Junio C Hamano
4 years ago
24 changed files with 568 additions and 28 deletions
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
maintenance.<task>.enabled:: |
||||
This boolean config option controls whether the maintenance task |
||||
with name `<task>` is run when no `--task` option is specified to |
||||
`git maintenance run`. These config values are ignored if a |
||||
`--task` option exists. By default, only `maintenance.gc.enabled` |
||||
is true. |
||||
|
||||
maintenance.commit-graph.auto:: |
||||
This integer config option controls how often the `commit-graph` task |
||||
should be run as part of `git maintenance run --auto`. If zero, then |
||||
the `commit-graph` task will not run with the `--auto` option. A |
||||
negative value will force the task to run every time. Otherwise, a |
||||
positive value implies the command should run when the number of |
||||
reachable commits that are not in the commit-graph file is at least |
||||
the value of `maintenance.commit-graph.auto`. The default value is |
||||
100. |
@ -0,0 +1,79 @@
@@ -0,0 +1,79 @@
|
||||
git-maintenance(1) |
||||
================== |
||||
|
||||
NAME |
||||
---- |
||||
git-maintenance - Run tasks to optimize Git repository data |
||||
|
||||
|
||||
SYNOPSIS |
||||
-------- |
||||
[verse] |
||||
'git maintenance' run [<options>] |
||||
|
||||
|
||||
DESCRIPTION |
||||
----------- |
||||
Run tasks to optimize Git repository data, speeding up other Git commands |
||||
and reducing storage requirements for the repository. |
||||
|
||||
Git commands that add repository data, such as `git add` or `git fetch`, |
||||
are optimized for a responsive user experience. These commands do not take |
||||
time to optimize the Git data, since such optimizations scale with the full |
||||
size of the repository while these user commands each perform a relatively |
||||
small action. |
||||
|
||||
The `git maintenance` command provides flexibility for how to optimize the |
||||
Git repository. |
||||
|
||||
SUBCOMMANDS |
||||
----------- |
||||
|
||||
run:: |
||||
Run one or more maintenance tasks. If one or more `--task` options |
||||
are specified, then those tasks are run in that order. Otherwise, |
||||
the tasks are determined by which `maintenance.<task>.enabled` |
||||
config options are true. By default, only `maintenance.gc.enabled` |
||||
is true. |
||||
|
||||
TASKS |
||||
----- |
||||
|
||||
commit-graph:: |
||||
The `commit-graph` job updates the `commit-graph` files incrementally, |
||||
then verifies that the written data is correct. The incremental |
||||
write is safe to run alongside concurrent Git processes since it |
||||
will not expire `.graph` files that were in the previous |
||||
`commit-graph-chain` file. They will be deleted by a later run based |
||||
on the expiration delay. |
||||
|
||||
gc:: |
||||
Clean up unnecessary files and optimize the local repository. "GC" |
||||
stands for "garbage collection," but this task performs many |
||||
smaller tasks. This task can be expensive for large repositories, |
||||
as it repacks all Git objects into a single pack-file. It can also |
||||
be disruptive in some situations, as it deletes stale data. See |
||||
linkgit:git-gc[1] for more details on garbage collection in Git. |
||||
|
||||
OPTIONS |
||||
------- |
||||
--auto:: |
||||
When combined with the `run` subcommand, run maintenance tasks |
||||
only if certain thresholds are met. For example, the `gc` task |
||||
runs when the number of loose objects exceeds the number stored |
||||
in the `gc.auto` config setting, or when the number of pack-files |
||||
exceeds the `gc.autoPackLimit` config setting. |
||||
|
||||
--quiet:: |
||||
Do not report progress or other information over `stderr`. |
||||
|
||||
--task=<task>:: |
||||
If this option is specified one or more times, then only run the |
||||
specified tasks in the specified order. If no `--task=<task>` |
||||
arguments are specified, then only the tasks with |
||||
`maintenance.<task>.enabled` configured as `true` are considered. |
||||
See the 'TASKS' section for the list of accepted `<task>` values. |
||||
|
||||
GIT |
||||
--- |
||||
Part of the linkgit:git[1] suite |
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
#!/bin/sh |
||||
|
||||
test_description='git maintenance builtin' |
||||
|
||||
. ./test-lib.sh |
||||
|
||||
GIT_TEST_COMMIT_GRAPH=0 |
||||
|
||||
test_expect_success 'help text' ' |
||||
test_expect_code 129 git maintenance -h 2>err && |
||||
test_i18ngrep "usage: git maintenance run" err && |
||||
test_expect_code 128 git maintenance barf 2>err && |
||||
test_i18ngrep "invalid subcommand: barf" err && |
||||
test_expect_code 129 git maintenance 2>err && |
||||
test_i18ngrep "usage: git maintenance" err |
||||
' |
||||
|
||||
test_expect_success 'run [--auto|--quiet]' ' |
||||
GIT_TRACE2_EVENT="$(pwd)/run-no-auto.txt" \ |
||||
git maintenance run 2>/dev/null && |
||||
GIT_TRACE2_EVENT="$(pwd)/run-auto.txt" \ |
||||
git maintenance run --auto 2>/dev/null && |
||||
GIT_TRACE2_EVENT="$(pwd)/run-no-quiet.txt" \ |
||||
git maintenance run --no-quiet 2>/dev/null && |
||||
test_subcommand git gc --quiet <run-no-auto.txt && |
||||
test_subcommand ! git gc --auto --quiet <run-auto.txt && |
||||
test_subcommand git gc --no-quiet <run-no-quiet.txt |
||||
' |
||||
|
||||
test_expect_success 'maintenance.<task>.enabled' ' |
||||
git config maintenance.gc.enabled false && |
||||
git config maintenance.commit-graph.enabled true && |
||||
GIT_TRACE2_EVENT="$(pwd)/run-config.txt" git maintenance run 2>err && |
||||
test_subcommand ! git gc --quiet <run-config.txt && |
||||
test_subcommand git commit-graph write --split --reachable --no-progress <run-config.txt |
||||
' |
||||
|
||||
test_expect_success 'run --task=<task>' ' |
||||
GIT_TRACE2_EVENT="$(pwd)/run-commit-graph.txt" \ |
||||
git maintenance run --task=commit-graph 2>/dev/null && |
||||
GIT_TRACE2_EVENT="$(pwd)/run-gc.txt" \ |
||||
git maintenance run --task=gc 2>/dev/null && |
||||
GIT_TRACE2_EVENT="$(pwd)/run-commit-graph.txt" \ |
||||
git maintenance run --task=commit-graph 2>/dev/null && |
||||
GIT_TRACE2_EVENT="$(pwd)/run-both.txt" \ |
||||
git maintenance run --task=commit-graph --task=gc 2>/dev/null && |
||||
test_subcommand ! git gc --quiet <run-commit-graph.txt && |
||||
test_subcommand git gc --quiet <run-gc.txt && |
||||
test_subcommand git gc --quiet <run-both.txt && |
||||
test_subcommand git commit-graph write --split --reachable --no-progress <run-commit-graph.txt && |
||||
test_subcommand ! git commit-graph write --split --reachable --no-progress <run-gc.txt && |
||||
test_subcommand git commit-graph write --split --reachable --no-progress <run-both.txt |
||||
' |
||||
|
||||
test_expect_success 'run --task=bogus' ' |
||||
test_must_fail git maintenance run --task=bogus 2>err && |
||||
test_i18ngrep "is not a valid task" err |
||||
' |
||||
|
||||
test_expect_success 'run --task duplicate' ' |
||||
test_must_fail git maintenance run --task=gc --task=gc 2>err && |
||||
test_i18ngrep "cannot be selected multiple times" err |
||||
' |
||||
|
||||
test_done |
Loading…
Reference in new issue