@ -775,12 +775,12 @@ directory. This prevents loose references from being stored.
A collection of reftable files are stored in the `$GIT_DIR/reftable/`
directory:
00000001.log
00000001 .ref
00000002 .ref
00000001-00000001 .log
00000002-00000002 .ref
00000003-00000003 .ref
where reftable files are named by a unique name such as produced by
the function `${update_index}.ref` .
the function `${min_update_index}-${max_ update_index}.ref` .
Log-only files use the `.log` extension, while ref-only and mixed ref
and log files use `.ref` . extension.
@ -790,9 +790,9 @@ files, one per line, in order, from oldest (base) to newest (most
recent):
$ cat .git/refs
00000001.log
00000001 .ref
00000002 .ref
00000001-00000001 .log
00000002-00000002 .ref
00000003-00000003 .ref
Readers must read `$GIT_DIR/refs` to determine which files are
relevant right now, and search through the stack in reverse order
@ -819,8 +819,8 @@ new reftable and atomically appending it to the stack:
1. Acquire `refs.lock` .
2. Read `refs` to determine current reftables.
3. Select `update_index` to be most recent file's `max_update_index + 1` .
4. Prepare temp reftable `${update_index} _XXXXXX` , including log entries.
5. Rename `${update_index}_XXXXXX` to ` ${update_index}.ref` .
4. Prepare temp reftable `tmp _XXXXXX` , including log entries.
5. Rename `tmp_XXXXXX` to `${update_index}- ${update_index}.ref` .
6. Copy `refs` to `refs.lock` , appending file from (5).
7. Rename `refs.lock` to `refs` .
@ -865,12 +865,13 @@ is going to compact B and C, leaving A and D alone.
Ownership of these locks prevents other processes from trying
to compact these files.
3. Release `refs.lock` .
4. Compact `B` and `C` into a temp file `${min_update_index}_XXXXXX` .
4. Compact `B` and `C` into a temp file `${min_update_index}-${max_update_index} _XXXXXX` .
5. Reacquire lock `refs.lock` .
6. Verify that `B` and `C` are still in the stack, in that order. This
should always be the case, assuming that other processes are adhering
to the locking protocol.
7. Rename `${min_update_index}_XXXXXX` to `${min_update_index}_2.ref` .
7. Rename `${min_update_index}-${max_update_index}_XXXXXX` to
`${min_update_index}-${max_update_index}.ref` .
8. Write the new stack to `refs.lock` , replacing `B` and `C` with the
file from (4).
9. Rename `refs.lock` to `refs` .
@ -879,6 +880,9 @@ is going to compact B and C, leaving A and D alone.
This strategy permits compactions to proceed independently of updates.
Each reftable (compacted or not) is uniquely identified by its name, so open
reftables can be cached by their name.
## Alternatives considered
### bzip packed-refs