@@ -29,13 +29,53 @@ Git repository.
2929SUBCOMMANDS
3030-----------
3131
32+ register::
33+ Initialize Git config values so any scheduled maintenance will
34+ start running on this repository. This adds the repository to the
35+ `maintenance.repo` config variable in the current user's global
36+ config and enables some recommended configuration values for
37+ `maintenance.<task>.schedule`. The tasks that are enabled are safe
38+ for running in the background without disrupting foreground
39+ processes.
40+ +
41+ If your repository has no `maintenance.<task>.schedule` configuration
42+ values set, then Git will use a recommended default schedule that performs
43+ background maintenance that will not interrupt foreground commands. The
44+ default schedule is as follows:
45+ +
46+ * `gc`: disabled.
47+ * `commit-graph`: hourly.
48+ * `prefetch`: hourly.
49+ * `loose-objects`: daily.
50+ * `incremental-repack`: daily.
51+ +
52+ `git maintenance register` will also disable foreground maintenance by
53+ setting `maintenance.auto = false` in the current repository. This config
54+ setting will remain after a `git maintenance unregister` command.
55+
3256run::
3357 Run one or more maintenance tasks. If one or more `--task` options
3458 are specified, then those tasks are run in that order. Otherwise,
3559 the tasks are determined by which `maintenance.<task>.enabled`
3660 config options are true. By default, only `maintenance.gc.enabled`
3761 is true.
3862
63+ start::
64+ Start running maintenance on the current repository. This performs
65+ the same config updates as the `register` subcommand, then updates
66+ the background scheduler to run `git maintenance run --scheduled`
67+ on an hourly basis.
68+
69+ stop::
70+ Halt the background maintenance schedule. The current repository
71+ is not removed from the list of maintained repositories, in case
72+ the background maintenance is restarted later.
73+
74+ unregister::
75+ Remove the current repository from background maintenance. This
76+ only removes the repository from the configured list. It does not
77+ stop the background maintenance processes from running.
78+
3979TASKS
4080-----
4181
@@ -47,6 +87,21 @@ commit-graph::
4787 `commit-graph-chain` file. They will be deleted by a later run based
4888 on the expiration delay.
4989
90+ prefetch::
91+ The `prefetch` task updates the object directory with the latest
92+ objects from all registered remotes. For each remote, a `git fetch`
93+ command is run. The refmap is custom to avoid updating local or remote
94+ branches (those in `refs/heads` or `refs/remotes`). Instead, the
95+ remote refs are stored in `refs/prefetch/<remote>/`. Also, tags are
96+ not updated.
97+ +
98+ This is done to avoid disrupting the remote-tracking branches. The end users
99+ expect these refs to stay unmoved unless they initiate a fetch. With prefetch
100+ task, however, the objects necessary to complete a later real fetch would
101+ already be obtained, so the real fetch would go faster. In the ideal case,
102+ it will just become an update to bunch of remote-tracking branches without
103+ any object transfer.
104+
50105gc::
51106 Clean up unnecessary files and optimize the local repository. "GC"
52107 stands for "garbage collection," but this task performs many
@@ -55,14 +110,58 @@ gc::
55110 be disruptive in some situations, as it deletes stale data. See
56111 linkgit:git-gc[1] for more details on garbage collection in Git.
57112
113+ loose-objects::
114+ The `loose-objects` job cleans up loose objects and places them into
115+ pack-files. In order to prevent race conditions with concurrent Git
116+ commands, it follows a two-step process. First, it deletes any loose
117+ objects that already exist in a pack-file; concurrent Git processes
118+ will examine the pack-file for the object data instead of the loose
119+ object. Second, it creates a new pack-file (starting with "loose-")
120+ containing a batch of loose objects. The batch size is limited to 50
121+ thousand objects to prevent the job from taking too long on a
122+ repository with many loose objects. The `gc` task writes unreachable
123+ objects as loose objects to be cleaned up by a later step only if
124+ they are not re-added to a pack-file; for this reason it is not
125+ advisable to enable both the `loose-objects` and `gc` tasks at the
126+ same time.
127+
128+ incremental-repack::
129+ The `incremental-repack` job repacks the object directory
130+ using the `multi-pack-index` feature. In order to prevent race
131+ conditions with concurrent Git commands, it follows a two-step
132+ process. First, it calls `git multi-pack-index expire` to delete
133+ pack-files unreferenced by the `multi-pack-index` file. Second, it
134+ calls `git multi-pack-index repack` to select several small
135+ pack-files and repack them into a bigger one, and then update the
136+ `multi-pack-index` entries that refer to the small pack-files to
137+ refer to the new pack-file. This prepares those small pack-files
138+ for deletion upon the next run of `git multi-pack-index expire`.
139+ The selection of the small pack-files is such that the expected
140+ size of the big pack-file is at least the batch size; see the
141+ `--batch-size` option for the `repack` subcommand in
142+ linkgit:git-multi-pack-index[1]. The default batch-size is zero,
143+ which is a special case that attempts to repack all pack-files
144+ into a single pack-file.
145+
58146OPTIONS
59147-------
60148--auto::
61149 When combined with the `run` subcommand, run maintenance tasks
62150 only if certain thresholds are met. For example, the `gc` task
63151 runs when the number of loose objects exceeds the number stored
64152 in the `gc.auto` config setting, or when the number of pack-files
65- exceeds the `gc.autoPackLimit` config setting.
153+ exceeds the `gc.autoPackLimit` config setting. Not compatible with
154+ the `--schedule` option.
155+
156+ --schedule::
157+ When combined with the `run` subcommand, run maintenance tasks
158+ only if certain time conditions are met, as specified by the
159+ `maintenance.<task>.schedule` config value for each `<task>`.
160+ This config value specifies a number of seconds since the last
161+ time that task ran, according to the `maintenance.<task>.lastRun`
162+ config value. The tasks that are tested are those provided by
163+ the `--task=<task>` option(s) or those with
164+ `maintenance.<task>.enabled` set to true.
66165
67166--quiet::
68167 Do not report progress or other information over `stderr`.
@@ -74,6 +173,50 @@ OPTIONS
74173 `maintenance.<task>.enabled` configured as `true` are considered.
75174 See the 'TASKS' section for the list of accepted `<task>` values.
76175
176+
177+ TROUBLESHOOTING
178+ ---------------
179+ The `git maintenance` command is designed to simplify the repository
180+ maintenance patterns while minimizing user wait time during Git commands.
181+ A variety of configuration options are available to allow customizing this
182+ process. The default maintenance options focus on operations that complete
183+ quickly, even on large repositories.
184+
185+ Users may find some cases where scheduled maintenance tasks do not run as
186+ frequently as intended. Each `git maintenance run` command takes a lock on
187+ the repository's object database, and this prevents other concurrent
188+ `git maintenance run` commands from running on the same repository. Without
189+ this safeguard, competing processes could leave the repository in an
190+ unpredictable state.
191+
192+ The background maintenance schedule runs `git maintenance run` processes
193+ on an hourly basis. Each run executes the "hourly" tasks. At midnight,
194+ that process also executes the "daily" tasks. At midnight on the first day
195+ of the week, that process also executes the "weekly" tasks. A single
196+ process iterates over each registered repository, performing the scheduled
197+ tasks for that frequency. Depending on the number of registered
198+ repositories and their sizes, this process may take longer than an hour.
199+ In this case, multiple `git maintenance run` commands may run on the same
200+ repository at the same time, colliding on the object database lock. This
201+ results in one of the two tasks not running.
202+
203+ If you find that some maintenance windows are taking longer than one hour
204+ to complete, then consider reducing the complexity of your maintenance
205+ tasks. For example, the `gc` task is much slower than the
206+ `incremental-repack` task. However, this comes at a cost of a slightly
207+ larger object database. Consider moving more expensive tasks to be run
208+ less frequently.
209+
210+ Expert users may consider scheduling their own maintenance tasks using a
211+ different schedule than is available through `git maintenance start` and
212+ Git configuration options. These users should be aware of the object
213+ database lock and how concurrent `git maintenance run` commands behave.
214+ Further, the `git gc` command should not be combined with
215+ `git maintenance run` commands. `git gc` modifies the object database
216+ but does not take the lock in the same way as `git maintenance run`. If
217+ possible, use `git maintenance run --task=gc` instead of `git gc`.
218+
219+
77220GIT
78221---
79222Part of the linkgit:git[1] suite
0 commit comments