remove

Removes a clone once it holds nothing you would miss.

gitto remove <name> [--archive]

Removes a clone once it holds nothing you would miss.

What it refuses

Uncommitted changes. Commits no remote has. Worktrees living outside the clone whose history its submodules hold, because removing it would leave each of them a directory of files with no repository.

$ gitto remove auth-fix
gitto: auth-fix hosts the history of worktrees that live outside it:
        /Users/you/work/storefront-docs
      removing it would leave each of them without a repository.

Both counts read the submodules as well as the checkout. A commit made inside a submodule and pushed nowhere is invisible to git status at the top level once its pointer has been committed, and it is the copy no remote holds:

$ gitto remove auth-fix
gitto: auth-fix holds 1 commits no remote has, in it or in a submodule.
      push them, or keep them with 'gitto remove auth-fix --archive'.

Keeping what it holds

--archive removes the clone and leaves what it held in <canonical>.gitto-archive/<name>-<timestamp>: one bundle for the checkout, one for each submodule, and a manifest naming the branch and commit each bundle carries.

$ gitto remove spike-oauth --archive
removed storefront-spike-oauth, and what it held is in
  /Users/you/work/storefront.gitto-archive/spike-oauth-20260925-104233

Work that was never committed is committed first, onto refs/gitto-archive/uncommitted, so the bundle carries it too. Every bundle is read back with git bundle verify before anything is deleted, and a bundle that does not verify stops the removal with the clone still there.

Read one back with a fetch:

git init recovered && cd recovered
git fetch ../storefront.gitto-archive/spike-oauth-20260925-104233/superproject.bundle \
  'refs/*:refs/*'

The archive carries what git would carry. Ignored files are not in it, which is the same 9 GB of build output that made the clone cheap to begin with.

On this page