Skip to main content

VersionDrift

Find every out-of-sync Git repo on your machine, without touching your work.

VersionDrift is a safety-first Git checkup for developers with more repositories than they can keep track of. It scans only the local directories you provide, separates safe fast-forwards from local work that must be protected, and records every decision locally.

$ version-drift scan ~/code --fetch
VersionDrift scanned 17 repositories under ~/code

  ✓ 10  in sync
  ↓  3  safe to update
  !  2  local work protected
  ↑  1  ahead of upstream
  ↕  1  diverged

Safe to update
  docs                             2 commits behind
  website                          4 commits behind

Protected. VersionDrift will not touch these
  client-api                       dirty_worktree
  prototype                        diverged_from_upstream

Working files changed: 0
Remote data: refreshed now

The example above illustrates the output format. It is not an adoption claim or benchmark.

Install

Until the first PyPI release is live, install the versioned GitHub Release wheel:

pipx install https://github.com/seojoonkim/version-drift/releases/download/v0.2.0/version_drift-0.2.0-py3-none-any.whl

After PyPI publication, the canonical commands will be:

uv tool install version-drift
# or
pipx install version-drift

For development:

git clone https://github.com/seojoonkim/version-drift.git
cd version-drift
python -m pip install -e .

Run your first Git checkup

version-drift scan ~/code --fetch

scan never modifies working files, the index, local commits, or branches. Without --fetch, it compares against local remote-tracking refs. With --fetch, it first runs a non-destructive fetch so the comparison is current.

Why VersionDrift?

A loop that runs git pull everywhere can stop on dirty work, create conflicts, or conceal work behind an automatic stash. VersionDrift takes the opposite approach:

  1. Discover repositories only inside roots you provide.
  2. Classify every repository before taking action.
  3. Protect anything dirty, ahead, diverged, ambiguous, or missing an upstream.
  4. Fast-forward only repositories proven safe at execution time.
  5. Record every decision locally as JSONL.

Safety contract

VersionDrift will never automatically:

  • reset your working tree
  • stash or drop changes
  • clean untracked files
  • merge or rebase branches
  • force-pull or force-push
  • guess a missing upstream

sync --apply is allowed only when a repository is clean, tracks an upstream, and is behind-only. VersionDrift checks the state again immediately before running exactly git pull --ff-only; if the snapshot changed, it aborts.

Commands

Scan one or more roots

version-drift scan ~/code ~/work
  • --fetch: refresh remote-tracking refs first
  • --json: emit machine-readable output
  • --check: return exit code 1 when drift exists
  • --max-depth N: bound discovery depth

Set repeatable default roots with your platform path separator:

export VERSION_DRIFT_ROOTS="$HOME/code:$HOME/work"
version-drift scan

Inspect one repository

version-drift inspect ~/code/project --fetch --json

Preview safe synchronization

version-drift sync ~/code

Apply safe fast-forwards

version-drift sync ~/code --apply

Repositories with local work or ambiguous history remain untouched.

JSON and local decision events

Every scan and sync decision is appended to:

.version-drift/events.jsonl

The current schema is version-drift/1. Choose another state root with --base-dir or VERSION_DRIFT_DIR.

VersionDrift sends no telemetry and never uploads repository paths, remotes, or results.

VersionDrift, Gita, and myrepos

Gita and myrepos are strong choices for broad multi-repository management or arbitrary commands. VersionDrift is deliberately narrower: fail-closed diagnosis plus clean fast-forward-only reconciliation.

Choose VersionDrift when you want a read-only first run, a fixed non-destructive policy, apply-time revalidation, machine-readable decisions, and a local audit trail.

MemKraft integration

MemKraft can optionally use the standalone version_drift engine. VersionDrift remains independently installable and owns the version-drift command.

Contributing

Bug reports and focused pull requests are welcome. Safety invariants are part of the public API and cannot be weakened for convenience. See CONTRIBUTING.md.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

version_drift-0.2.0.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

version_drift-0.2.0-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file version_drift-0.2.0.tar.gz.

File metadata

  • Download URL: version_drift-0.2.0.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for version_drift-0.2.0.tar.gz
Algorithm Hash digest
SHA256 548070a150080eecfe4f918674d1c7846c2135ffa5f770c41e2bdf08e32a77cf
MD5 38b57b86669dd29cb86699a4b2fc0da0
BLAKE2b-256 09baeac4bb60e28562f1b433eaa00f7fdd488971e92abd7dc687bd355bc73413

See more details on using hashes here.

Provenance

The following attestation bundles were made for version_drift-0.2.0.tar.gz:

Publisher: release.yml on seojoonkim/version-drift

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file version_drift-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: version_drift-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for version_drift-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0777b499b502f120d80d1f7f006da872a78a5e8135036600ac1a92b6ab415988
MD5 a4c7b1f188bed49ac23c7756975da8cc
BLAKE2b-256 8c68741b28999ec50fd3962bb3e35dddf146f8a86e9237b0958b2bea674235b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for version_drift-0.2.0-py3-none-any.whl:

Publisher: release.yml on seojoonkim/version-drift

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.1.1

2 files

1.1.0

2 files

1.0.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.1

2 files

This release

0.2.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page