Your task
Delete every local branch whose upstream is gone, removing any attached worktree first. If nothing is marked [gone], report that and stop.
Steps
List branches with verbose status to surface
[gone]markers and any+prefix indicating an attached worktree:git branch -vList worktrees so you know which paths will be removed:
git worktree listRemove worktrees and delete
[gone]branches in one pass. Strips the+/*/space prefix, finds the worktree (if any), and force-deletes the branch:git branch -v | grep '\[gone\]' | sed 's/^[+* ]//' | awk '{print $1}' | while read branch; do echo "Processing branch: $branch" worktree=$(git worktree list | grep "\\[$branch\\]" | awk '{print $1}') if [ ! -z "$worktree" ] && [ "$worktree" != "$(git rev-parse --show-toplevel)" ]; then echo " Removing worktree: $worktree" git worktree remove --force "$worktree" fi echo " Deleting branch: $branch" git branch -D "$branch" done
Reporting
- Print which worktrees were removed and which branches were deleted.
- If no
[gone]branches exist, say "No cleanup needed" and stop. - Never delete branches that are not marked
[gone]. - Never touch the current working tree's root path.