Claude Code, Cursor and Codex run in git worktrees so several agents can work at once. Each worktree is a full checkout with its own node_modules and build output, and they pile up quietly. One Claude Code user found 27 forgotten worktrees using 80 GB (issue 63087). 61 Codex worktrees of a Rails app took about 100 GB (issue 35383).

Where they live

  • Claude Code: .claude/worktrees/ inside each repository (older versions used ~/.claude-worktrees)
  • Cursor: ~/.cursor/worktrees/
  • Codex: ~/.codex/worktrees/, on a detached HEAD rather than a branch

See what they take

git worktree list # inside a repository du -sh .claude/worktrees/* 2>/dev/null | sort -h # inside each repository du -sh ~/.cursor/worktrees/*/* ~/.codex/worktrees/* 2>/dev/null | sort -h 

Check before you remove one

git -C <path> status --short # prints nothing if nothing is uncommitted git -C <path> status --short --ignored # .env and other ignored files you'd lose git log --oneline main..<branch> # prints nothing if the branch is merged 

Squash merges leave the commits out of main, so ask GitHub instead: gh pr list --head <branch> --state merged --json headRefOid, and check it matches git rev-parse <branch>.

Remove it

git worktree remove <path> 

Skip --force: without it, git refuses when there's uncommitted work, which is the point. The branch stays, so nothing committed is lost.

Stop the pile-up

  • Claude Code: lower cleanupPeriodDays (default 30)
  • Cursor: lower cursor.worktreeMaxCount (default 25)
  • Codex: lower the limit of 15 kept worktrees in its settings

The full guide covers the rest, including Codex's detached worktrees and a Codex bug that saved 54,504 crash reports in a day.

I make Mopup, a Mac app that runs these checks for you and removes only finished worktrees, never with --force. It's free to scan.