]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/git-gc.txt
gc: handle a corner case in gc.bigPackThreshold
[thirdparty/git.git] / Documentation / git-gc.txt
CommitLineData
30f610b7
SP
1git-gc(1)
2=========
3
4NAME
5----
6git-gc - Cleanup unnecessary files and optimize the local repository
7
8
9SYNOPSIS
10--------
7791a1d9 11[verse]
ae4e89e5 12'git gc' [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune] [--force] [--keep-largest-pack]
30f610b7
SP
13
14DESCRIPTION
15-----------
16Runs a number of housekeeping tasks within the current repository,
17such as compressing file revisions (to reduce disk space and increase
b586a96a
NTND
18performance), removing unreachable objects which may have been
19created from prior invocations of 'git add', packing refs, pruning
20reflog, rerere metadata or stale working trees.
30f610b7
SP
21
22Users are encouraged to run this task on a regular basis within
23each repository to maintain good disk space utilization and good
05f30452
NP
24operating performance.
25
0b444cdb 26Some git commands may automatically run 'git gc'; see the `--auto` flag
05f30452
NP
27below for details. If you know what you're doing and all you want is to
28disable this behavior permanently without further considerations, just do:
29
30----------------------
31$ git config --global gc.auto 0
32----------------------
30f610b7 33
e3ff4b24
JH
34OPTIONS
35-------
36
0d7566a5 37--aggressive::
0b444cdb 38 Usually 'git gc' runs very quickly while providing good disk
5049012f 39 space utilization and performance. This option will cause
0b444cdb 40 'git gc' to more aggressively optimize the repository at the expense
0d7566a5 41 of taking much more time. The effects of this optimization are
5049012f 42 persistent, so this option only needs to be used occasionally; every
0d7566a5 43 few hundred changesets or so.
e9831e83
JH
44
45--auto::
0b444cdb 46 With this option, 'git gc' checks whether any housekeeping is
d7e56dbc
JK
47 required; if not, it exits without performing any work.
48 Some git commands run `git gc --auto` after performing
b586a96a
NTND
49 operations that could create many loose objects. Housekeeping
50 is required if there are too many loose objects or too many
51 packs in the repository.
d7e56dbc 52+
b586a96a
NTND
53If the number of loose objects exceeds the value of the `gc.auto`
54configuration variable, then all loose objects are combined into a
55single pack using `git repack -d -l`. Setting the value of `gc.auto`
56to 0 disables automatic packing of loose objects.
d7e56dbc 57+
da0005b8 58If the number of packs exceeds the value of `gc.autoPackLimit`,
55dfe13d
NTND
59then existing packs (except those marked with a `.keep` file
60or over `gc.bigPackThreshold` limit)
d7e56dbc 61are consolidated into a single pack by using the `-A` option of
da0005b8 62'git repack'. Setting `gc.autoPackLimit` to 0 disables
d7e56dbc 63automatic consolidation of packs.
b586a96a
NTND
64+
65If houskeeping is required due to many loose objects or packs, all
66other housekeeping tasks (e.g. rerere, working trees, reflog...) will
67be performed as well.
68
e3ff4b24 69
58e9d9d4
JS
70--prune=<date>::
71 Prune loose objects older than date (default is 2 weeks ago,
61929404 72 overridable by the config variable `gc.pruneExpire`).
f1350d0c
MM
73 --prune=all prunes loose objects regardless of their age and
74 increases the risk of corruption if another process is writing to
75 the repository concurrently; see "NOTES" below. --prune is on by
76 default.
58e9d9d4
JS
77
78--no-prune::
79 Do not prune any loose objects.
80
a0c14cbb
FL
81--quiet::
82 Suppress all progress reports.
83
64a99eb4
NTND
84--force::
85 Force `git gc` to run even if there may be another `git gc`
86 instance running on this repository.
87
ae4e89e5
NTND
88--keep-largest-pack::
89 All packs except the largest pack and those marked with a
55dfe13d
NTND
90 `.keep` files are consolidated into a single pack. When this
91 option is used, `gc.bigPackThreshold` is ignored.
ae4e89e5 92
30f610b7
SP
93Configuration
94-------------
95
ae9f6311 96The optional configuration variable `gc.reflogExpire` can be
30f610b7
SP
97set to indicate how long historical entries within each branch's
98reflog should remain available in this repository. The setting is
99expressed as a length of time, for example '90 days' or '3 months'.
100It defaults to '90 days'.
101
ae9f6311 102The optional configuration variable `gc.reflogExpireUnreachable`
30f610b7
SP
103can be set to indicate how long historical reflog entries which
104are not part of the current branch should remain available in
105this repository. These types of entries are generally created as
6cf378f0 106a result of using `git commit --amend` or `git rebase` and are the
23bfbb81 107commits prior to the amend or rebase occurring. Since these changes
30f610b7
SP
108are not part of the current project most users will want to expire
109them sooner. This option defaults to '30 days'.
110
eb523a8d 111The above two configuration variables can be given to a pattern. For
60109d0e 112example, this sets non-default expiry values only to remote-tracking
eb523a8d
JH
113branches:
114
115------------
116[gc "refs/remotes/*"]
117 reflogExpire = never
da0005b8 118 reflogExpireUnreachable = 3 days
eb523a8d
JH
119------------
120
ae9f6311 121The optional configuration variable `gc.rerereResolved` indicates
30f610b7
SP
122how long records of conflicted merge you resolved earlier are
123kept. This defaults to 60 days.
124
ae9f6311 125The optional configuration variable `gc.rerereUnresolved` indicates
30f610b7
SP
126how long records of conflicted merge you have not resolved are
127kept. This defaults to 15 days.
128
ae9f6311 129The optional configuration variable `gc.packRefs` determines if
4be0c352 130'git gc' runs 'git pack-refs'. This can be set to "notbare" to enable
fe2128a8
FLR
131it within all non-bare repos or it can be set to a boolean value.
132This defaults to true.
30f610b7 133
ae9f6311 134The optional configuration variable `gc.aggressiveWindow` controls how
0d7566a5
TT
135much time is spent optimizing the delta compression of the objects in
136the repository when the --aggressive option is specified. The larger
137the value, the more time is spent optimizing the delta compression. See
5162e697 138the documentation for the --window' option in linkgit:git-repack[1] for
c9486ae8 139more details. This defaults to 250.
125f8146 140
ae9f6311 141Similarly, the optional configuration variable `gc.aggressiveDepth`
7e823880 142controls --depth option in linkgit:git-repack[1]. This defaults to 50.
0d7566a5 143
ae9f6311 144The optional configuration variable `gc.pruneExpire` controls how old
25ee9731
JS
145the unreferenced loose objects have to be before they are pruned. The
146default is "2 weeks ago".
147
b586a96a
NTND
148Optional configuration variable `gc.worktreePruneExpire` controls how
149old a stale working tree should be before `git worktree prune` deletes
150it. Default is "3 months ago".
151
3ffb58be
JK
152
153Notes
154-----
155
f1350d0c
MM
156'git gc' tries very hard not to delete objects that are referenced
157anywhere in your repository. In
3ffb58be 158particular, it will keep not only objects referenced by your current set
60109d0e
MM
159of branches and tags, but also objects referenced by the index,
160remote-tracking branches, refs saved by 'git filter-branch' in
3ed0b11e 161refs/original/, or reflogs (which may reference commits in branches
3ffb58be 162that were later amended or rewound).
f1350d0c 163If you are expecting some objects to be deleted and they aren't, check
3ffb58be
JK
164all of those locations and decide whether it makes sense in your case to
165remove those references.
166
f1350d0c
MM
167On the other hand, when 'git gc' runs concurrently with another process,
168there is a risk of it deleting an object that the other process is using
169but hasn't created a reference to. This may just cause the other process
170to fail or may corrupt the repository if the other process later adds a
171reference to the deleted object. Git has two features that significantly
172mitigate this problem:
173
174. Any object with modification time newer than the `--prune` date is kept,
175 along with everything reachable from it.
176
177. Most operations that add an object to the database update the
178 modification time of the object if it is already present so that #1
179 applies.
180
181However, these features fall short of a complete solution, so users who
182run commands concurrently have to live with some risk of corruption (which
183seems to be low in practice) unless they turn off automatic garbage
184collection with 'git config gc.auto 0'.
185
66bd8ab8
CP
186HOOKS
187-----
188
189The 'git gc --auto' command will run the 'pre-auto-gc' hook. See
190linkgit:githooks[5] for more information.
191
192
56ae8df5 193SEE ALSO
30f610b7 194--------
5162e697
DM
195linkgit:git-prune[1]
196linkgit:git-reflog[1]
197linkgit:git-repack[1]
198linkgit:git-rerere[1]
30f610b7 199
30f610b7
SP
200GIT
201---
9e1f0a85 202Part of the linkgit:git[1] suite