Changelog
Unreleased
-
oxy logis a graph (#50). Each change takes two lines: its ID (the shortest unique prefix bright), author, time, bookmarks and tags, hash and signature, then its subject. Lanes follow the change each one most directly builds on, and join where two lines of work meet, so independent work shows side by side. A dependency further than twelve rows down is marked~, which keeps the graph to a few lanes even on a long history.--jsonis unchanged. -
A remote's bookmarks work like local ones (#48).
origin/NAMEnames a remote's bookmark wherever a bookmark is expected, andoxy bookmark list --alllists those with no local bookmark.oxy bookmark switch NAMEmakes a local bookmark fromorigin/NAMEwhen there is none (REMOTE/NAMEpicks another remote).oxy pullupdates every local bookmark the remote has too, not only the current one, and names the others it moved.oxy clonechecks out the remote's default bookmark (servers now name it inrefs), says how many other bookmarks the remote has, and takes--recursiveto clone the subrepos. A clone, switch or pull says when subrepos are not at their pins.
-
A newer repository format names the oxy that cannot read it (#49). Instead of "unsupported format version 2", oxy says the data was written by a newer oxy, and gives its own version and path, which shows an older copy earlier on
PATH. -
Sign in once per hub:
oxy auth login,statusandlogout(#47).oxy auth login https://oxygenhub.iosigns in through the browser, and every repository on that hub then clones, fetches and pushes with the token, subrepos included. Nothing secret goes into a checkout any more.- The token is kept in
~/.config/oxy/credentials.toml, readable by you only, or in the system keyring through a Git credential helper (oxy config --user auth.helper libsecret). --with-tokenreads a token from standard input, for CI and scripts.oxy auth logoutalso revokes the token on the hub.- A token goes over
httpsonly (plainhttponly to this machine), never to another host after a redirect. A credentials file that others can read is ignored. - Lookup order:
remote.<name>.token,OXY_TOKEN, the store, then an enclosing checkout's remote on the same hub. Clones no longer copy a token into a subrepo's configuration. - Identity secret keys are now created owner-only, rather than tightened just after being written.
- The token is kept in
Measured on the Linux kernel's tree (95 943 files); docs/benchmarks.md has the tables.
- Faster than Git on the first commit, a clean status, fsck, gc and the pack's size.
- First commit: 21.9 s (Git 33.7 s).
- Clean status: 0.17 to 0.19 s (Git 0.22 s).
- fsck: 8.2 s (Git 12.6 s).
- gc: 33.7 s (Git 70 s).
- The pack: 293.5 MB (Git's 295.5 MB).
- Level with Git on a local clone (about 17 s). Status with one file changed, diff, commit, log, blame and checkout are two to six times faster than at 0.1.0. They are still behind Git:
- Status with one file changed: 0.41 s, against 0.22 s.
- Commit: 0.67 s, against 0.21 s.
- Blame: 0.16 s, against 0.07 s.
- Checkout: 0.74 s, against 0.35 s.
- A project's
.gitignorefiles count, below.oxyignore. A project coming from Git no longer commits its build output, and!in.oxyignorecan bring back what.gitignoreleaves out. Ignore rules still apply to untracked paths only. - A folder holding a repository of its own is named.
oxy status,oxy commitandstatus --json(untracked_nested) name a folder with its own.gitor.oxy, rather than skipping it silently. They say how to track its files, keep it as a subrepo, or leave it out. oxy rebase CHANGE --onto T --into-working-copy. Where a rebase would be conflicted, the target is merged into the current bookmark instead, and the conflict is resolved in the working copy, as afteroxy merge.- mimalloc is the allocator. Most of the speed above came from it: status, walks and index loads allocate many small values from every thread.
- Internals. Each item below is a cache and is rebuilt when it does not check:
- the workspace manifest is a checksummed binary file;
- the state index is decoded lazily, caught up by replaying a few changes, and kept for the last two states;
- the store caches change metadata;
- a pack can carry a trained zstd dictionary.
0.1.0 (2026-09-30)
-
The first builds for people to download.
- Linux x86_64 and arm64 (glibc 2.28 or later) as
.tar.gzand.deb. - macOS x86_64 and arm64.
- Windows x86_64.
All are cross-compiled from Linux with
scripts/dist.sh, with SHA256SUMS. A prerelease: formats may still change before 1.0. - Linux x86_64 and arm64 (glibc 2.28 or later) as