@@ -29,13 +29,53 @@ Git repository.
29
29
SUBCOMMANDS
30
30
-----------
31
31
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
+
32
56
run::
33
57
Run one or more maintenance tasks. If one or more `--task` options
34
58
are specified, then those tasks are run in that order. Otherwise,
35
59
the tasks are determined by which `maintenance.<task>.enabled`
36
60
config options are true. By default, only `maintenance.gc.enabled`
37
61
is true.
38
62
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
+
39
79
TASKS
40
80
-----
41
81
@@ -110,7 +150,18 @@ OPTIONS
110
150
only if certain thresholds are met. For example, the `gc` task
111
151
runs when the number of loose objects exceeds the number stored
112
152
in the `gc.auto` config setting, or when the number of pack-files
113
- 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.
114
165
115
166
--quiet::
116
167
Do not report progress or other information over `stderr`.
@@ -122,6 +173,50 @@ OPTIONS
122
173
`maintenance.<task>.enabled` configured as `true` are considered.
123
174
See the 'TASKS' section for the list of accepted `<task>` values.
124
175
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
+
125
220
GIT
126
221
---
127
222
Part of the linkgit:git[1] suite
0 commit comments