【ITニュース解説】Parallel Coding Agents Leave 9 Kinds of Junk on Your Disk. The Commands That Clear It
2026年10月16日に「Dev.to」が公開したITニュース「Parallel Coding Agents Leave 9 Kinds of Junk on Your Disk. The Commands That Clear It」について初心者にもわかりやすく解説しています。
ITニュース概要
AIコーディングエージェントを複数利用すると、ディスクに不要な作業ファイルやブランチが残り、容量圧迫やポート占有を招く。記事は、これら9種類の「ゴミ」を特定し、安全に削除するGitコマンドなどを具体的に紹介。開発環境を快適に保つため、定期的な手動クリーンアップの重要性を説く。
ITニュース解説
システムエンジニアを目指す皆さん、現代の開発現場ではAIプログラミングエージェントの活用が急速に進んでいる。これらのAIはコード生成やテスト、デバッグなど多岐にわたる作業を支援し、開発効率を飛躍的に向上させてくれる。しかし、その便利さの裏側で、開発環境、特にディスク上には予想以上に多くの「ゴミ」が残されてしまうことがある。まるで散らかった机のように、放置するとディスク容量を圧迫し、時にはポートの占有やGitリポジトリのパフォーマンス低下といった問題を引き起こしかねない。ここでは、AIエージェント、特にGitのワークツリー機能を利用した開発で発生しがちな9種類の「ゴミ」と、それらを効率的に掃除するための具体的な方法を解説する。
まず、一つ目は「誰も使っていないワークツリーフォルダ」だ。Gitのワークツリー機能は、一つのGitリポジトリに対して複数の作業ディレクトリを同時に持ち、異なるブランチで並行作業を行う際に非常に便利だ。しかし、作業が完了してもワークツリーを適切に削除しないと、フォルダ自体とGitが管理するその記録がディスクに残り続ける。git worktree list -vコマンドを使えば、現在存在しているワークツリーとその状態、例えばなぜロックされているかなどを確認できる。もし不要なワークツリーがあれば、そのフォルダ名を指定してgit worktree remove <パス>で削除する。ただし、Gitは変更が残っている「汚れた」ワークツリーは削除を拒否する。その場合は--forceオプションを、ロックされている場合はさらに--forceを重ねて使う必要があるが、これは安全装置として機能するため、内容を確認してから慎重に判断すべきだ。
二つ目は「削除されたフォルダの記録と古いロック」である。ワークツリーフォルダをrm -rfのようなコマンドやファイルマネージャーで直接削除した場合、Gitはフォルダ自体は消えたことを認識するが、そのワークツリーの記録は.git/worktrees以下に残ってしまう。git worktree listで「prunable(削除可能)」と表示されるものがこれにあたる。git worktree prune --dry-run --verboseで削除対象を確認し、問題なければgit worktree prune --verboseでそれらの記録をクリーンアップできる。また、AIエージェントがワークツリーを操作中に予期せず終了すると、ワークツリーがロックされたままになり、そのロックが残り続けることがある。git worktree list --porcelainというコマンドでロック状態のワークツリーを確認し、安全だと判断できればgit worktree unlock <パス>でロックを解除できる。
三つ目は「既にマージされたタスクブランチ」だ。開発においては、一つの機能やバグ修正ごとに新しいブランチを作成し、作業完了後にメインブランチ(多くの場合mainブランチ)にマージするのが一般的だ。マージが完了したブランチは役目を終えるが、自動的に削除されるわけではない。git branch --merged main --list 'hermes/*' 'worktree-*'のようなコマンドで、メインブランチにマージ済みのブランチを一覧表示できる。その後、git branch -d <ブランチ名>でこれらのブランチを削除する。git branch -dはマージされていない変更があるブランチの削除を拒否するため比較的安全だ。ただし、スカッシュマージやリベースによってマージされたブランチは、コミット履歴の構造が変わるため、この方法では検出できない点に注意が必要だ。
四つ目は、三つ目とは対照的に「誰も完了しなかったブランチ」である。実験的な試みや途中で放棄された機能開発のブランチは、メインブランチにマージされることなく残り続けることがある。これらのブランチはgit for-each-ref --sort=committerdate --no-merged=main --format='%(committerdate:short) %(refname:short)' refs/heads/で、最新のコミットが古い順に並べて表示できる。長期間更新されていないブランチは、放棄されたものである可能性が高い。git branch -D <ブランチ名>で強制的に削除できるが、これは注意が必要な操作だ。削除前にgit log main..<ブランチ名>で内容を確認し、本当に不要か慎重に判断することが重要だ。
五つ目は「git branchコマンドでは表示されないリファレンス」だ。Gitはブランチやタグ以外にも、refs/ディレクトリ以下に様々なリファレンス(参照情報)を保存できる。AIエージェントや他の開発ツールが、独自の履歴管理やスナップショットのためにこれらのリファレンスを作成することがある。git for-each-ref --format='%(refname:rstrip=-2)' | sort | uniq -cで、どのような種類のリファレンスがどれだけ存在するかを確認できる。これらのリファレンスは、Gitのオブジェクトストア内で古いコミットやファイルデータを「参照し続けている」ため、ディスク容量を圧迫する原因となることがある。削除する前に、それが何のツールによって作られたもので、削除しても問題ないかをツールのドキュメントなどで確認することが不可欠だ。安全が確認できれば、git update-ref -d <リファレンス名>で削除できる。
六つ目は「各ワークツリー内のnode_modulesなどの依存関係フォルダ」だ。新しいワークツリーを作成した時点では、Gitで追跡されているファイルしか存在しない。しかし、そこでAIエージェントがプログラムを実行したり、手動で依存関係をインストールしたりすると、そのワークツリー内に独自のnode_modulesフォルダなどが生成される。特にJavaScript系のプロジェクトでは、これらのフォルダは非常に大きく、ワークツリーごとにコピーされるとディスク容量を大幅に消費する。git worktree list --porcelain | awk '/^worktree /{print substr($0, 10)}' | while read -r wt; do du -sh "$wt/node_modules" 2>/dev/null; doneのようなコマンドで、各ワークツリー内のnode_modulesのサイズを確認できる。もしそのワークツリーにもう戻らないのであれば、ワークツリーごと削除するのが最も効果的だ。一時的に使用するワークツリーであれば、node_modulesを削除し、必要になったら再度インストールし直すという運用も可能だ。
七つ目は「無視されているファイルや追跡対象外のファイル」である。AIエージェントがログファイルを出力したり、開発者が作業中にスクリーンショットを貼り付けたり、メモを作成したりすることがある。これらのファイルは.gitignoreによってGitの管理対象から外れているため、リポジトリのクローン元には含まれないが、ローカルのワークツリー内に残存し、ディスク容量を消費する。git clean -ndでGitで追跡されていないが.gitignoreで無視されていないファイルを確認でき、git clean -ndXで.gitignoreで無視されているファイルだけを確認できる。-nオプションは削除対象を表示するだけで、実際には削除しない「ドライラン」だ。-Xオプションを指定しないgit clean -fdを実行すると、node_modulesなどの無視ファイルは削除されないが、git clean -fdXを実行すると、.envファイルやnode_modulesなど、無視設定されているすべてのファイルが削除されてしまう可能性があるため、実行する際は慎重に確認し、特定のパスを指定して削除するなどの工夫が必要だ。
八つ目は「ポートを占有し続ける開発サーバー」だ。AIエージェントがバックグラウンドで開発サーバーを起動した場合、エージェントのセッションが終了してもサーバープロセスが残り続けることがある。これにより、次に同じポートを使おうとした際に「ポートが使用中」というエラーが発生してしまう。lsof -nP -iTCP -sTCP:LISTENコマンドは、現在リッスンしているTCPソケットを一覧表示する。ここで特定のポートが占有されているのを見つけたら、lsof -a -p "$PID" -d cwdでそのプロセス(PID)がどのワークツリーで動いているかを確認できる。不要なプロセスであれば、kill "$PID"コマンドで停止させることで、ポートを解放できる。
最後に九つ目は「肥大化し続ける.gitディレクトリ」だ。すべてのワークツリーは、実は一つの.gitディレクトリ内のオブジェクトストアを共有している。そのため、AIエージェントが行ったすべてのコミットや操作の履歴は、この共通の.gitディレクトリに蓄積されていく。git count-objects -vHコマンドで、.gitディレクトリ内のオブジェクトがどれくらいの容量を占めているかを確認できる。これまでの手順で不要なブランチやリファレンスを削除した後でも、Gitは古いオブジェクトをすぐに削除するわけではない。デフォルトでは、一定期間(例えば2週間や3ヶ月)が経過しないと削除されない設定になっているため、ディスク容量の解放が遅れることがある。すぐにディスク容量を解放したい場合は、git reflog expire --expire-unreachable=now --allでリフログ(Gitの操作履歴)を強制的に削除し、続けてgit gc --prune=nowを実行する。ただし、この操作は一度削除したコミットなどを回復するための情報も同時に消去するため、誤って重要な情報を失うリスクがある。必ず他のクリーンアップ作業がすべて完了し、本当に不要だと確信した後に実行すべきだ。
Hermes IDEやClaude Codeといった一部のAIエージェントは、これらの「ゴミ」の一部を自動的にクリーンアップする機能を備えている。例えばHermes IDEは、一定期間が経過した履歴スナップショットや不要なワークツリー、古いスクリーンショットなどを自動で削除する。Claude Codeも、古いワークツリーを定期的に整理する機能がある。しかし、これらの自動クリーンアップ機能も万能ではなく、特にポートの占有やGitのオブジェクトストアの最適化など、手動での対応が必要な部分も残されていることが多い。複数のAIエージェントを利用している場合は、それぞれのツールが担当する範囲を理解し、残りの部分を手動で定期的にメンテナンスすることが、清潔で効率的な開発環境を維持する上で非常に重要となる。
これらの知識は、AIエージェントを活用した開発において、単にコードを書くだけでなく、その裏側で生成される環境を適切に管理するための土台となる。システムエンジニアを目指す皆さんにとって、このような開発環境の「整理整頓」のスキルは、効率的で安定した開発を支える重要な要素となるだろう。