maintenance.auto::
	This boolean config option controls whether some commands run
	`git maintenance run --auto` after doing their normal work. Defaults
	to true.

maintenance.autoDetach::
	Many Git commands trigger automatic maintenance after they have
	written data into the repository. This boolean config option
	controls whether this automatic maintenance shall happen in the
	foreground or whether the maintenance process shall detach and
	continue to run in the background.
+
If unset, the value of `gc.autoDetach` is used as a fallback. Defaults
to true if both are unset, meaning that the maintenance process will
detach.

maintenance.strategy::
	This string config option provides a way to specify one of a few
	recommended schedules for background maintenance. This only affects
	which tasks are run during `git maintenance run --schedule=X`
	commands, provided no `--task=<task>` arguments are provided.
	Further, if a `maintenance.<task>.schedule` config value is set,
	then that value is used instead of the one provided by
	`maintenance.strategy`. The possible strategy strings are:
+
* `none`: This default setting implies no tasks are run at any schedule.
* `incremental`: This setting optimizes for performing small maintenance
  activities that do not delete any data. This does not schedule the `gc`
  task, but runs the `prefetch` and `commit-graph` tasks hourly, the
  `loose-objects` and `incremental-repack` tasks daily, and the `pack-refs`
  task weekly.

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.<task>.schedule::
	This config option controls whether or not the given `<task>` runs
	during a `git maintenance run --schedule=<frequency>` command. The
	value must be one of "hourly", "daily", or "weekly".

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.

maintenance.loose-objects.auto::
	This integer config option controls how often the `loose-objects` task
	should be run as part of `git maintenance run --auto`. If zero, then
	the `loose-objects` 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
	loose objects is at least the value of `maintenance.loose-objects.auto`.
	The default value is 100.

maintenance.loose-objects.batchSize::
	This integer config option controls the maximum number of loose objects
	written into a packfile during the `loose-objects` task. The default is
	fifty thousand. Use value `0` to indicate no limit.

maintenance.incremental-repack.auto::
	This integer config option controls how often the `incremental-repack`
	task should be run as part of `git maintenance run --auto`. If zero,
	then the `incremental-repack` 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 pack-files not in the multi-pack-index is at least the value
	of `maintenance.incremental-repack.auto`. The default value is 10.

maintenance.reflog-expire.auto::
	This integer config option controls how often the `reflog-expire` task
	should be run as part of `git maintenance run --auto`. If zero, then
	the `reflog-expire` 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
	expired reflog entries in the "HEAD" reflog is at least the value of
	`maintenance.loose-objects.auto`. The default value is 100.

maintenance.rerere-gc.auto::
	This integer config option controls how often the `rerere-gc` task
	should be run as part of `git maintenance run --auto`. If zero, then
	the `rerere-gc` task will not run with the `--auto` option. A negative
	value will force the task to run every time. Otherwise, any positive
	value implies the command will run when the "rr-cache" directory exists
	and has at least one entry, regardless of whether it is stale or not.
	This heuristic may be refined in the future. The default value is 1.

maintenance.worktree-prune.auto::
	This integer config option controls how often the `worktree-prune` task
	should be run as part of `git maintenance run --auto`. If zero, then
	the `worktree-prune` 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
	prunable worktrees exceeds the value. The default value is 1.
