Keep using GitHub while you evaluate

The bidirectional bridge, its namespaces, and what it refuses to do.

Written By Dustin

Last updated 27 minutes ago

You do not have to choose on day one. The bridge keeps a TOVIO repository in step with a GitHub, GitLab, Gitea, or bare Git remote.

tovio git bridge <remote> --bidirectional

--bidirectional is required. There is no one-way bridge mode: without the flag the command refuses and tells you so. The flag is an explicit consent gate, not a mode switch, because the bridge writes to your Git remote.

The namespaces are the whole design

Git and TOVIO stay independent authorities, so neither side's branch names are ever overwritten by the other. The bridge exchanges through two reserved namespaces:

DirectionLands as
Git refs/heads/<X> into TOVIOgit/<remote-id>/<X>
TOVIO lane <X> out to Gitrefs/heads/tovio/<X>

Nothing is force-pushed and neither native namespace is touched. You merge between the namespaces with your ordinary review and land workflow, which means every crossing is a decision someone made rather than something the tool did overnight.

Re-running is idempotent: content addressing deduplicates the imports, and the deterministic export is a fast-forward on the Git side.

Keeping it running

tovio git bridge <remote> --bidirectional --watchtovio git bridge <remote> --bidirectional --watch 300

--watch repeats the cycle on an interval in the foreground — 60 seconds if you give no value. It is not a daemon: Ctrl-C stops it, and only lanes that actually advanced are republished each cycle. A failed cycle is reported and the watcher keeps going, so you can reconcile without restarting it.

A realistic evaluation setup

  1. Import your Git history into a fresh TOVIO repository.
  2. Bridge to the existing Git remote, bidirectionally.
  3. Work in TOVIO. Colleagues who have not switched keep using Git against the same host.
  4. CI keeps running against the Git host, unchanged.

This lets one person evaluate without asking the team to move.

What it refuses

  • A partial clone. The bridge must translate complete history and content, so it refuses to run in a promisor-backed repository — one cloned with --blobless, --blob-limit, --depth or --no-attachments. Run tovio fetch --complete first. (A --sparse clone is a path scope rather than a promisor, so it is not caught by that check; bridge from a complete clone anyway, or the Git side sees only your scope.)
  • A non-fast-forward publish. If the remote refs/heads/tovio/* advanced since the last cycle, publishing is refused with TVO-MIG-006 rather than forced. Both sides' work is safe; reconcile it through review and land.
  • Anything it cannot do over the installed git. Transport and credentials are delegated to your Git client on purpose, so HTTPS and SSH credential helpers work exactly as they already do. A transport, credential, timeout or translation failure is TVO-MIG-004.

What to watch

  • Protected paths. Content covered by a read policy crosses to Git as ciphertext, never decrypted. That is correct, and surprising if you did not expect it.
  • Change identity. It does survive: change ids and agent provenance ride as commit-message trailers, and an import reads them back. What does not survive is anything a trailer cannot hold.