C Releases\swithout\sa\scopy\sin\severy\sclone D 2026-10-02T15:22:30.689 E 2026-10-02T15:22:30 24630a5cb00c5a3dace1139b777021164dbd6440 N text/x-markdown U dmestas W 1570 # Releases without a copy in every clone Fossil keeps a project's downloads as unversioned files: no history, synced with `fossil sync -u`, served from the repository. zit's own releases have been published that way, to a stock Fossil server. The plan was for zit to do what Fossil does: an unversioned table in every repository, synced alongside the history. Halfway into the design it stopped making sense. quarry, zit's forge, keeps a repository's unversioned files in its own storage and answers Fossil's protocol for them itself. A copy in every zit repository would be a second home for the same bytes, and a store format change that older zit could not open, for nothing quarry needs. So 0.3.36 has the client half and no store: ``` zit uv list URL [-l] zit uv pull URL NAME... [-o DIR] zit uv push URL FILE... [--as NAME] zit uv rm URL NAME... ``` Files move between the server and plain files; nothing is written to the repository. It speaks Fossil's protocol, so the server can be quarry or a stock `fossil server`, and the smoke suite checks it against the latter: what `zit uv push` sends is exactly what `fossil uv cat` serves. One thing it does differently from Fossil. A Fossil server keeps whichever copy of a file is newer, and when it keeps its own it says nothing. `zit uv` refuses an older push with a message, and reads the catalog back after every change to confirm the server took it. The same release adds the `main-branch` setting. Fossil never syncs it, so a mirror reports `trunk` until someone sets it, and now zit can say and set it. Z a876a1598ff598a2dc57c2529a28fa06