gc.aggressiveDepth::
	The depth parameter used in the delta compression
	algorithm used by 'git gc --aggressive'.  This defaults
	to 50, which is the default for the `--depth` option when
	`--aggressive` isn't in use.
+
See the documentation for the `--depth` option in
linkgit:git-repack[1] for more details.

gc.aggressiveWindow::
	The window size parameter used in the delta compression
	algorithm used by 'git gc --aggressive'.  This defaults
	to 250, which is a much more aggressive window size than
	the default `--window` of 10.
+
See the documentation for the `--window` option in
linkgit:git-repack[1] for more details.

gc.auto::
	When there are approximately more than this many loose
	objects in the repository, `git gc --auto` will pack them.
	Some Porcelain commands use this command to perform a
	light-weight garbage collection from time to time.  The
	default value is 6700.
+
Setting this to 0 disables not only automatic packing based on the
number of loose objects, but also any other heuristic `git gc --auto` will
otherwise use to determine if there's work to do, such as
`gc.autoPackLimit`.

gc.autoPackLimit::
	When there are more than this many packs that are not
	marked with `*.keep` file in the repository, `git gc
	--auto` consolidates them into one larger pack.  The
	default value is 50.  Setting this to 0 disables it.
	Setting `gc.auto` to 0 will also disable this.
+
See the `gc.bigPackThreshold` configuration variable below. When in
use, it'll affect how the auto pack limit works.

gc.autoDetach::
	Make `git gc --auto` return immediately and run in the background
	if the system supports it. Default is true.

gc.bigPackThreshold::
	If non-zero, all non-cruft packs larger than this limit are kept
	when `git gc` is run. This is very similar to
	`--keep-largest-pack` except that all non-cruft packs that meet
	the threshold are kept, not just the largest pack. Defaults to
	zero. Common unit suffixes of 'k', 'm', or 'g' are supported.
+
Note that if the number of kept packs is more than gc.autoPackLimit,
this configuration variable is ignored, all packs except the base pack
will be repacked. After this the number of packs should go below
gc.autoPackLimit and gc.bigPackThreshold should be respected again.
+
If the amount of memory estimated for `git repack` to run smoothly is
not available and `gc.bigPackThreshold` is not set, the largest pack
will also be excluded (this is the equivalent of running `git gc` with
`--keep-largest-pack`).

gc.writeCommitGraph::
	If true, then gc will rewrite the commit-graph file when
	linkgit:git-gc[1] is run. When using `git gc --auto`
	the commit-graph will be updated if housekeeping is
	required. Default is true. See linkgit:git-commit-graph[1]
	for details.

gc.logExpiry::
	If the file gc.log exists, then `git gc --auto` will print
	its content and exit with status zero instead of running
	unless that file is more than 'gc.logExpiry' old.  Default is
	"1.day".  See `gc.pruneExpire` for more ways to specify its
	value.

gc.packRefs::
	Running `git pack-refs` in a repository renders it
	unclonable by Git versions prior to 1.5.1.2 over dumb
	transports such as HTTP.  This variable determines whether
	'git gc' runs `git pack-refs`. This can be set to `notbare`
	to enable it within all non-bare repos or it can be set to a
	boolean value.  The default is `true`.

gc.cruftPacks::
	Store unreachable objects in a cruft pack (see
	linkgit:git-repack[1]) instead of as loose objects. The default
	is `true`.

gc.maxCruftSize::
	Limit the size of new cruft packs when repacking. When
	specified in addition to `--max-cruft-size`, the command line
	option takes priority. See the `--max-cruft-size` option of
	linkgit:git-repack[1].

gc.pruneExpire::
	When 'git gc' is run, it will call 'prune --expire 2.weeks.ago'
	(and 'repack --cruft --cruft-expiration 2.weeks.ago' if using
	cruft packs via `gc.cruftPacks` or `--cruft`).  Override the
	grace period with this config variable.  The value "now" may be
	used to disable this grace period and always prune unreachable
	objects immediately, or "never" may be used to suppress pruning.
	This feature helps prevent corruption when 'git gc' runs
	concurrently with another process writing to the repository; see
	the "NOTES" section of linkgit:git-gc[1].

gc.worktreePruneExpire::
	When 'git gc' is run, it calls
	'git worktree prune --expire 3.months.ago'.
	This config variable can be used to set a different grace
	period. The value "now" may be used to disable the grace
	period and prune `$GIT_DIR/worktrees` immediately, or "never"
	may be used to suppress pruning.

gc.reflogExpire::
gc.<pattern>.reflogExpire::
	'git reflog expire' removes reflog entries older than
	this time; defaults to 90 days. The value "now" expires all
	entries immediately, and "never" suppresses expiration
	altogether. With "<pattern>" (e.g.
	"refs/stash") in the middle the setting applies only to
	the refs that match the <pattern>.

gc.reflogExpireUnreachable::
gc.<pattern>.reflogExpireUnreachable::
	'git reflog expire' removes reflog entries older than
	this time and are not reachable from the current tip;
	defaults to 30 days. The value "now" expires all entries
	immediately, and "never" suppresses expiration altogether.
	With "<pattern>" (e.g. "refs/stash")
	in the middle, the setting applies only to the refs that
	match the <pattern>.
+
These types of entries are generally created as a result of using `git
commit --amend` or `git rebase` and are the commits prior to the amend
or rebase occurring.  Since these changes are not part of the current
project most users will want to expire them sooner, which is why the
default is more aggressive than `gc.reflogExpire`.

gc.recentObjectsHook::
	When considering whether or not to remove an object (either when
	generating a cruft pack or storing unreachable objects as
	loose), use the shell to execute the specified command(s).
	Interpret their output as object IDs which Git will consider as
	"recent", regardless of their age. By treating their mtimes as
	"now", any objects (and their descendants) mentioned in the
	output will be kept regardless of their true age.
+
Output must contain exactly one hex object ID per line, and nothing
else. Objects which cannot be found in the repository are ignored.
Multiple hooks are supported, but all must exit successfully, else the
operation (either generating a cruft pack or unpacking unreachable
objects) will be halted.

gc.repackFilter::
	When repacking, use the specified filter to move certain
	objects into a separate packfile.  See the
	`--filter=<filter-spec>` option of linkgit:git-repack[1].

gc.repackFilterTo::
	When repacking and using a filter, see `gc.repackFilter`, the
	specified location will be used to create the packfile
	containing the filtered out objects. **WARNING:** The
	specified location should be accessible, using for example the
	Git alternates mechanism, otherwise the repo could be
	considered corrupt by Git as it migh not be able to access the
	objects in that packfile. See the `--filter-to=<dir>` option
	of linkgit:git-repack[1] and the `objects/info/alternates`
	section of linkgit:gitrepository-layout[5].

gc.rerereResolved::
	Records of conflicted merge you resolved earlier are
	kept for this many days when 'git rerere gc' is run.
	You can also use more human-readable "1.month.ago", etc.
	The default is 60 days.  See linkgit:git-rerere[1].

gc.rerereUnresolved::
	Records of conflicted merge you have not resolved are
	kept for this many days when 'git rerere gc' is run.
	You can also use more human-readable "1.month.ago", etc.
	The default is 15 days.  See linkgit:git-rerere[1].
