The obliterate command permanently deletes the underlying blob storage for every version of files that match a path pattern, across all branches and commits. This is destructive and irreversible.
For background, glob syntax, and the underlying model, see the Obliterate guide.
Obliterate cannot be undone. Always run preview first and read the plan before running execute.
Requirements:
- You must be a repository admin.
- Obliterate is not supported on git-synced repositories.
preview
Show what would be obliterated. No state changes.
dv obliterate preview [--json] <glob> [<glob> ...]
<glob> is a path pattern anchored to the repo root (e.g. '/assets/*.psd'). Quote the pattern so your shell does not expand it. The argument is repeatable — pass multiple globs to plan their combined obliteration in one call.
--json emits a single JSON document on stdout with the full preview response. Banners and warnings are suppressed in this mode; warnings move into a warning string field on the document.
The human view shows headline counts, a reclaim estimate, and the top 20 deletable / not-deleted paths sorted by bytes desc. If the full list is longer, a trailing line reads ... and N more (use --json for the full list). When more than one glob is passed, a per-glob block prints the files / versions / total bytes each glob matched on its own.
Example:
dv obliterate preview '/assets/old_textures/*.psd' '/builds/.../*.pak'
dv obliterate preview --json '/assets/old_textures/*.psd' | jq '.deletable_paths | length, .per_glob_summary'
execute
Permanently obliterate matching blobs.
dv obliterate execute [--yes] [--json] [--nowait] <glob> [<glob> ...]
<glob> is the same path pattern as in preview, and is repeatable.
--yes skips the destructive-confirmation prompt (for scripting). Without it, you must type the repository name or ID at the prompt to confirm.
--json emits a single JSON document instead of the human banner. Requires --yes — an interactive prompt would corrupt the JSON stream.
--nowait enqueues the job and exits immediately without polling. Use dv obliterate status <job_id> afterwards.
By default, execute returns a job_id and polls the status endpoint every 3 seconds for up to 18 seconds. The cap is fixed — use --nowait to skip polling, or follow up with status for longer runs.
Exit codes:
| Code | Meaning |
|---|
0 | Polling reached a terminal state and the job completed without failures. |
2 | Polling reached a terminal state and the job had one or more failed deletions. |
101 | The 18s polling cap elapsed with the job still in progress. Lets scripts distinguish “gave up waiting” from “done”; follow up with dv obliterate status. |
Example:
dv obliterate execute --yes '/assets/old_textures/*.psd'
status
Show the state of a previously enqueued obliterate job.
dv obliterate status <job_id>
<job_id> is the id returned by dv obliterate execute (e.g. dv.obliterate.593d2b8a8dbf47559bcc73c8bcf54f41).
Output includes the overall status (queued, in_progress, succeeded, failed, or archived), per-file counts (pending / done / failed), the start time, and — for terminal states — the end time. failed includes the first 20 errors with a short error message per failure. archived means the job has aged out of the queue but its counts are still inspectable.
A 404 means there is no obliterate job with that id in this repository.
Example:
dv obliterate status dv.obliterate.593d2b8a8dbf47559bcc73c8bcf54f41
Notes
- The server enforces a 60-second time budget on glob resolution. If your glob matches too many files, the call is rejected with an error — narrow the pattern and split into multiple runs.
- The actual deletion runs in the background after the call returns, which is why
execute returns quickly and why progress is tracked via the status endpoint.
- Files in shared (grouped) storage cannot be individually obliterated and are reported as skipped in the response.
For the full conceptual guide, glob syntax tables, and worked examples, see Obliterate.