MITupdated 21d ago
Delete local branches whose remote tracking is gone or merged, and remove their associated worktrees.
Git Clean Gone 能做什么?
name: git-clean-gone description: Clean up local branches with deleted remote tracking and their worktrees. Use after merging PRs to remove stale branches, detect squash-merged and rebased branches, and clean up associated worktrees. argument-hint: "[--dry-run] [--no-worktrees]" allowed-tools: Bash user-invocable: true disable-model-invocation: true
Clean Gone
Delete local branches whose remote tracking is gone or merged, and remove their associated worktrees.
Arguments
Parse from $ARGUMENTS:
| Flag | Default | Purpose |
|---|---|---|
| (none) | — | Full cleanup: gone + merged branches + worktrees |
--dry-run |
off | Preview only, no changes |
--no-worktrees |
off | Branches only, skip worktree removal |
Preprocessed context
- Default remote: !
git for-each-ref --format="%(upstream:remotename)" refs/heads/main 2>/dev/null || git remote | head -1 2>/dev/null || echo "origin" - Default branch: !
basename "$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo refs/remotes/origin/main)" - gh CLI: !
command -v gh >/dev/null 2>&1 && echo "available" || echo "unavailable"
Constraints
- First action MUST be Bash — preamble text wastes a turn and delays the actual cleanup
- Never delete the current branch — skip and report in summary
- Never remove the main worktree — only feature/task worktrees
- Execute
"${CLAUDE_SKILL_DIR}/scripts/clean-gone.sh"as a single Bash invocation - Output summary directly as text (NOT via bash/printf)
Workflow
Phase 1: Execute Cleanup Script
Execute "${CLAUDE_SKILL_DIR}/scripts/clean-gone.sh" immediately, passing through any flags from $ARGUMENTS.
- No flags → full cleanup (gone + merged branches + worktrees)
--dry-run→ preview only, no changes--no-worktrees→ gone branches only, no worktree removal or merge detection- Invalid flag → script exits with error, show valid options (
--dry-run,--no-worktrees), stop
Phase 2: Output Summary
Parse script output line prefixes and render formatted summary directly as text.
Line prefixes (from script output):
| Prefix | Meaning |
|---|---|
DELETED:branch:reason |
Deleted branch |
REMOVED_WT:worktree:branch |
Removed worktree |
SKIPPED:branch:reason |
Skipped branch |
KEPT:branch:reason |
Kept branch |
KEPT_WT:worktree:branch:reason |
Kept worktree |
Dry-run uses WOULD_DELETE, WOULD_REMOVE_WT, WOULD_SKIP, WOULD_KEEP, WOULD_KEEP_WT.
Summary format:
**Cleanup Summary**
Deleted:
🗑️ fix/old-feature (gone)
🗂️ fix-old-feature-wt (worktree)
Skipped:
⚠️ feat/current-work (current branch)
Kept:
🗂️ wt-name (worktree) - branch (N unmerged)
ℹ️ feat/in-progress (14 unmerged)
Only include sections with items. Empty state: ✅ Repository already clean — no branches to process
Dry-run header: **Dry Run Preview** with "Would delete/remove" phrasing.
Cleanup Logic
- Uses pre-resolved remote name and default branch from preprocessed context
- Deletes branches marked
[gone](remote tracking deleted) - Deletes branches fully merged via rebase/cherry-pick (
git cherry) - Deletes branches squash-merged via PR (
gh pr list --state merged) when gh CLI is available - Removes associated worktrees before branch deletion
- Skips main and current branch
- Falls back gracefully if gh CLI is unavailable (see preprocessed context)
Edge Cases
- Invalid flags: report unknown flag, show valid options, stop
- No cleanable branches: report "Repository already clean"
- Current branch is gone/merged: skip deletion, warn in summary
- Uncommitted changes in worktree: force remove with
--forceflag - No
ghCLI (see preprocessed context): squash merges won't be detected, onlygit cherryused - No remote configured: remote from preprocessed context used as fallback
Example Invocations
/git-clean-gone
/git-clean-gone --dry-run
/git-clean-gone --no-worktrees
安装
把 Git Clean Gone 添加到你的客户端。选择你正在使用的那个。
npx skills add smykla-skalski/saiInstalls every skill in the repository, then prompts for which to keep.
/plugin marketplace add smykla-skalski/saiAdds the repository as a plugin marketplace; install individual plugins with `/plugin install`.
git clone https://github.com/smykla-skalski/sai
cp -r claude/git-clean-gone/skills/git-clean-gone ~/.claude/skills/A skill is a plain directory. Copy it into `.claude/skills/` in a project or in your home directory.
评分
80 / 100
优秀