Das Problem
Claude Code aktualisiert sich häufig, und jedes Update lässt die vorherige
Version auf der Platte liegen. Auf einem entfernten Entwicklungsrechner liegt
dieselbe Version meist bis zu dreimal vor: das CLI-Binary in
~/.local/share/claude/versions/, die Editor-Erweiterung in
~/.vscode-server/extensions/ und die heruntergeladene VSIX-Datei im Cache der
Erweiterungen. Jede Kopie ist 250 bis 290 MB groß. Ein kleiner VPS ist damit
innerhalb weniger Wochen voll.
Man kann die alten Kopien von Hand löschen, muss aber vorher jedes Verzeichnis prüfen: Eine vor Tagen gestartete Session kann noch ein älteres Binary ausführen, und die Editor-Erweiterung läuft aus ihrem eigenen, versionierten Verzeichnis.
Wie es funktioniert
claude-code-gc durchsucht eine
feste Liste von Verzeichnissen. CLI-Versionen kommen aus
~/.local/share/claude/versions/, Erweiterungen aus den
Erweiterungsverzeichnissen von VS Code, Cursor und Windsurf, VSIX-Dateien aus
den beiden Download-Caches von VS Code. In den Verzeichnissen für Erweiterungen
und VSIX-Dateien berücksichtigt es nur Einträge mit dem Namen
anthropic.claude-code-<version>....
Danach liest es /proc. Eine Version gilt als in Benutzung, wenn ein laufender
Prozess sie als ausführbare Datei hat (/proc/<pid>/exe) oder eine Datei darin
auf seiner Kommandozeile nennt. Der zweite Fall deckt die VS-Code-Erweiterung
ab, die als node .../extension.js läuft. Jede benutzte Version bleibt
erhalten, ebenso die neueste Version jeder Art (cli, extension, vsix).
--keep N behält die neuesten N Versionen pro Art, --keep 0 nur das, was in
Benutzung ist.
Standard ist ein Probelauf. Das ist das Beispiel aus dem README, aufgenommen auf einem VPS mit mehreren offenen Sessions:
$ claude-code-gc
cli 2.1.299 253.0 MB in use (pid 324791) ~/.local/share/claude/versions/2.1.299
cli 2.1.300 253.8 MB remove ~/.local/share/claude/versions/2.1.300
cli 2.1.302 272.6 MB in use (pid 1683736) ~/.local/share/claude/versions/2.1.302
extension 2.1.300 266.9 MB remove ~/.vscode-server/extensions/anthropic.claude-code-2.1.300-linux-x64
extension 2.1.301 267.5 MB keep (newest) ~/.vscode-server/extensions/anthropic.claude-code-2.1.301-linux-x64
2 item(s) removable, 520.7 MB. Run with --delete to remove them.
note: pid 3581507 still runs deleted ~/.local/share/claude/versions/2.1.292; its space returns when it exits.
--delete entfernt die mit remove markierten Einträge. Die note-Zeilen
nennen lange laufende Sessions, die noch ein bereits gelöschtes Binary
ausführen. Linux gibt diesen Platz erst frei, wenn der Prozess endet. Man
bekommt ihn also nur zurück, indem man alte Sessions beendet.
Das Werkzeug braucht Python 3.10 oder neuer und hat keine Abhängigkeiten.
Tests
Die Tests bauen ein künstliches Home-Verzeichnis mit drei CLI-Versionen, zwei
Erweiterungsversionen und einer fremden Erweiterung sowie ein künstliches
/proc mit exe-Symlinks und cmdline-Dateien. Geprüft wird, dass fremde
Erweiterungen ignoriert werden, dass die neueste und die benutzten Versionen
erhalten bleiben und dass eine Erweiterung über ihre Kommandozeile als benutzt
erkannt wird. Ein Test stellt sicher, dass ein Prozess mit Version 2.1.301 das
Verzeichnis 2.1.30 nicht als benutzt markiert. Weitere Tests decken die Meldung
eines gelöschten, noch laufenden Binarys ab, einen Probelauf mit
anschließendem --delete und --keep 0.
Es sind 8 Tests. Das CI führt sie auf Python 3.10, 3.11, 3.12 und 3.13 aus,
zusammen mit ruff check und ruff format --check, und ruft den Befehl
einmal auf dem Runner auf.
Grenzen
- Es läuft nur unter Linux, weil es
/procliest, um laufende Prozesse zu finden. - Es durchsucht nur die im README aufgeführten Verzeichnisse. Installationen an anderen Orten findet es nicht.
- Platz, den ein Prozess mit einem gelöschten Binary noch belegt, kann das Werkzeug nicht freigeben. Es meldet diese Prozesse nur.
Code und Installationsanleitung liegen unter github.com/Jwrede/claude-code-gc.