Zum Inhalt springen
cargo-broom
MITDokumentation
Cargo-Subcommand · Rust · CLI

Aufräumen, ohne dass es zur Dateisystem-Operation wird

cargo clean kennt ein Projekt. cargo-broom findet die target-Verzeichnisse unter einem ganzen Verzeichnisbaum, bewertet sie nach Alter und Größe und zeigt zuerst, was ein Lauf entfernen würde. Ohne Bestätigung passiert nichts.

4
Kommandos, die nur analysieren
3
Wege zur Bestätigung: --dry-run, --interactive, --yes
0.1.0
Alpha mit Sicherheitsfokus
cargo-broom 0.1.0
$ cargo broom --dry-run --keep-days 0 --keep-size 50MB ~/GitHub/kestrel
cargo-broom Summary (Dry Run)

  Reclaimable: 3.13 GiB

● Level A — Full Target Clean (Coarse) (1)
  - kestrel-core (3.13 GiB) at /Users/jseidel/GitHub/kestrel/target
Lauf vom 16.09.2026, gekürztDry Run · nichts gelöscht
Grundlage
  • Rust 1.89+
  • Cargo-Subcommand
  • mtime statt atime
  • Trockenlauf
  • OS-Papierkorb
  • JSON-Reports
  • runemark
  • launchd · systemd
  • MIT
Stand: September 2026 · v0.1.0
4
Analyse-Kommandos: inspect, doctor, toolchains, budget
9
Aufräum-Modi und Modifikatoren
14
Tage rollender Verlauf mit --history
1.89
Rust-Mindestversion
01 — Überblick

cargo clean beantwortet die Frage nicht, die man tatsächlich hat.

Für ein bekanntes Projekt genügt cargo clean. Sobald mehrere Dutzend Checkouts auf der Platte liegen, lautet die Frage anders: Welche davon belegen den Platz, welche sind kalt geworden, und was würde ein geplanter Lauf heute Nacht wegräumen? cargo-broom ergänzt rekursive Suche, Richtlinien nach Alter und Größe, Trockenläufe, interaktive Auswahl und maschinenlesbare Reports.

github.com/casoon/broom →
  1. 01Erst seheninspect und --dry-run fassen nichts an
  2. 02Dann bestätigen — ohne --dry-run, --interactive oder --yes bricht der Lauf vor dem Scan ab
  3. 03Umkehrbar--trash verschiebt in den Papierkorb des Systems statt endgültig zu löschen
  4. 04Nachvollziehbar--format json für Skripte, Reports und geplante Trockenläufe
02 — Ausgabe

Was im Terminal steht.

cargo broom inspectBestandsaufnahme
$ cargo broom inspect ~/GitHub
cargo-broom Inspect — /Users/jseidel/GitHub
Found 3 Rust target directories occupying 4.99 GiB

 • kestrel-core                3.13 GiB  /Users/jseidel/GitHub/kestrel/target
 … zwei weitere Einträge
Level ATrockenlauf
$ cargo broom --dry-run --keep-days 0 --keep-size 50MB ~/GitHub/kestrel
cargo-broom Summary (Dry Run)

  Reclaimable: 3.13 GiB

● Level A — Full Target Clean (Coarse) (1)
  - kestrel-core (3.13 GiB) at /Users/jseidel/GitHub/kestrel/target

Next steps:
  • Run `cargo broom -y` to reclaim 3.13 GiB
    $ cargo broom -y
Level BTrockenlauf
$ cargo broom --dry-run --fine-only --clean-incremental --clean-doc ~/GitHub/kestrel
cargo-broom Summary (Dry Run)

  Reclaimable: 531.18 MiB

● Level B — Selective / Experimental Fine Clean (1)
  - kestrel-core (pruned 0 stale fingerprints, 1 files) — 531.18 MiB
    at /Users/jseidel/GitHub/kestrel/target

Next steps:
  • Run `cargo broom -y` to reclaim 531.18 MiB
    $ cargo broom -y
03 — Modi

Was in welchem Modus verschwindet.

