NOTE: The configuration options in `bitmapPseudoMerge.*` are considered
EXPERIMENTAL and may be subject to change or be removed entirely in the
future. For more information about the pseudo-merge bitmap feature, see
the "Pseudo-merge bitmaps" section of linkgit:gitpacking[7].

bitmapPseudoMerge.<name>.pattern::
	Regular expression used to match reference names. Commits
	pointed to by references matching this pattern (and meeting
	the below criteria, like `bitmapPseudoMerge.<name>.sampleRate`
	and `bitmapPseudoMerge.<name>.threshold`) will be considered
	for inclusion in a pseudo-merge bitmap.
+
Commits are grouped into pseudo-merge groups based on whether or not
any reference(s) that point at a given commit match the pattern, which
is an extended regular expression.
+
Within a pseudo-merge group, commits may be further grouped into
sub-groups based on the capture groups in the pattern. These
sub-groupings are formed from the regular expressions by concatenating
any capture groups from the regular expression, with a '-' dash in
between.
+
For example, if the pattern is `refs/tags/`, then all tags (provided
they meet the below criteria) will be considered candidates for the
same pseudo-merge group. However, if the pattern is instead
`refs/remotes/([0-9])+/tags/`, then tags from different remotes will
be grouped into separate pseudo-merge groups, based on the remote
number.

bitmapPseudoMerge.<name>.decay::
	Determines the rate at which consecutive pseudo-merge bitmap
	groups decrease in size. Must be non-negative. This parameter
	can be thought of as `k` in the function `f(n) = C * n^-k`,
	where `f(n)` is the size of the `n`th group.
+
Setting the decay rate equal to `0` will cause all groups to be the
same size. Setting the decay rate equal to `1` will cause the `n`th
group to be `1/n` the size of the initial group.  Higher values of the
decay rate cause consecutive groups to shrink at an increasing rate.
The default is `1`.
+
If all groups are the same size, it is possible that groups containing
newer commits will be able to be used less often than earlier groups,
since it is more likely that the references pointing at newer commits
will be updated more often than a reference pointing at an old commit.

bitmapPseudoMerge.<name>.sampleRate::
	Determines the proportion of non-bitmapped commits (among
	reference tips) which are selected for inclusion in an
	unstable pseudo-merge bitmap. Must be between `0` and `1`
	(inclusive). The default is `1`.

bitmapPseudoMerge.<name>.threshold::
	Determines the minimum age of non-bitmapped commits (among
	reference tips, as above) which are candidates for inclusion
	in an unstable pseudo-merge bitmap. The default is
	`1.week.ago`.

bitmapPseudoMerge.<name>.maxMerges::
	Determines the maximum number of pseudo-merge commits among
	which commits may be distributed.
+
For pseudo-merge groups whose pattern does not contain any capture
groups, this setting is applied for all commits matching the regular
expression. For patterns that have one or more capture groups, this
setting is applied for each distinct capture group.
+
For example, if your capture group is `refs/tags/`, then this setting
will distribute all tags into a maximum of `maxMerges` pseudo-merge
commits. However, if your capture group is, say,
`refs/remotes/([0-9]+)/tags/`, then this setting will be applied to
each remote's set of tags individually.
+
Must be non-negative. The default value is 64.

bitmapPseudoMerge.<name>.stableThreshold::
	Determines the minimum age of commits (among reference tips,
	as above, however stable commits are still considered
	candidates even when they have been covered by a bitmap) which
	are candidates for a stable a pseudo-merge bitmap. The default
	is `1.month.ago`.
+
Setting this threshold to a smaller value (e.g., 1.week.ago) will cause
more stable groups to be generated (which impose a one-time generation
cost) but those groups will likely become stale over time. Using a
larger value incurs the opposite penalty (fewer stable groups which are
more useful).

bitmapPseudoMerge.<name>.stableSize::
	Determines the size (in number of commits) of a stable
	psuedo-merge bitmap. The default is `512`.
