zit 0.6.6 lets a forge shun and pack bare stores, stacks merges the way
Fossil does, and changes how import-git stores tracked files that are
themselves Fossil artifacts. That last change asks for one full
re-import of affected repositories; see below.
This release is from trunk. Horizon clones and their protocol extensions are not included.
Shun and pack on a bare store
zit shun and zit pack worked only inside a checkout, so a forge,
which holds bare stores, could not purge anything. Both now take -R:
zit shun -R STORE --force [--reason TEXT] [--defer] HASH...
zit shun -R STORE --list
zit pack -R STORE [--drop-elided]
The semantics are those of a checkout: the shun table every sync
direction honours, the rewrite that removes the bytes, the table carried
into clones, the write lock and the refusal while another rewrite runs.
A bare store has no working tree to protect, so it refuses nothing more;
a -R that names a checkout still protects the check-in that checkout
is on. The rewrite swaps in a new store generation exactly as pack
does, so a zit frames --verify cursor taken before it is refused.
zit shun --porcelain prints one line per named hash once the work is
done, ACTION HASH, where ACTION is reclaimed, deferred, recorded
(the store did not hold it) or gone (already shunned and removed).
Stacked merges
zit merge refused to run while another merge was pending. Fossil
allows it, and zit now does too: a merge, --integrate, --cherrypick
or --backout is added after those already pending, and merging the
same check-in twice records it once. With plain merges pending, the
merge base is Fossil's pivot over the current check-in and every pending
merge. The commit records the current check-in and then each merged
check-in in order as P cards, and the Q cards Fossil writes. zit
status lists every pending merge, and zit undo takes back only the
last. A checkout with one pending merge is stored exactly as before; a
checkout with several is refused by older releases rather than read
wrong. A backout of the check-in being committed from no longer writes
a Q card, as Fossil does not.
Git imports of tracked Fossil artifacts
A Git repository that keeps raw Fossil artifacts as files, for instance
as test fixtures, came out of zit import-git with extra check-ins,
technotes and tags: a stored blob that parses as an artifact is one, by
Fossil's rule, and both zit and Fossil crosslinked those files. The
import now stores such a file sterilized, as fossil commit does: it
appends Fossil's line # Remove this line to create a well-formed Fossil
control artifact. after the file's last card. Nothing crosslinks it,
in zit or in a Fossil clone of the result. zit export-git removes
exactly the line the import added, so a Git round trip is
byte-identical.
The files affected gain that one line in a checkout. A repository
imported by an earlier release that holds such files stored them
verbatim, and import-git --into now refuses to add to it, naming a
full re-import as the remedy.
Attributing imports to the Git author
zit import-git --use-author, Fossil's name for it, records each
commit's Git author as the check-in's user instead of the committer; it
is the same as --attribution author. The default stays the committer,
as in fossil import --git, so existing imports keep their names. The
choice is recorded with the import, and --into reuses it when no flag
is given, which it previously refused.
Compatibility
The artifact and repository store formats and the wire protocol are
unchanged. The checkout file gains a form for several pending merges,
which older releases refuse instead of misreading. Import maps written
by earlier releases are read, but an --into import into one is refused
when its fixture files were stored verbatim.
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.