OXYGENHUB
◆ v0.4.0 oxygen / README.md
7.6 KiB · Markdown · last changed README: the OxygenFlow badge 1 month ago renderedsource blame history raw
1
# Oxygen
2
3
Oxygen (`oxy`) is a distributed, commutative version control system written in Rust for large repositories. See [docs/spec.md]docs/spec.md for the specification, [docs/guide.md]docs/guide.md for a user guide by task, and [docs/protocol.md]docs/protocol.md if you are implementing a client or server.
4
5
It is self-hosting: this directory is an Oxygen repository, and the project's own history is kept with `oxy`, not with Git.
6
7
## What is different
8
9
- **History is a set of changes, not a chain of snapshots.** A change records what it did to identified lines and tree nodes and which earlier changes it depends on. Changes that do not depend on each other commute, so there are no merge commits and rebasing independent work rewrites nothing.
10
- **Conflicts are data.** A conflicted state can be committed, pushed and pulled. Resolving one is an ordinary edit followed by a commit.
11
- **Every change has a stable ID and a content hash.** The ID survives rewrites; the hash makes history tamper-evident.
12
- **Everything is signed.** Composite Ed25519 + ML-DSA-65 signatures on changes and on every bookmark update, verified against a trust policy that lives in the repository.
13
- **Every operation is undoable** through an operation log.
14
- **Large files are chunked** with content-defined chunking into a BLAKE3-addressed store.
15
16
## Builds
17
18
[![OxygenFlow]https://oxygenhub.io/andymccall/oxygen/flow/badge.svg]https://oxygenhub.io/andymccall/oxygen/flow
19
20
Every push is built and tested by OxygenFlow. See the project's runs at [https://oxygenhub.io/andymccall/oxygen/flow]https://oxygenhub.io/andymccall/oxygen/flow.
21
22
## Status
23
24
Early, but usable for its own development. Implemented: the object model, the change graph with conflict detection and resolution, the working copy (`status`, `commit`, `checkout`, `diff`, `undo`), identities and signatures, remotes over local paths and HTTP(S) with `clone`, `fetch`, `pull`, `push`, the reference server `oxy serve`, the trust policy, and packed storage.
25
26
Not yet: checkpoints for very long histories, history editing (`rebase`, `split`, `edit`), multiple workspaces, garbage collection with retention, and the Thin client profile for constrained machines.
27
28
## Install
29
30
Builds for Linux, macOS and Windows are on the [releases page]https://oxygenhub.io/andymccall/oxygen/releases. These are early releases: the macOS and Windows builds are not signed and have had little testing.
31
32
- **Debian, Ubuntu and other Linux with apt** (x86_64, arm64 or riscv64): add the repository at https://oxygenhub.io/apt and install with apt, so `apt upgrade` keeps oxy current:
33
34
  ```sh
35
  sudo curl -fsSLo /usr/share/keyrings/oxygenhub-archive-keyring.gpg https://oxygenhub.io/apt/oxygenhub.gpg
36
  sudo tee /etc/apt/sources.list.d/oxygenhub.sources >/dev/null <<EOF
37
  Types: deb
38
  URIs: https://oxygenhub.io/apt
39
  Suites: stable
40
  Components: main
41
  Signed-By: /usr/share/keyrings/oxygenhub-archive-keyring.gpg
42
  EOF
43
  sudo apt update && sudo apt install oxy
44
  ```
45
46
  Or download `oxy_VERSION_amd64.deb` (or `_arm64`, `_riscv64`) from a release and run `sudo apt install ./oxy_VERSION_amd64.deb`: from 0.3.1 it adds the repository by itself. It needs glibc 2.28 or later (Debian 10, Ubuntu 20.04 and newer). The repository's key is `82DD DD14 8BC9 0BDF 6006 09E9 522E 288F 265B DE6F`.
47
- **Other Linux:** unpack `oxy-VERSION-linux-x86_64.tar.gz` (or `-linux-arm64`) and put `oxy` on your `PATH`.
48
- **macOS** (Apple Silicon or Intel): unpack `oxy-VERSION-macos-arm64.tar.gz` (or `-macos-x86_64`), then `xattr -d com.apple.quarantine oxy`, since the build is not notarised, and put it on your `PATH`.
49
- **Windows:** unzip `oxy-VERSION-windows-x86_64.zip` and put the folder on your `PATH`. SmartScreen may warn on first run, since the build is not signed.
50
51
`oh`, the OxygenHub command line, is released the same way from [OxygenHub's releases]https://oxygenhub.io/andymccall/oxygenhub/releases.
52
53
Check a download against the release's `SHA256SUMS` with `sha256sum -c SHA256SUMS --ignore-missing`.
54
55
## Building
56
57
```
58
cargo build --release
59
cargo test --workspace
60
```
61
62
The binary is `target/release/oxy`.
63
64
## Quick start
65
66
```
67
oxy identity create --name "Your Name" --email [email protected]
68
oxy config --user core.sign change      # sign every commit
69
oxy init                                 # in a project directory
70
oxy status
71
oxy commit -m "First change"
72
oxy log                                  # -n 10 for the latest ten, -v for full messages
73
oxy log -r 'v0.3.1..main & author(me)'   # a revset: set algebra over history
74
```
75
76
Output uses colour, glyphs, and relative times on a UTF-8 terminal, and
77
falls back to plain ASCII when piped, with `--plain`, or with `NO_COLOR` set.
78
79
Collaborating through a hub such as OxygenHub: sign in once, in the
80
browser, and every repository on that hub clones, fetches and pushes with it.
81
82
```
83
oxy auth login https://oxygenhub.io
84
oxy clone https://oxygenhub.io/owner/project
85
oxy push
86
oxy pull
87
```
88
89
Or with your own server:
90
91
```
92
oxy serve --root /srv/oxy --bind 0.0.0.0:8890 --tls-cert cert.pem --tls-key key.pem --token SECRET
93
echo SECRET | oxy auth login https://host:8890 --with-token
94
oxy clone https://host:8890/project
95
```
96
97
A repository kept on your own storage, with no server in between (Oxygen
98
Strata, see `docs/strata.md`): a bucket in your cloud account, in your
99
region, under your keys, or a directory on a shared drive.
100
101
```
102
oxy remote add cloud s3://my-bucket/repos/project --profile work   # or gs://, az://, dir://
103
oxy remote check cloud                   # reachable, what it holds, and that it behaves
104
oxy push cloud
105
oxy clone s3://my-bucket/repos/project?profile=work
106
```
107
108
Trust policy, so a server accepts only changes from keys you have granted:
109
110
```
111
oxy policy init                          # your key becomes the root
112
oxy identity export                      # a contributor sends you this file
113
oxy policy grant alice.identity
114
oxy push                                 # publishes the policy
115
```
116
117
Bookmarks (`oxy bookmark create|switch`, `oxy merge`), submodules (`oxy submodule add|update`),
118
partial commits (`oxy commit PATH..`, `oxy commit -i`), `oxy blame`, `oxy bisect`, `oxy squash` and
119
`oxy rebase` cover the everyday Git toolbox; see the guide.
120
121
Working alongside Git: `oxy git import <repo> <dest>` converts a Git history, `oxy git fetch <url>`
122
brings new commits of a Git remote into the bookmark, `oxy git push <url>` publishes the bookmark as
123
commits on top of them, and `oxy git export <dir>` writes a plain Git mirror.
124
125
Keys have a lifecycle: `oxy identity rotate` moves to a fresh key pair (the policy follows),
126
`oxy identity renew --expires 365` sets an expiry, `oxy identity delegate add agent.identity --scope changes --expires 8h`
127
lets another key sign changes for you (an AI agent, say) for a while without ever being able
128
to move a bookmark, and `oxy identity revoke` retires a key. With several root
129
keys, `oxy policy root add|remove|threshold` and `oxy policy sign` gather the required signatures
130
through proposal files.
131
132
## Layout
133
134
| Path | Contents |
135
|---|---|
136
| `crates/oxy-core` | Library: encoding, hashing, objects, the change graph, storage, identities, policy, protocol, repository operations |
137
| `crates/oxy-server` | Reference HTTP(S) server for the wire protocol |
138
| `crates/oxy-strata` | The S3, Google Cloud Storage and Azure stores a repository can be kept on |
139
| `src/cli` | The `oxy` command-line interface |
140
| `docs/spec.md` | The specification |
141
| `docs/guide.md` | User guide, organised by task |
142
| `docs/strata.md` | Keeping a repository on your own storage: S3, GCS, Azure, a directory |
143
| `docs/protocol.md` | Wire protocol for other implementers |
144
| `docs/prompt.md` | Shell prompt integration |
145
146
## Licence
147
148
MIT or Apache-2.0, at your option (see `LICENSE`).