39
Values 1-4 satisfy the requirements of parse_commit_gently().
40
41
There are two definitions of generation number:
42
+
43
1. Corrected committer dates (generation number v2)
44
2. Topological levels (generation number v1)
45
159
we enable fast writes of new commit data without rewriting the entire commit
160
history -- at least, most of the time.
161
161
-## File Layout
162
+File Layout
163
+~~~~~~~~~~~
164
165
A commit-graph chain uses multiple files, and we use a fixed naming convention
166
to organize these files. Each commit-graph file has a name
172
173
For example, if the `commit-graph-chain` file contains the lines
174
173
-```
175
+----
176
{hash0}
177
{hash1}
178
{hash2}
177
-```
179
+----
180
181
then the commit-graph chain looks like the following diagram:
182
215
`graph-{hash1}.graph` contains `{hash0}` while `graph-{hash2}.graph` contains
216
`{hash0}` and `{hash1}`.
217
216
-## Merging commit-graph files
218
+Merging commit-graph files
219
+~~~~~~~~~~~~~~~~~~~~~~~~~~
220
221
If we only added a new commit-graph file on every write, we would run into a
222
linear search problem through many commit-graph files. Instead, we use a merge
228
the commits in `graph-{hash1}` should be combined into a new `graph-{hash3}`
229
file.
230
231
+....
232
+---------------------+
233
| |
234
| (new commits) |
254
| |
255
| |
256
+-----------------------+
257
+....
258
259
During this process, the commits to write are combined, sorted and we write the
260
contents to a temporary file, all while holding a `commit-graph-chain.lock`
262
according to the computed `{hash3}`. Finally, we write the new chain data to
263
`commit-graph-chain.lock`:
264
260
-```
265
+----
266
{hash3}
267
{hash0}
263
-```
268
+----
269
270
We then close the lock-file.
271
267
-## Merge Strategy
272
+Merge Strategy
273
+~~~~~~~~~~~~~~
274
275
When writing a set of commits that do not exist in the commit-graph stack of
276
height N, we default to creating a new file at level N + 1. We then decide to
295
number of commits) could be extracted into config settings for full
296
flexibility.
297
292
-## Handling Mixed Generation Number Chains
298
+Handling Mixed Generation Number Chains
299
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
300
301
With the introduction of generation number v2 and generation data chunk, the
302
following scenario is possible:
325
rewriting split commit-graph as a single file (`--split=replace`) creates a
326
single layer with corrected commit dates.
327
321
-## Deleting graph-{hash} files
328
+Deleting graph-\{hash\} files
329
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
330
331
After a new tip file is written, some `graph-{hash}` files may no longer
332
be part of a chain. It is important to remove these files from disk, eventually.
341
defaults to zero, but can be changed using command-line arguments or a config
342
setting.
343
336
-## Chains across multiple object directories
344
+Chains across multiple object directories
345
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
346
347
In a repo with alternates, we look for the `commit-graph-chain` file starting
348
in the local object directory and then in each alternate. The first file that