Imported Upstream version 2.30.0
[platform/upstream/git.git] / Documentation / git-maintenance.txt
index 6abcb82..d1f9b51 100644 (file)
@@ -29,6 +29,32 @@ Git repository.
 SUBCOMMANDS
 -----------
 
+register::
+       Initialize Git config values so any scheduled maintenance will
+       start running on this repository. This adds the repository to the
+       `maintenance.repo` config variable in the current user's global
+       config and enables some recommended configuration values for
+       `maintenance.<task>.schedule`. The tasks that are enabled are safe
+       for running in the background without disrupting foreground
+       processes.
++
+The `register` subcomand will also set the `maintenance.strategy` config
+value to `incremental`, if this value is not previously set. The
+`incremental` strategy uses the following schedule for each maintenance
+task:
++
+--
+* `gc`: disabled.
+* `commit-graph`: hourly.
+* `prefetch`: hourly.
+* `loose-objects`: daily.
+* `incremental-repack`: daily.
+--
++
+`git maintenance register` will also disable foreground maintenance by
+setting `maintenance.auto = false` in the current repository. This config
+setting will remain after a `git maintenance unregister` command.
+
 run::
        Run one or more maintenance tasks. If one or more `--task` options
        are specified, then those tasks are run in that order. Otherwise,
@@ -36,6 +62,22 @@ run::
        config options are true. By default, only `maintenance.gc.enabled`
        is true.
 
+start::
+       Start running maintenance on the current repository. This performs
+       the same config updates as the `register` subcommand, then updates
+       the background scheduler to run `git maintenance run --scheduled`
+       on an hourly basis.
+
+stop::
+       Halt the background maintenance schedule. The current repository
+       is not removed from the list of maintained repositories, in case
+       the background maintenance is restarted later.
+
+unregister::
+       Remove the current repository from background maintenance. This
+       only removes the repository from the configured list. It does not
+       stop the background maintenance processes from running.
+
 TASKS
 -----
 
@@ -47,6 +89,21 @@ commit-graph::
        `commit-graph-chain` file. They will be deleted by a later run based
        on the expiration delay.
 
+prefetch::
+       The `prefetch` task updates the object directory with the latest
+       objects from all registered remotes. For each remote, a `git fetch`
+       command is run. The refmap is custom to avoid updating local or remote
+       branches (those in `refs/heads` or `refs/remotes`). Instead, the
+       remote refs are stored in `refs/prefetch/<remote>/`. Also, tags are
+       not updated.
++
+This is done to avoid disrupting the remote-tracking branches. The end users
+expect these refs to stay unmoved unless they initiate a fetch.  With prefetch
+task, however, the objects necessary to complete a later real fetch would
+already be obtained, so the real fetch would go faster.  In the ideal case,
+it will just become an update to a bunch of remote-tracking branches without
+any object transfer.
+
 gc::
        Clean up unnecessary files and optimize the local repository. "GC"
        stands for "garbage collection," but this task performs many
@@ -55,6 +112,39 @@ gc::
        be disruptive in some situations, as it deletes stale data. See
        linkgit:git-gc[1] for more details on garbage collection in Git.
 
