> ## Documentation Index
> Fetch the complete documentation index at: https://docs.diversion.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Obliterate

> リポジトリからファイル blob を完全に削除して、ストレージを回収し、機密コンテンツを取り除きます。

`obliterate` は、パスパターンに一致するファイルの全バージョンについて、あらゆるブランチとコミットにまたがって、その基盤となる blob ストレージを完全に削除します。削除を履歴に記録しつつ古いバージョンを到達可能なまま残す `dv rm` とは異なり、obliterate はバイト自体を削除し、履歴中の参照を書き換えて blob を復元できないようにします。

次のような場合に使用します:

* 非常に大きなファイル (ゲームビルド、データセット、誤ってコミットされたバイナリ) がストレージを消費しており、履歴上でもう不要になった場合。
* シークレット、認証情報、その他の機密ファイルがコミットされてしまい、抹消する必要がある場合。

<Warning>
  Obliterate は **破壊的かつ不可逆** です。取り消しはできません。実行前には必ずプレビューを実行し、計画を注意深く確認してください。
</Warning>

## 要件

* [**リポジトリ管理者**](/ja/basic/access-levels#組織レベルのアクセス) である必要があります。
* git 同期されたリポジトリでは obliterate はサポートされていません。

## 仕組み

1. 1 つ以上のパス glob (例: `'/assets/*.psd'`) を指定します。
2. サーバーはリポジトリ履歴全体にわたるすべての (パス、バージョン) の一致を解決します。
3. 各一致は、**削除可能** (基盤となる blob は指定した glob に含まれるパスからのみ到達可能) か、**削除不可** (同じ blob コンテンツが、含めなかった別のパス経由でも到達可能) のいずれかに分類されます。
4. 実行時、削除は非同期で走ります。返される `job_id` をポーリングして進捗を確認できます。

「削除不可」の区分が重要なのは、Diversion がファイル内容をハッシュで格納しているためです — つまり複数のパスで共有される同じバイトは 1 度しか格納されません。同じ内容が指定に含めなかった別のパスにも存在すると、ストレージは残ります。プレビューでは削除を妨げているのがどの別パスかを正確に示します — glob セットを広げて再実行できます。

## Glob 構文

パターンは **リポジトリのルートに固定** されます。ワイルドカードをシェルが展開しないよう、必ずクォートしてください。

| パターン                | 一致対象                                      |
| ------------------- | ----------------------------------------- |
| `/assets/*.psd`     | ルートに固定された `/assets/` 直下の `.psd` ファイル      |
| `/assets/.../*.psd` | `/assets/` 配下のあらゆる階層の `.psd` ファイル (再帰)    |
| `/.../secrets.env`  | リポジトリ内のあらゆる場所にある `secrets.env` という名前のファイル |
| `/build/large.bin`  | 特定の 1 ファイル                                |

パターンが広く固定されていない場合 (たとえばリポジトリ全体に一致する、あるいは再帰の意図があるのに実際にはルートのみに一致する場合) には、プレビューが警告を返します。冗長なパターン (同じ呼び出し内の別のパターンにすでに含まれているもの) も警告対象となります。

## プレビュー

必ずプレビューから始めてください。サーバー側では何も変更されません。

```bash theme={null}
dv obliterate preview '/assets/old_textures/*.psd'
```

プレビューは以下を返します:

* **見出しの件数**: 削除可能なバージョン数 / ファイル数、削除不可のバージョン数 / ファイル数、および obliterate が到達できない共有 (グループ化された) ストレージ内の一致件数。
* **回収見積り**: コンテンツハッシュで重複排除された解放バイト数の合計 (同じ blob が N 個のパスにあっても 1 回としてカウント)。
* **削除可能なパス**: パスごとのサマリー — バージョン数と合計バイト数 — 回収サイズが大きい順にソート。
* **削除不可のパス**: パスごとのサマリーに加え、`unblock_paths` — 同じコンテンツを保持しているリポジトリ内の他のパス。blob を削除したい場合はそれらを glob セットに追加してください。
* **glob ごとのサマリー**: 各入力 glob について、それ単独で (glob 間の重複排除前に) 一致したファイル数 / バージョン数 / 合計バイト数。JSON 出力および、複数の glob を渡した場合の人間向け CLI の glob ごとのブロックにのみ表示されます。
* **警告**: glob が広く固定されていない、または冗長である場合に表示されます。

複数の glob を 1 度の呼び出しに渡して、その合算 obliterate 計画を立てられます:

```bash theme={null}
dv obliterate preview '/assets/*.psd' '/builds/.../*.pak'
```

### 人間向け vs JSON 出力

人間向け CLI は、削除可能 / 削除不可のパスをバイト数降順で **上位 20 件** 表示し、結果が上限に達した場合は末尾に `... and 980 more (use --json for the full list)` のような行を出します。サーバーはバイト降順でソートされた全リストを返し、上限がかかるのは表示のみです。

機械可読な完全な計画を得るには、`--json` を渡します:

```bash theme={null}
dv obliterate preview --json '/assets/old_textures/*.psd' | jq '.deletable_paths | length'
```

`--json` は標準出力に単一の JSON ドキュメントを出力し、バナーと警告は抑制されます (警告はドキュメントの `warning` 文字列フィールドに移動します)。

## 実行

削除しようとしている内容がプレビューと一致したら:

```bash theme={null}
dv obliterate execute '/assets/old_textures/*.psd'
```

確認のためリポジトリ名または ID を入力するよう求められます。プロンプトをスキップするには `--yes` を渡します (スクリプト用):

```bash theme={null}
dv obliterate execute --yes '/assets/old_textures/*.psd'
```

execute は preview と同じ計画に加えて `job_id` を返し、ジョブが終端状態に達するまでポーリングを開始します。ポーリングの上限は **18 秒** (ステータスエンドポイントを 3 秒ごとに呼び出す) です。短いジョブの場合はインラインで完了を確認でき、長いジョブでは CLI が `job_id` を表示して終了します。あとは `dv obliterate status` でフォローアップしてください。

フラグ:

* `--nowait` — キューに入れて即座に終了し、ポーリングしない。CLI は `job_id` を表示し、進捗は自分で確認します。
* `--json` — 人間向けバナーではなく単一の JSON ドキュメントを出力する。**`--yes` が必須** — 対話的な確認プロンプトが JSON ストリームを破損させるためです。

終了コード:

| コード   | 意味                                                                                                                |
| ----- | ----------------------------------------------------------------------------------------------------------------- |
| `0`   | ポーリングが終端状態に達し、ジョブが失敗なしで完了した。                                                                                      |
| `2`   | ポーリングが終端状態に達し、ジョブに 1 つ以上の失敗した削除があった。                                                                              |
| `101` | 18 秒のポーリング上限が経過してもジョブがまだ進行中。「待機を諦めた」と「完了」を区別するためにあり、スクリプトで分岐できるように設計されています。`dv obliterate status` でフォローアップしてください。 |

<Note>
  `execute` はジョブがキューに入った時点で返ります — 実際の削除はバックグラウンドで走るため、進捗確認のためにステータスエンドポイントをポーリングします。
</Note>

<Note>
  obliterate 実行中に同じファイルへ並行して行われるコミットはエッジケースです。他のユーザーが対象パスにアクティブにコミットしている間の obliterate 実行は避けてください。
</Note>

## ジョブの追跡

execute するたびに `job_id` (例: `dv.obliterate.593d2b8a8dbf47559bcc73c8bcf54f41`) が返されます。以下で進捗を確認します:

```bash theme={null}
dv obliterate status <job_id>
```

レスポンスには全体の `status` に加え、行ごとの件数が含まれます:

```
Obliterate job dv.obliterate.593d2b8a8dbf47559bcc73c8bcf54f41
  Status:  in_progress
  Counts:  pending=18200 done=11800 failed=0
  Started: 2026-06-18T08:39:01.147736+00:00
```

### ステータス値

| ステータス         | 意味                                                                                  |
| ------------- | ----------------------------------------------------------------------------------- |
| `queued`      | ワーカーがまだ開始していない。                                                                     |
| `in_progress` | ワーカーが実行中。バッチが完了するにつれ `pending` が減少し、`done` と `failed` が増加する。                        |
| `succeeded`   | ワーカーが完了し、すべての行が `done`。                                                             |
| `failed`      | ワーカーは完了したが、1 つ以上の行が `failed`。レスポンスには失敗した SHA と切り詰められたエラーメッセージ付きで、最初の 20 件のエラーが含まれる。 |
| `archived`    | ジョブはキューから古くなって外れたが、件数はまだ確認可能。                                                       |

ステータスエンドポイントから 404 が返る場合は、そのリポジトリにその ID の obliterate ジョブが存在しないことを意味します。

## 影響を受ける対象

* **履歴**: obliterate されたファイルバージョンはリポジトリの変更ログから削除されます。
* **オープン中のマージ**: 競合が obliterate されたファイルを参照していたオープン中のマージは閉じられます。そのまま確定するとデッド参照を持つコミットが生成されるためです。

## 制限

* preview / execute の解決呼び出しには、サーバー側の時間予算 (60 秒) があります。glob があまりに多くのファイルに一致すると、パターンを絞り込むよう求めるエラーで呼び出しは拒否されます。より具体的な glob セットに作業を分割し、順次実行してください。
* **共有 (グループ化された) ストレージ** に格納されているファイル — 効率化のためにまとめてパックされた小さなファイル — は個別に obliterate できません。プレビューはこれらを別のスキップ数として報告するので、除外された件数が分かります。

## 関連

* [`dv obliterate`](/ja/cmd-ref/obliterate) — CLI リファレンス
* [ストレージ](/ja/concepts/storage) — blob がどのように格納・共有されるか
* [過去に戻る](/ja/basic/going-back-in-time) — 破壊的でない履歴ナビゲーション
