3 .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
4 .\" Generator: DocBook XSL Stylesheets v1.79.2 <http://docbook.sf.net/>
7 .\" Source: Git 2.46.1.603.g94b60adee3
10 .TH "GITPACKING" "7" "2024-09-20" "Git 2\&.46\&.1\&.603\&.g94b60a" "Git Manual"
11 .\" -----------------------------------------------------------------
12 .\" * Define some portability stuff
13 .\" -----------------------------------------------------------------
14 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 .\" http://bugs.debian.org/507673
16 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
17 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 .\" -----------------------------------------------------------------
21 .\" * set default formatting
22 .\" -----------------------------------------------------------------
23 .\" disable hyphenation
25 .\" disable justification (adjust text to left margin only)
27 .\" -----------------------------------------------------------------
28 .\" * MAIN CONTENT STARTS HERE *
29 .\" -----------------------------------------------------------------
31 gitpacking \- Advanced concepts related to packing in Git
37 This document aims to describe some advanced concepts related to packing in Git\&.
39 Many concepts are currently described scattered between manual pages of various Git commands, including \fBgit-pack-objects\fR(1), \fBgit-repack\fR(1), and others, as well as \fBgitformat-pack\fR(5), and parts of the \fBDocumentation/technical\fR tree\&.
41 There are many aspects of packing in Git that are not covered in this document that instead live in the aforementioned areas\&. Over time, those scattered bits may coalesce into this document\&.
42 .SH "PSEUDO\-MERGE BITMAPS"
48 .nr an-no-space-flag 1
56 Pseudo\-merge bitmaps are considered an experimental feature, so the configuration and many of the ideas are subject to change\&.
61 Reachability bitmaps are most efficient when we have on\-disk stored bitmaps for one or more of the starting points of a traversal\&. For this reason, Git prefers storing bitmaps for commits at the tips of refs, because traversals tend to start with those points\&.
63 But if you have a large number of refs, it\(cqs not feasible to store a bitmap for \fIevery\fR ref tip\&. It takes up space, and just OR\-ing all of those bitmaps together is expensive\&.
65 One way we can deal with that is to create bitmaps that represent \fIgroups\fR of refs\&. When a traversal asks about the entire group, then we can use this single bitmap instead of considering each ref individually\&. Because these bitmaps represent the set of objects which would be reachable in a hypothetical merge of all of the commits, we call them pseudo\-merge bitmaps\&.
68 A "pseudo\-merge bitmap" is used to refer to a pair of bitmaps, as follows:
72 A bitmap whose set bits describe the set of commits included in the pseudo\-merge\(cqs "merge" bitmap (as below)\&.
77 A bitmap whose set bits describe the reachability closure over the set of commits in the pseudo\-merge\(cqs "commits" bitmap (as above)\&. An identical bitmap would be generated for an octopus merge with the same set of parents as described in the commits bitmap\&.
80 Pseudo\-merge bitmaps can accelerate bitmap traversals when all commits for a given pseudo\-merge are listed on either side of the traversal, either directly (by explicitly asking for them as part of the \fBHAVES\fR or \fBWANTS\fR) or indirectly (by encountering them during a fill\-in traversal)\&.
83 For example, suppose there exists a pseudo\-merge bitmap with a large number of commits, all of which are listed in the \fBWANTS\fR section of some bitmap traversal query\&. When pseudo\-merge bitmaps are enabled, the bitmap machinery can quickly determine there is a pseudo\-merge which satisfies some subset of the wanted objects on either side of the query\&. Then, we can inflate the EWAH\-compressed bitmap, and \fBOR\fR it in to the resulting bitmap\&. By contrast, without pseudo\-merge bitmaps, we would have to repeat the decompression and \fBOR\fR\-ing step over a potentially large number of individual bitmaps, which can take proportionally more time\&.
85 Another benefit of pseudo\-merges arises when there is some combination of (a) a large number of references, with (b) poor bitmap coverage, and (c) deep, nested trees, making fill\-in traversal relatively expensive\&. For example, suppose that there are a large enough number of tags where bitmapping each of the tags individually is infeasible\&. Without pseudo\-merge bitmaps, computing the result of, say, \fBgit rev\-list \-\-use\-bitmap\-index \-\-count \-\-objects \-\-tags\fR would likely require a large amount of fill\-in traversal\&. But when a large quantity of those tags are stored together in a pseudo\-merge bitmap, the bitmap machinery can take advantage of the fact that we only care about the union of objects reachable from all of those tags, and answer the query much faster\&.
88 Reference tips are grouped into different pseudo\-merge groups according to two criteria\&. A reference name matches one or more of the defined pseudo\-merge patterns, and optionally one or more capture groups within that pattern which further partition the group\&.
90 Within a group, commits may be considered "stable", or "unstable" depending on their age\&. These are adjusted by setting the \fBbitmapPseudoMerge\&.<name>\&.stableThreshold\fR and \fBbitmapPseudoMerge\&.<name>\&.threshold\fR configuration values, respectively\&.
92 All stable commits are grouped into pseudo\-merges of equal size (\fBbitmapPseudoMerge\&.<name>\&.stableSize\fR)\&. If the \fBstableSize\fR configuration is set to, say, 100, then the first 100 commits (ordered by committer date) which are older than the \fBstableThreshold\fR value will form one group, the next 100 commits will form another group, and so on\&.
94 Among unstable commits, the pseudo\-merge machinery will attempt to combine older commits into large groups as opposed to newer commits which will appear in smaller groups\&. This is based on the heuristic that references whose tip commit is older are less likely to be modified to point at a different commit than a reference whose tip commit is newer\&.
96 The size of groups is determined by a power\-law decay function, and the decay parameter roughly corresponds to "k" in \fBf(n) = C*n^(\-k/100)\fR, where \fBf(n)\fR describes the size of the \fBn\fR\-th pseudo\-merge group\&. The sample rate controls what percentage of eligible commits are considered as candidates\&. The threshold parameter indicates the minimum age (so as to avoid including too\-recent commits in a pseudo\-merge group, making it less likely to be valid)\&. The "maxMerges" parameter sets an upper\-bound on the number of pseudo\-merge commits an individual group
98 The "stable"\-related parameters control "stable" pseudo\-merge groups, comprised of a fixed number of commits which are older than the configured "stable threshold" value and may be grouped together in chunks of "stableSize" in order of age\&.
100 The exact configuration for pseudo\-merges is as follows:
106 .nr an-no-space-flag 1
114 The configuration options in \fBbitmapPseudoMerge\&.*\fR 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 \fBgitpacking\fR(7)\&.
118 bitmapPseudoMerge\&.<name>\&.pattern
120 Regular expression used to match reference names\&. Commits pointed to by references matching this pattern (and meeting the below criteria, like
121 \fBbitmapPseudoMerge\&.<name>\&.sampleRate\fR
123 \fBbitmapPseudoMerge\&.<name>\&.threshold\fR) will be considered for inclusion in a pseudo\-merge bitmap\&.
125 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\&.
127 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
131 For example, if the pattern is
132 \fBrefs/tags/\fR, 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
133 \fBrefs/remotes/([0\-9])+/tags/\fR, then tags from different remotes will be grouped into separate pseudo\-merge groups, based on the remote number\&.
136 bitmapPseudoMerge\&.<name>\&.decay
138 Determines the rate at which consecutive pseudo\-merge bitmap groups decrease in size\&. Must be non\-negative\&. This parameter can be thought of as
141 \fBf(n) = C * n^\-k\fR, where
143 is the size of the `n`th group\&.
145 Setting the decay rate equal to
147 will cause all groups to be the same size\&. Setting the decay rate equal to
150 \fBn`th group to be `1/n\fR
151 the size of the initial group\&. Higher values of the decay rate cause consecutive groups to shrink at an increasing rate\&. The default is
154 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\&.
157 bitmapPseudoMerge\&.<name>\&.sampleRate
159 Determines the proportion of non\-bitmapped commits (among reference tips) which are selected for inclusion in an unstable pseudo\-merge bitmap\&. Must be between
163 (inclusive)\&. The default is
167 bitmapPseudoMerge\&.<name>\&.threshold
169 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
170 \fB1\&.week\&.ago\fR\&.
173 bitmapPseudoMerge\&.<name>\&.maxMerges
175 Determines the maximum number of pseudo\-merge commits among which commits may be distributed\&.
177 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\&.
179 For example, if your capture group is
180 \fBrefs/tags/\fR, then this setting will distribute all tags into a maximum of
182 pseudo\-merge commits\&. However, if your capture group is, say,
183 \fBrefs/remotes/([0\-9]+)/tags/\fR, then this setting will be applied to each remote\(cqs set of tags individually\&.
185 Must be non\-negative\&. The default value is 64\&.
188 bitmapPseudoMerge\&.<name>\&.stableThreshold
190 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
191 \fB1\&.month\&.ago\fR\&.
193 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)\&.
196 bitmapPseudoMerge\&.<name>\&.stableSize
198 Determines the size (in number of commits) of a stable psuedo\-merge bitmap\&. The default is
203 Suppose that you have a repository with a large number of references, and you want a bare\-bones configuration of pseudo\-merge bitmaps that will enhance bitmap coverage of the \fBrefs/\fR namespace\&. You may start with a configuration like so:
209 [bitmapPseudoMerge "all"]
212 stableThreshold = never
220 This will create pseudo\-merge bitmaps for all references, regardless of their age, and group them into 64 pseudo\-merge commits\&.
222 If you wanted to separate tags from branches when generating pseudo\-merge commits, you would instead define the pattern with a capture group, like so:
228 [bitmapPseudoMerge "all"]
229 pattern = "refs/(heads/tags)/"
235 Suppose instead that you are working in a fork\-network repository, with each fork specified by some numeric ID, and whose refs reside in \fBrefs/virtual/NNN/\fR (where \fBNNN\fR is the numeric ID corresponding to some fork) in the network\&. In this instance, you may instead write something like:
241 [bitmapPseudoMerge "all"]
242 pattern = "refs/virtual/([0\-9]+)/(heads|tags)/"
244 stableThreshold = never
252 Which would generate pseudo\-merge group identifiers like "1234\-heads", and "5678\-tags" (for branches in fork "1234", and tags in remote "5678", respectively)\&.
255 \fBgit-pack-objects\fR(1) \fBgit-repack\fR(1)
258 Part of the \fBgit\fR(1) suite