# zit 0.7.4
zit 0.7.4 gives every Git export of a check-in the same commit ID, on
any machine, from either verb. A structural horizon clone under the
`leaves` rule keeps the branch and tags of every check-in it holds when
a side branch it holds is merged. `import-git` holds about 40% less
memory for the same history on Linux.
This release is from trunk. Stores are unchanged from 0.7.3.
## A Git export's commit IDs come from the repository alone
A Git commit ID is a hash over its author and committer lines. 0.7.3
built the email in those lines from a user's contact address when
`zit git export` ran, from the login when `zit export-git` ran, and
from a domain kept in local config or given per run. The same check-in
could get different commit IDs on two machines, from the two verbs, or
after a contact was edited. A rebuilt mirror then looked like a
force-push of the whole history.
Now both verbs write `LOGIN <LOGIN@DOMAIN>`. LOGIN is the check-in's
user, and DOMAIN is the repository's Git email domain, `zit.invalid`
unless `--email-domain` sets another. The domain is synced, so every
clone exports the same commit IDs. A new mirror no longer uses
contacts in the user table.
A mirror keeps the rule it was built with, and its state now records
that rule. A mirror from an earlier release has its rule read back from
its newest commits, contact addresses included, so its commit IDs do
not change. `--email-domain` is refused on a mirror whose commits
already use another domain.
The rule is recorded in the technote "A Git export's commit IDs come
from the repository alone".
## A horizon clone keeps the branches it holds
Under the `leaves` rule, a structural horizon clone holds each open
branch back to where it meets C. When that branch was later merged, it
no longer counted toward the rule, and the origin stopped serving and
labelling it. The clone kept those check-ins, but they lost their
branch and every tag they inherited. `zit leaves`, `zit branch list`
and `zit tag list` showed them wrong. The 0.7.3 notes listed this as a
`zit leaves` listing only; it was wider than that.
A structural clone now states, on every pull, the check-ins it holds
whose parent it does not. The origin serves and labels each of them and
every check-in after it, so what a clone was served stays served.
The first pull after upgrading resends what the clone holds once, and
does so again whenever that set changes. The horizon draft defines the
`horizon-held` pragma in Section 6.1. Section 6.2 no longer claims the
held set only grows, and Appendix C records the change.
## `import-git` holds less
Measured on Linux ARM64 over the first 30,000 commits of the Linux
kernel:
| | 0.7.3 | 0.7.4 |
|---|---|---|
| Memory at the end of the import | 632 MB | 403 MB |
| Peak memory | 1,110 MB | 603 MB |
| Wall time | 29 min | 29 min |
Memory still grows with the length of the history, at about 40% less
per imported object. The tables keyed by Git object name hold binary
names, store digests are packed in fixed blocks, and provenance is
streamed to its file as it is written. On Linux, the import reuses the
memory it frees, which the release build's allocator did not.
The imported store is byte-for-byte what 0.7.3 writes.
## Tested against stock Fossil
The smoke suite now clones a stock Fossil server with a path cone,
commits inside the cone, and pushes. A fresh clone by stock Fossil
then holds the check-in exactly as zit wrote it, with every file
outside the cone intact.
The nightly soak now also runs the horizon sweep alone over 800 more
seeds. The sweep costs seconds a seed where the full simulation costs
minutes. It covers the case above.
## Known limits
`import-git` still holds state for every commit it imports. The whole
Linux kernel history, about 1.5 million commits, needs several
gigabytes. Import a history that long on a machine that has the memory,
and leave sub-manifests on.
## Compatibility
Stores are unchanged from 0.7.3. The Git email domain is stored under a
new config key, which earlier releases skip.
A mirror from an earlier release continues under the rule it was built
with. One whose newest commits match no rule zit has written is
refused rather than continued under a guess. `--rebuild` exports it
again under the new rule, with new commit IDs.
On the wire, a structural clone sends a new `pragma horizon-held`, and
the synced config carries the Git email domain when one is set. An
origin from 0.7.3 or earlier ignores the pragma and serves as it did.
## Qualification
The release manifest records native qualification against the exact tagged
source archive on macOS ARM64, Linux x86-64 and Linux ARM64, using the pinned
Zig 0.17.0 toolchain. Publication is gated on unit and end-to-end tests, Git
differentials, deterministic simulation, seeded fuzzing, and Fossil
interoperability checks on every distributed target.
For the basis of the conformance claim, see
[the 0.1.0 release notes](RELEASE-NOTES-0.1.0.md).