+loose-objects::
+       The `loose-objects` job cleans up loose objects and places them into
+       pack-files. In order to prevent race conditions with concurrent Git
+       commands, it follows a two-step process. First, it deletes any loose
+       objects that already exist in a pack-file; concurrent Git processes
+       will examine the pack-file for the object data instead of the loose
+       object. Second, it creates a new pack-file (starting with "loose-")
+       containing a batch of loose objects. The batch size is limited to 50
+       thousand objects to prevent the job from taking too long on a
+       repository with many loose objects. The `gc` task writes unreachable
+       objects as loose objects to be cleaned up by a later step only if
+       they are not re-added to a pack-file; for this reason it is not
+       advisable to enable both the `loose-objects` and `gc` tasks at the
+       same time.
+
+incremental-repack::
+       The `incremental-repack` job repacks the object directory
+       using the `multi-pack-index` feature. In order to prevent race
+       conditions with concurrent Git commands, it follows a two-step
+       process. First, it calls `git multi-pack-index expire` to delete
+       pack-files unreferenced by the `multi-pack-index` file. Second, it
+       calls `git multi-pack-index repack` to select several small
+       pack-files and repack them into a bigger one, and then update the
+       `multi-pack-index` entries that refer to the small pack-files to
+       refer to the new pack-file. This prepares those small pack-files
+       for deletion upon the next run of `git multi-pack-index expire`.
+       The selection of the small pack-files is such that the expected
+       size of the big pack-file is at least the batch size; see the
+       `--batch-size` option for the `repack` subcommand in
+       linkgit:git-multi-pack-index[1]. The default batch-size is zero,
+       which is a special case that attempts to repack all pack-files
+       into a single pack-file.
+
 OPTIONS
 -------
 --auto::
@@ -62,7 +152,18 @@ OPTIONS
        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.
+       exceeds the `gc.autoPackLimit` config setting. Not compatible with
+       the `--schedule` option.
+
+--schedule::
+       When combined with the `run` subcommand, run maintenance tasks
+       only if certain time conditions are met, as specified by the
+       `maintenance.<task>.schedule` config value for each `<task>`.
+       This config value specifies a number of seconds since the last
+       time that task ran, according to the `maintenance.<task>.lastRun`
+       config value. The tasks that are tested are those provided by
+       the `--task=<task>` option(s) or those with
+       `maintenance.<task>.enabled` set to true.
 
 --quiet::
        Do not report progress or other information over `stderr`.
@@ -74,6 +175,50 @@ OPTIONS
        `maintenance.<task>.enabled` configured as `true` are considered.
        See the 'TASKS' section for the list of accepted `<task>` values.
 
+
+TROUBLESHOOTING
+---------------
+The `git maintenance` command is designed to simplify the repository
+maintenance patterns while minimizing user wait time during Git commands.
+A variety of configuration options are available to allow customizing this
+process. The default maintenance options focus on operations that complete
+quickly, even on large repositories.
+
+Users may find some cases where scheduled maintenance tasks do not run as
+frequently as intended. Each `git maintenance run` command takes a lock on
+the repository's object database, and this prevents other concurrent
+`git maintenance run` commands from running on the same repository. Without
+this safeguard, competing processes could leave the repository in an
+unpredictable state.
+
+The background maintenance schedule runs `git maintenance run` processes
+on an hourly basis. Each run executes the "hourly" tasks. At midnight,
+that process also executes the "daily" tasks. At midnight on the first day
+of the week, that process also executes the "weekly" tasks. A single
+process iterates over each registered repository, performing the scheduled
+tasks for that frequency. Depending on the number of registered
+repositories and their sizes, this process may take longer than an hour.
+In this case, multiple `git maintenance run` commands may run on the same
+repository at the same time, colliding on the object database lock. This
+results in one of the two tasks not running.
+
+If you find that some maintenance windows are taking longer than one hour
+to complete, then consider reducing the complexity of your maintenance
+tasks. For example, the `gc` task is much slower than the
+`incremental-repack` task. However, this comes at a cost of a slightly
+larger object database. Consider moving more expensive tasks to be run
+less frequently.
+
+Expert users may consider scheduling their own maintenance tasks using a
+different schedule than is available through `git maintenance start` and
+Git configuration options. These users should be aware of the object
+database lock and how concurrent `git maintenance run` commands behave.
+Further, the `git gc` command should not be combined with
+`git maintenance run` commands. `git gc` modifies the object database
+but does not take the lock in the same way as `git maintenance run`. If
+possible, use `git maintenance run --task=gc` instead of `git gc`.
+
+
 GIT
 ---
 Part of the linkgit:git[1] suite