Garbage collect whole `target/`

Open
#13,136 12 comments 16 reactions 1 assignee View on GitHub

@0xPoe is already working on this.

Since Aug 30, 2026.

Assessment

This issue has not been assessed yet.

Description

C-feature-request S-accepted Z-gc Z-script

Note: for cleaning individual build units within a build-dir, see #6229

Problem

With "cargo script", the target directory is "hidden" from the user, making it easy to leak when you delete your script.

If we move forward with rust-lang/rfcs#3371, a similar situation will happen for regular packages.

If I haven't touched a project in a long while but have run rustup update, there might be nothing of use left in target/, wasting space.

Sometimes I want to cargo clean all projects on my system (see #11305).

Proposed Solution

We should track in the GC data base a list of

  • Root-manifests (ie the Cargo.toml / cargo script associated with the target directory)
  • Target directory
  • (maybe) The path to the Cargo.lock for future potential work like #13137 without having to infer the Cargo.lock (special logic needed for cargo-script, feature requests exist for even weirder situations)

Note that neither of the two fields can serve as a unique / primary key. If people use CARGO_TARGET_DIR=/tmp/cargo then multiple workspaces may point to the same target dir. Likewise, people may end up with multiple target dirs for one workspace.

We need to track the Cargo.toml / cargo script because the workspace root is ambiguous when it comes to cargo scripts.

Example entries for CARGO_TARGET_DIR=/tmp/cargo :

id workspace-manifest target dir timestamp
? /foo/Cargo.toml /tmp/cargo ?
? /bar/Cargo.toml /tmp/cargo ?
? /baz/script.rs /tmp/cargo ?

Example entries for rust-analyzer target dir

id workspace-manifest target dir timestamp
? /foo/Cargo.toml /foo/target ?
? /foo/Cargo.toml /foo/target-ra ?
? /bar/Cargo.toml /bar/target ?
? /bar/Cargo.toml /bar/target-ra ?
? /baz/script.rs ~/.cargo/target/... ?

Forms of cleanup

  • Delete target/ if unused for X time (this is in the "locally recreatable" category)
  • Delete all target/ (I just upgraded Rust, maybe rustup could suggest this)
  • Delete leaked target/ (workspace doesn't exist)
    • However, it might be transient (on a thumb drive). Should we make this time based?
Notes

No response

Dominant language
Rust
Stars
15.5k
Forks
3k
Avg merge
23h 30m
Merged PRs (30d)
51

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from rust-lang/cargo

All issues in rust-lang/cargo

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.