dset — version control for datasets
Commit, diff, and roll back millions of files the way you already do with code — and see what actually changed: samples, classes, label distributions. Not bytes.
Pure Python, zero dependencies, single file.
Install
pip install .
(from this folder — or just run python dset/cli.py ... directly)
Quick start
cd my-dataset
dset init
dset add images/ labels.csv
dset commit "June survey, initial labels"
# ... collect more data, fix labels ...
dset add .
dset commit "July imagery + relabeling pass"
dset diff v1 v2
Output:
comparing v1 → v2 (301 → 406 files)
files +120 −15 ~1 modified
images +120 −15
labels ~1 modified
size 1.5 MB → 2.1 MB (+568.2 KB)
class acacia 19.7% → 38.8% (+19.1%)
class shrub 43.7% → 33.3% (−10.3%)
class bare 36.7% → 27.9% (−8.8%)
Go back to any version, exactly:
dset checkout v1
Commands
| command | what it does |
|---|---|
dset init |
start tracking the current directory |
dset add <paths> |
stage files or folders (incremental — unchanged files are skipped) |
dset status |
staged / modified / deleted / untracked files |
dset commit "msg" |
snapshot as a new version (v1, v2, ...) with dataset stats |
dset log |
list versions with file counts and sizes |
dset diff <a> <b> |
semantic diff: file counts by type, size, class distribution shift |
dset checkout <ref> |
restore the working tree to a version (--force to discard changes) |
Refs can be a tag (v3), HEAD, or a commit-id prefix.
How it works
- Content-addressed storage. Every file is hashed (SHA-256) and stored
once under
.dset/objects/, like git. A new version costs only what changed; re-adding identical data costs nothing. - Commits are manifests — JSON maps of path → hash. Checkout rebuilds the working tree from objects, restoring and deleting as needed.
- Semantic stats are computed at commit time (file counts by type, total
size, class distribution parsed from CSV/TSV label files with a
label/class/category/targetcolumn), sodset diffis instant even on huge datasets. - Safe by construction. Objects are copied (never hard-linked), written atomically, and stored read-only, so editing a working file can never corrupt history. On btrfs/XFS the copy is a free copy-on-write clone.
- Uncommitted changes block
dset checkoutunless you pass--force.
Current limits (MVP)
- Class stats read CSV/TSV label files only (COCO/YOLO parsers are next).
- No remote yet —
dset push/dset pullto a self-hosted server is the next milestone. - No
.dsetignoreyet; hidden files and dot-directories are always skipped.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dset_cli-0.1.0.tar.gz.
File metadata
- Download URL: dset_cli-0.1.0.tar.gz
- Upload date:
- Size: 9.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
007c140e0cb9e594fc21321ea336ae476a7957b76a9e4fc97ca4aff55e7ab2f6
|
|
| MD5 |
db6009bc03bc7f071e644227be480e35
|
|
| BLAKE2b-256 |
0a8b79a943c2f49b25c61690a31687a6448f59e1b213044337408ff780c369f4
|
File details
Details for the file dset_cli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: dset_cli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9cd4dba776142e96b2f17102d22de0b046cbf074523e507cf9f71e9830c330f
|
|
| MD5 |
8aa41914e5de570261ebc860386f659b
|
|
| BLAKE2b-256 |
fa7b4427411e0194dce66bb2b4302a7d8ab696d056f19ef21837e1d4e4492459
|