ModusAuswahlWas entfernt wird
Standard / Level ATarget ist mindestens --keep-days alt und, sofern gesetzt, mindestens --keep-size großDas vollständige, standardmäßige lokale target/
--coarse-onlyDieselbe Richtlinie wie Level A, feine Operationen werden abgelehntDas vollständige, standardmäßige lokale target/
--clean-incrementalTargets, die Level A nicht ausgewählt hatDie Caches unter target/*/incremental
--clean-docTargets, die Level A nicht ausgewählt hatDie erzeugte Ausgabe in target/doc
--experimental-fineTargets, die Level A nicht ausgewählt hatFingerprints und zugehörige gehashte Artefakte, ausgewählt über experimentelle Alters- und Dublettenheuristiken
--toolchains <Liste>Modifikator für --experimental-fineZusätzlich Fingerprints, die mit einem anderen rustc als den genannten gebaut wurden
--installedModifikator für --experimental-fineDasselbe, behält aber jede aktuell über rustup installierte Toolchain
--fine-onlySchaltet Level A abNur die ausdrücklich angeforderten feinen Operationen
--trashModifikator für Level A, mit jeder der obigen RichtlinienVerschiebt das Target in den Papierkorb des Systems statt es endgültig zu löschen

Widersprüchliche Kombinationen weist die CLI zurück: --fine-only braucht eine der feinen Operationen, --tests-only, --toolchains und --installed brauchen --experimental-fine.

04 — Sicherheit

Wo das Werkzeug bewusst stehen bleibt.

Nur Standard-Targets vollständig

Das vollständige Löschen ist auf ein normales lokales <workspace>/target beschränkt. Geteilte Targets, konfigurierte Überschreibungen, Symlinks und Targets außerhalb des Workspace werden nie im Ganzen entfernt.

Kein Rückfall auf die grobe Stufe

Scheitert das Lesen eines Fingerprints, überspringt cargo-broom die feine Reinigung für dieses Projekt. Es löscht in diesem Fall nicht ersatzweise das ganze Target.

mtime statt atime

Das Alter wird an der mtime gemessen. Auf noatime- und relatime-Mounts wird atime nicht bei jedem Lesen aktualisiert – Artefakte wirkten dort fälschlich frisch. Die mtime schreibt jeder echte Cargo-Build.

Laufende Builds werden ausgelassen

Ein Target, das gerade von einem Cargo-Prozess gesperrt ist, wird auf beiden Stufen komplett übersprungen, statt mit dem Build um die Dateien zu konkurrieren.

Bestätigung ist nicht konfigurierbar

Absichtlich: Ein unbeaufsichtigter, löschender Lauf muss --yes im Befehl selbst tragen. Die Konfigurationsdatei kann das nicht abkürzen.

Fehler bleiben sichtbar

Fehler beim Löschen werden gemeldet und führen zu einem Exit-Code ungleich null. JSON-Reports gehen nach stdout, Prozessfehler nach stderr.

05 — Analysieren

Vier Kommandos, die nichts löschen.

cargo broom inspect

Bestandsaufnahme

Listet die gefundenen Targets mit ihrem Platzbedarf, ohne eine Richtlinie anzuwenden.

cargo broom doctor

Diagnose

Meldet konfigurierte Target-Überschreibungen, ungewöhnlich große Targets und gesperrte Targets.

cargo broom toolchains

Toolchains

Zeigt installierte rustup-Toolchains, die unterhalb des Verzeichnisses von keiner rust-toolchain-Datei referenziert werden. Deinstalliert nichts.

cargo broom budget

Budget

Summiert den Platzbedarf über alle gefundenen Projekte und weist mit --limit aus, wenn das Budget überschritten ist – samt der größten Posten.

06 — Einstieg

Erst schauen, dann bestätigen.

  1. 1Installieren

    Von crates.io

    Die Kiste liegt als cargo-broom auf crates.io und ist nach der Installation als cargo broom verfügbar. Wer den aktuellen Hauptzweig will, installiert stattdessen direkt aus dem Repository. Voraussetzung ist Rust 1.89 oder neuer.

    cargo install cargo-broom # oder direkt aus dem Repository cargo install --git https://github.com/casoon/broom.git
  2. 2Schauen

    inspect und Trockenlauf

    Beide Befehle ändern nichts. inspect zeigt den Bestand, der Trockenlauf zeigt, was die aktuelle Richtlinie auswählen würde.

    cargo broom inspect ~/GitHub cargo broom --dry-run ~/GitHub
  3. 3Aufräumen

    Bestätigter Lauf

    Erst mit --yes oder --interactive wird gelöscht. --trash macht denselben Lauf umkehrbar, weil die Targets im Papierkorb landen.

    cargo broom --yes --keep-days 14 --keep-size 50MB ~/GitHub
07 — Betrieb

Konfiguration und geplanter Lauf.

broom.tomlKonfiguration
root_path = "~/GitHub"
keep_days = 14
keep_size_mb = 50

# Für unbeaufsichtigte Läufe bleibt das Experimentelle aus.
experimental_fine = false
fine_only = false
coarse_only = false
trash = false
history = false

hidden = false
ignore = ["archived-repo"]
skip = ["node_modules"]
cron · launchd · systemdGeplant
cargo broom --yes --keep-days 14 --keep-size 50MB \
  --clean-incremental --clean-doc --history --color never ~/GitHub
08 — Grenzen

Wofür cargo-broom nicht gedacht ist.

Das Repository benennt die Grenzen selbst – einige davon sind der Grund für die konservative Voreinstellung.

Nicht für CI-Caches

Ein über Läufe hinweg gehaltenes target/ wächst aus einem anderen Grund: Jeder Abhängigkeits-Bump lässt Fingerprints des vorigen Cargo.lock zurück. Das verlangt Invalidierung über Cache-Schlüssel, keine Altersheuristik. Das README verweist auf Swatinem/rust-cache, sccache und cargo-chef.

Fingerprint-Pruning ist experimentell

--experimental-fine ist standardmäßig aus und gehört zuerst in einen geprüften Trockenlauf – nicht in einen unbeaufsichtigten Job.

Version 0.1.0

Eine Alpha mit Sicherheitsfokus. Konservatives Target-Aufräumen, Inspektion, JSON-Reports und selektives Cache-Aufräumen sind vorhanden.

Aktive Projekte fallen durch das Altersraster

rust-analyzer führt cargo check aus, sobald ein Projekt im Editor offen ist, und frischt das Target laufend auf. Ohne --clean-incremental und --clean-doc landet ein solches Projekt auf Skipped und gibt nichts frei, egal wie groß sein Target ist.

Die Registry-Bereinigung sieht nur unterhalb des Verzeichnisses

registry wertet die Cargo.lock-Dateien unter dem angegebenen Verzeichnis aus. Projekte außerhalb zählen nicht mit – deshalb der Trockenlauf über die breitest mögliche Wurzel.

Wiederherstellung heißt neu bauen

Entfernt werden ausschließlich erzeugte Cargo-Ausgaben. Sie sind reproduzierbar, aber der nächste Build dauert entsprechend länger.

LizenzMIT-lizenziert. Die Terminal-Ausgabe – Metriken, Befundgruppen und die Next steps – kommt aus runemark, der CASOON-Bibliothek für lesbare CLI-Ausgabe. Das Hashing der rustc-Version für --toolchains und --installed ist aus cargo-sweep (MIT) übernommen, das seinerseits Cargos internen Fingerprint-Hash nachbildet.Lizenztext im Repository →
09 — FAQ

Häufige Fragen.

Kann ein Lauf etwas löschen, das nicht wiederherstellbar ist?

Entfernt werden ausschließlich erzeugte Cargo-Ausgaben, die ein Build neu erzeugt. Zusätzlich verschiebt --trash die Targets in den Papierkorb des Systems statt sie endgültig zu löschen. Was bleibt, sind längere Build-Zeiten nach dem Aufräumen.

Was passiert, wenn ich die Bestätigung vergesse?

Ein Aufruf ohne --dry-run, --interactive oder --yes bricht ab, bevor der Scan der Projekte überhaupt beginnt. Die Bestätigung lässt sich bewusst nicht in der Konfigurationsdatei hinterlegen.

Warum gibt ein Lauf bei meinem aktiven Projekt nichts frei?

Level A entfernt ein Target erst, wenn darin keep_days lang nichts angefasst wurde. rust-analyzer frischt das Target bei geöffnetem Editor laufend auf, also greift das Altersraster nie. Für solche Projekte sind --clean-incremental und --clean-doc gedacht: Beide Cache-Verzeichnisse baut Cargo bei Bedarf neu.

Wie oft sollte ein geplanter Lauf laufen?

Das README empfiehlt alle zwei Tage statt wöchentlich, weil inkrementelle Caches innerhalb von Stunden nachwachsen und der Lauf selbst günstig ist. Auf macOS ist StartCalendarInterval auf ungeraden Tagen zuverlässiger als StartInterval, dessen Timer bei jedem Neustart von vorn beginnt.

Was macht --experimental-fine genau?

Es entfernt einzelne Fingerprints und die dazu passenden gehashten Artefakte, ausgewählt über Alters- und Dublettenheuristiken. Jeder Eintrag wird gegen seine eigene Fingerprint-JSON geprüft, statt sich auf die Benennung des .fingerprint-Verzeichnisses zu verlassen. Ist keine JSON lesbar, gilt das Projekt als nicht unterstützt, statt zu raten.

Was schreibt --history mit?

Je Lauf eine Zeile pro Target mit der resultierenden Größe, in ein rollendes 14-Tage-Log unter ~/.local/state/cargo-broom/history.jsonl. Trockenläufe werden nie aufgezeichnet. Ab dem zweiten Eintrag zeigt der Report eine History-Metrik – also ob ein Target trotz regelmäßigem Aufräumen wieder wächst.

Erst der Trockenlauf.

Installieren, inspect über den eigenen Projektbaum laufen lassen und sehen, wie viel dort tatsächlich liegt.