Git fork
at reftables-rust 435 lines 20 kB view raw
1git-maintenance(1) 2================== 3 4NAME 5---- 6git-maintenance - Run tasks to optimize Git repository data 7 8 9SYNOPSIS 10-------- 11[verse] 12'git maintenance' run [<options>] 13'git maintenance' start [--scheduler=<scheduler>] 14'git maintenance' (stop|register|unregister) [<options>] 15 16 17DESCRIPTION 18----------- 19Run tasks to optimize Git repository data, speeding up other Git commands 20and reducing storage requirements for the repository. 21 22Git commands that add repository data, such as `git add` or `git fetch`, 23are optimized for a responsive user experience. These commands do not take 24time to optimize the Git data, since such optimizations scale with the full 25size of the repository while these user commands each perform a relatively 26small action. 27 28The `git maintenance` command provides flexibility for how to optimize the 29Git repository. 30 31SUBCOMMANDS 32----------- 33 34run:: 35 Run one or more maintenance tasks. If one or more `--task` options 36 are specified, then those tasks are run in that order. Otherwise, 37 the tasks are determined by which `maintenance.<task>.enabled` 38 config options are true. By default, only `maintenance.gc.enabled` 39 is true. 40 41start:: 42 Start running maintenance on the current repository. This performs 43 the same config updates as the `register` subcommand, then updates 44 the background scheduler to run `git maintenance run --scheduled` 45 on an hourly basis. 46 47stop:: 48 Halt the background maintenance schedule. The current repository 49 is not removed from the list of maintained repositories, in case 50 the background maintenance is restarted later. 51 52register:: 53 Initialize Git config values so any scheduled maintenance will start 54 running on this repository. This adds the repository to the 55 `maintenance.repo` config variable in the current user's global config, 56 or the config specified by --config-file option, and enables some 57 recommended configuration values for `maintenance.<task>.schedule`. The 58 tasks that are enabled are safe for running in the background without 59 disrupting foreground processes. 60+ 61The `register` subcommand will also set the `maintenance.strategy` config 62value to `incremental`, if this value is not previously set. The 63`incremental` strategy uses the following schedule for each maintenance 64task: 65+ 66-- 67* `gc`: disabled. 68* `commit-graph`: hourly. 69* `prefetch`: hourly. 70* `loose-objects`: daily. 71* `incremental-repack`: daily. 72-- 73+ 74`git maintenance register` will also disable foreground maintenance by 75setting `maintenance.auto = false` in the current repository. This config 76setting will remain after a `git maintenance unregister` command. 77 78unregister:: 79 Remove the current repository from background maintenance. This 80 only removes the repository from the configured list. It does not 81 stop the background maintenance processes from running. 82+ 83The `unregister` subcommand will report an error if the current repository 84is not already registered. Use the `--force` option to return success even 85when the current repository is not registered. 86 87TASKS 88----- 89 90commit-graph:: 91 The `commit-graph` job updates the `commit-graph` files incrementally, 92 then verifies that the written data is correct. The incremental 93 write is safe to run alongside concurrent Git processes since it 94 will not expire `.graph` files that were in the previous 95 `commit-graph-chain` file. They will be deleted by a later run based 96 on the expiration delay. 97 98prefetch:: 99 The `prefetch` task updates the object directory with the latest 100 objects from all registered remotes. For each remote, a `git fetch` 101 command is run. The configured refspec is modified to place all 102 requested refs within `refs/prefetch/`. Also, tags are not updated. 103+ 104This is done to avoid disrupting the remote-tracking branches. The end users 105expect these refs to stay unmoved unless they initiate a fetch. However, 106with the prefetch task, the objects necessary to complete a later real fetch 107would already be obtained, making the real fetch faster. In the ideal case, 108it will just become an update to a bunch of remote-tracking branches without 109any object transfer. 110+ 111The `remote.<name>.skipFetchAll` configuration can be used to 112exclude a particular remote from getting prefetched. 113 114gc:: 115 Clean up unnecessary files and optimize the local repository. "GC" 116 stands for "garbage collection," but this task performs many 117 smaller tasks. This task can be expensive for large repositories, 118 as it repacks all Git objects into a single pack-file. It can also 119 be disruptive in some situations, as it deletes stale data. See 120 linkgit:git-gc[1] for more details on garbage collection in Git. 121 122loose-objects:: 123 The `loose-objects` job cleans up loose objects and places them into 124 pack-files. In order to prevent race conditions with concurrent Git 125 commands, it follows a two-step process. First, it deletes any loose 126 objects that already exist in a pack-file; concurrent Git processes 127 will examine the pack-file for the object data instead of the loose 128 object. Second, it creates a new pack-file (starting with "loose-") 129 containing a batch of loose objects. 130+ 131The batch size defaults to fifty thousand objects to prevent the job from 132taking too long on a repository with many loose objects. Use the 133`maintenance.loose-objects.batchSize` config option to adjust this size, 134including a value of `0` to remove the limit. 135+ 136The `gc` task writes unreachable objects as loose objects to be cleaned up 137by a later step only if they are not re-added to a pack-file; for this 138reason it is not advisable to enable both the `loose-objects` and `gc` 139tasks at the same time. 140 141incremental-repack:: 142 The `incremental-repack` job repacks the object directory 143 using the `multi-pack-index` feature. In order to prevent race 144 conditions with concurrent Git commands, it follows a two-step 145 process. First, it calls `git multi-pack-index expire` to delete 146 pack-files unreferenced by the `multi-pack-index` file. Second, it 147 calls `git multi-pack-index repack` to select several small 148 pack-files and repack them into a bigger one, and then update the 149 `multi-pack-index` entries that refer to the small pack-files to 150 refer to the new pack-file. This prepares those small pack-files 151 for deletion upon the next run of `git multi-pack-index expire`. 152 The selection of the small pack-files is such that the expected 153 size of the big pack-file is at least the batch size; see the 154 `--batch-size` option for the `repack` subcommand in 155 linkgit:git-multi-pack-index[1]. The default batch-size is zero, 156 which is a special case that attempts to repack all pack-files 157 into a single pack-file. 158 159pack-refs:: 160 The `pack-refs` task collects the loose reference files and 161 collects them into a single file. This speeds up operations that 162 need to iterate across many references. See linkgit:git-pack-refs[1] 163 for more information. 164 165reflog-expire:: 166 The `reflog-expire` task deletes any entries in the reflog older than the 167 expiry threshold. See linkgit:git-reflog[1] for more information. 168 169rerere-gc:: 170 The `rerere-gc` task invokes garbage collection for stale entries in 171 the rerere cache. See linkgit:git-rerere[1] for more information. 172 173worktree-prune:: 174 The `worktree-prune` task deletes stale or broken worktrees. See 175 linkgit:git-worktree[1] for more information. 176 177OPTIONS 178------- 179--auto:: 180 When combined with the `run` subcommand, run maintenance tasks 181 only if certain thresholds are met. For example, the `gc` task 182 runs when the number of loose objects exceeds the number stored 183 in the `gc.auto` config setting, or when the number of pack-files 184 exceeds the `gc.autoPackLimit` config setting. Not compatible with 185 the `--schedule` option. 186 187--schedule:: 188 When combined with the `run` subcommand, run maintenance tasks 189 only if certain time conditions are met, as specified by the 190 `maintenance.<task>.schedule` config value for each `<task>`. 191 This config value specifies a number of seconds since the last 192 time that task ran, according to the `maintenance.<task>.lastRun` 193 config value. The tasks that are tested are those provided by 194 the `--task=<task>` option(s) or those with 195 `maintenance.<task>.enabled` set to true. 196 197--quiet:: 198 Do not report progress or other information over `stderr`. 199 200--task=<task>:: 201 If this option is specified one or more times, then only run the 202 specified tasks in the specified order. If no `--task=<task>` 203 arguments are specified, then only the tasks with 204 `maintenance.<task>.enabled` configured as `true` are considered. 205 See the 'TASKS' section for the list of accepted `<task>` values. 206 207--scheduler=auto|crontab|systemd-timer|launchctl|schtasks:: 208 When combined with the `start` subcommand, specify the scheduler 209 for running the hourly, daily and weekly executions of 210 `git maintenance run`. 211 Possible values for `<scheduler>` are `auto`, `crontab` 212 (POSIX), `systemd-timer` (Linux), `launchctl` (macOS), and 213 `schtasks` (Windows). When `auto` is specified, the 214 appropriate platform-specific scheduler is used; on Linux, 215 `systemd-timer` is used if available, otherwise 216 `crontab`. Default is `auto`. 217 218 219TROUBLESHOOTING 220--------------- 221The `git maintenance` command is designed to simplify the repository 222maintenance patterns while minimizing user wait time during Git commands. 223A variety of configuration options are available to allow customizing this 224process. The default maintenance options focus on operations that complete 225quickly, even on large repositories. 226 227Users may find some cases where scheduled maintenance tasks do not run as 228frequently as intended. Each `git maintenance run` command takes a lock on 229the repository's object database, and this prevents other concurrent 230`git maintenance run` commands from running on the same repository. Without 231this safeguard, competing processes could leave the repository in an 232unpredictable state. 233 234The background maintenance schedule runs `git maintenance run` processes 235on an hourly basis. Each run executes the "hourly" tasks. At midnight, 236that process also executes the "daily" tasks. At midnight on the first day 237of the week, that process also executes the "weekly" tasks. A single 238process iterates over each registered repository, performing the scheduled 239tasks for that frequency. The processes are scheduled to a random minute of 240the hour per client to spread out the load that multiple clients might 241generate (e.g. from prefetching). Depending on the number of registered 242repositories and their sizes, this process may take longer than an hour. 243In this case, multiple `git maintenance run` commands may run on the same 244repository at the same time, colliding on the object database lock. This 245results in one of the two tasks not running. 246 247If you find that some maintenance windows are taking longer than one hour 248to complete, then consider reducing the complexity of your maintenance 249tasks. For example, the `gc` task is much slower than the 250`incremental-repack` task. However, this comes at a cost of a slightly 251larger object database. Consider moving more expensive tasks to be run 252less frequently. 253 254Expert users may consider scheduling their own maintenance tasks using a 255different schedule than is available through `git maintenance start` and 256Git configuration options. These users should be aware of the object 257database lock and how concurrent `git maintenance run` commands behave. 258Further, the `git gc` command should not be combined with 259`git maintenance run` commands. `git gc` modifies the object database 260but does not take the lock in the same way as `git maintenance run`. If 261possible, use `git maintenance run --task=gc` instead of `git gc`. 262 263The following sections describe the mechanisms put in place to run 264background maintenance by `git maintenance start` and how to customize 265them. 266 267BACKGROUND MAINTENANCE ON POSIX SYSTEMS 268--------------------------------------- 269 270The standard mechanism for scheduling background tasks on POSIX systems 271is cron(8). This tool executes commands based on a given schedule. The 272current list of user-scheduled tasks can be found by running `crontab -l`. 273The schedule written by `git maintenance start` is similar to this: 274 275----------------------------------------------------------------------- 276# BEGIN GIT MAINTENANCE SCHEDULE 277# The following schedule was created by Git 278# Any edits made in this region might be 279# replaced in the future by a Git command. 280 2810 1-23 * * * "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=hourly 2820 0 * * 1-6 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=daily 2830 0 * * 0 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=weekly 284 285# END GIT MAINTENANCE SCHEDULE 286----------------------------------------------------------------------- 287 288The comments are used as a region to mark the schedule as written by Git. 289Any modifications within this region will be completely deleted by 290`git maintenance stop` or overwritten by `git maintenance start`. 291 292The `crontab` entry specifies the full path of the `git` executable to 293ensure that the executed `git` command is the same one with which 294`git maintenance start` was issued independent of `PATH`. If the same user 295runs `git maintenance start` with multiple Git executables, then only the 296latest executable is used. 297 298These commands use `git for-each-repo --config=maintenance.repo` to run 299`git maintenance run --schedule=<frequency>` on each repository listed in 300the multi-valued `maintenance.repo` config option. These are typically 301loaded from the user-specific global config. The `git maintenance` process 302then determines which maintenance tasks are configured to run on each 303repository with each `<frequency>` using the `maintenance.<task>.schedule` 304config options. These values are loaded from the global or repository 305config values. 306 307If the config values are insufficient to achieve your desired background 308maintenance schedule, then you can create your own schedule. If you run 309`crontab -e`, then an editor will load with your user-specific `cron` 310schedule. In that editor, you can add your own schedule lines. You could 311start by adapting the default schedule listed earlier, or you could read 312the crontab(5) documentation for advanced scheduling techniques. Please 313do use the full path and `--exec-path` techniques from the default 314schedule to ensure you are executing the correct binaries in your 315schedule. 316 317 318BACKGROUND MAINTENANCE ON LINUX SYSTEMD SYSTEMS 319----------------------------------------------- 320 321While Linux supports `cron`, depending on the distribution, `cron` may 322be an optional package not necessarily installed. On modern Linux 323distributions, systemd timers are superseding it. 324 325If user systemd timers are available, they will be used as a replacement 326of `cron`. 327 328In this case, `git maintenance start` will create user systemd timer units 329and start the timers. The current list of user-scheduled tasks can be found 330by running `systemctl --user list-timers`. The timers written by `git 331maintenance start` are similar to this: 332 333----------------------------------------------------------------------- 334$ systemctl --user list-timers 335NEXT LEFT LAST PASSED UNIT ACTIVATES 336Thu 2021-04-29 19:00:00 CEST 42min left Thu 2021-04-29 18:00:11 CEST 17min ago git-maintenance@hourly.timer git-maintenance@hourly.service 337Fri 2021-04-30 00:00:00 CEST 5h 42min left Thu 2021-04-29 00:00:11 CEST 18h ago git-maintenance@daily.timer git-maintenance@daily.service 338Mon 2021-05-03 00:00:00 CEST 3 days left Mon 2021-04-26 00:00:11 CEST 3 days ago git-maintenance@weekly.timer git-maintenance@weekly.service 339----------------------------------------------------------------------- 340 341One timer is registered for each `--schedule=<frequency>` option. 342 343The definition of the systemd units can be inspected in the following files: 344 345----------------------------------------------------------------------- 346~/.config/systemd/user/git-maintenance@.timer 347~/.config/systemd/user/git-maintenance@.service 348~/.config/systemd/user/timers.target.wants/git-maintenance@hourly.timer 349~/.config/systemd/user/timers.target.wants/git-maintenance@daily.timer 350~/.config/systemd/user/timers.target.wants/git-maintenance@weekly.timer 351----------------------------------------------------------------------- 352 353`git maintenance start` will overwrite these files and start the timer 354again with `systemctl --user`, so any customization should be done by 355creating a drop-in file, i.e. a `.conf` suffixed file in the 356`~/.config/systemd/user/git-maintenance@.service.d` directory. 357 358`git maintenance stop` will stop the user systemd timers and delete 359the above mentioned files. 360 361For more details, see `systemd.timer(5)`. 362 363 364BACKGROUND MAINTENANCE ON MACOS SYSTEMS 365--------------------------------------- 366 367While macOS technically supports `cron`, using `crontab -e` requires 368elevated privileges and the executed process does not have a full user 369context. Without a full user context, Git and its credential helpers 370cannot access stored credentials, so some maintenance tasks are not 371functional. 372 373Instead, `git maintenance start` interacts with the `launchctl` tool, 374which is the recommended way to schedule timed jobs in macOS. Scheduling 375maintenance through `git maintenance (start|stop)` requires some 376`launchctl` features available only in macOS 10.11 or later. 377 378Your user-specific scheduled tasks are stored as XML-formatted `.plist` 379files in `~/Library/LaunchAgents/`. You can see the currently-registered 380tasks using the following command: 381 382----------------------------------------------------------------------- 383$ ls ~/Library/LaunchAgents/org.git-scm.git* 384org.git-scm.git.daily.plist 385org.git-scm.git.hourly.plist 386org.git-scm.git.weekly.plist 387----------------------------------------------------------------------- 388 389One task is registered for each `--schedule=<frequency>` option. To 390inspect how the XML format describes each schedule, open one of these 391`.plist` files in an editor and inspect the `<array>` element following 392the `<key>StartCalendarInterval</key>` element. 393 394`git maintenance start` will overwrite these files and register the 395tasks again with `launchctl`, so any customizations should be done by 396creating your own `.plist` files with distinct names. Similarly, the 397`git maintenance stop` command will unregister the tasks with `launchctl` 398and delete the `.plist` files. 399 400To create more advanced customizations to your background tasks, see 401launchctl.plist(5) for more information. 402 403 404BACKGROUND MAINTENANCE ON WINDOWS SYSTEMS 405----------------------------------------- 406 407Windows does not support `cron` and instead has its own system for 408scheduling background tasks. The `git maintenance start` command uses 409the `schtasks` command to submit tasks to this system. You can inspect 410all background tasks using the Task Scheduler application. The tasks 411added by Git have names of the form `Git Maintenance (<frequency>)`. 412The Task Scheduler GUI has ways to inspect these tasks, but you can also 413export the tasks to XML files and view the details there. 414 415Note that since Git is a console application, these background tasks 416create a console window visible to the current user. This can be changed 417manually by selecting the "Run whether user is logged in or not" option 418in Task Scheduler. This change requires a password input, which is why 419`git maintenance start` does not select it by default. 420 421If you want to customize the background tasks, please rename the tasks 422so future calls to `git maintenance (start|stop)` do not overwrite your 423custom tasks. 424 425CONFIGURATION 426------------- 427 428include::includes/cmd-config-section-all.adoc[] 429 430include::config/maintenance.adoc[] 431 432 433GIT 434--- 435Part of the linkgit:git[1] suite