Phy Git Branch Janitor — Phy Git 分支清理员
v1.0.3Git 分支清理助手。审计所有本地和远程分支,将其分类为安全可删除(已合并)、过时未合并(旧且无打开的 PR)或活跃。检测仅存在于本地但不在远程的分支(孤儿分支),找到没有提交在 main 分支前的分支,并可选地使用 GitHub/GitLab PR 来确认合并状态。输出一个优先级的删除计划,包含一个可复制的清理命令。对于本地审计,无需外部 API;可选使用 GitHub CLI 来检查 PR 状态。触发关键词包括“clean up branches”、“stale branches”、“branch cleanup”、“delete old branches”、“git branch audit”和“/git-branch-janitor”。
运行时依赖
安装命令
点击复制技能文档
Git 分支清理员 审计您的存储库中的每个分支 — 本地和远程 — 并生成一个优先的清理计划。找到已经合并的分支、没有活动的陈旧分支以及从未推送到远程的分支。获取一个复制粘贴命令来安全地清理所有这些。适用于任何 Git 存储库。可选的 GitHub CLI 用于 PR 交叉引用。零配置。 触发短语“清理分支”,“分支清理”,“删除旧分支”,“陈旧分支”,“孤立分支”,“分支审计”,“Git 卫生”,“我可以删除哪些分支”,“/git-branch-janitor”
步骤 1:获取最新状态 # 同步远程分支状态(从本地跟踪中修剪已删除的远程分支) git fetch --all --prune # 显示当前分支(以避免删除它) git branch --show-current 重要:永远不要删除当前分支、main、master、develop 或 release/ — 这些是受保护的。
步骤 2:清点所有分支 同时运行所有三个命令以构建完整的图景: # 本地分支 git branch --format='%(refname:short)' | sort # 远程分支 git branch -r --format='%(refname:short)' | sed 's/origin\///' | sort # 所有带有最后提交元数据的分支 git for-each-ref --sort=committerdate \ --format='%(refname:short)|%(committerdate:relative)|%(committerdate:iso)|%(authorname)|%(subject)' \ refs/heads refs/remotes/origin \ | grep -v "HEAD$" \ | sort -t'|' -k3 解析每个分支的: 最后提交日期 → 年龄范围(< 7 天,7-30 天,30-90 天,> 90 天) 作者 → 谁拥有这个分支 主题 → 最后提交消息(关于该分支的提示)
步骤 3:分类每个分支 类 1:安全删除(合并) 完全合并到默认分支的分支: # 合并到 main 的分支(用您的默认分支替换 'main') DEFAULT=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's/refs\/remotes\/origin\///' || echo "main") # 本地合并分支 git branch --merged "$DEFAULT" | grep -v "^\" | grep -vE "^\s(main|master|develop|release/)" | sed 's/^ //' # 远程合并分支 git branch -r --merged "origin/$DEFAULT" | grep -v "HEAD" | grep -vE "(main|master|develop|release/)" | sed 's/origin\///' | sed 's/^ //' 规则:如果一个分支已经完全合并到默认分支,则可以安全删除。
类 2:陈旧未合并(需要审查) 未合并但没有最近活动的分支: # 未合并到 main 且超过 30 天的分支 git for-each-ref \ --format='%(refname:short)|%(committerdate:iso)|%(committerdate:relative)' \ refs/heads \ | while IFS='|' read -r branch date reldate; do # 跳过受保护的分支 echo "$branch" | grep -qE "^(main|master|develop|release/)" && continue # 检查是否合并 git merge-base --is-ancestor "$branch" "$DEFAULT" 2>/dev/null && continue # 检查年龄 > 30 天 DAYS=$(( ($(date +%s) - $(date -d "$date" +%s 2>/dev/null || date -j -f "%Y-%m-%d %H:%M:%S %z" "$date" "+%s" 2>/dev/null)) / 86400 )) [ "$DAYS" -gt 30 ] && echo "$branch|${DAYS}d old|$reldate" done 规则:这些需要人工审查 — 是否放弃了这个分支?是否成为草稿 PR?
类 3:孤立(仅本地,从未推送) 仅存在于本地且没有远程跟踪分支的分支: git branch -vv | grep ": gone]" | awk '{print $1}' # 这些曾经有远程跟踪,但远程跟踪已被删除(通过 GitHub UI 合并 PR) git branch -vv | grep -v "\[origin" | grep -v "^\" | awk '{print $1}' # 这些从未被推送
类 4:仅提前(未推送的工作) 具有远程未提交的提交的分支 — 不要删除这些: # 检查哪些分支在远程前面 git branch -vv | grep "ahead"
步骤 4:交叉引用 PR(可选 — 需要 gh CLI) 如果 gh 可用,则使用 PR 状态增强陈旧未合并分支: # 检查分支是否有打开或合并的 PR for branch in $STALE_BRANCHES; do PR=$(gh pr list --head "$branch" --state all --json number,state,title --jq '.[0]' 2>/dev/null) if [ -n "$PR" ]; then STATE=$(echo "$PR" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['state'])") TITLE=$(echo "$PR" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['title'][:50])") NUMBER=$(echo "$PR" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['number'])") echo "$branch → PR #$NUMBER ($STATE): $TITLE" else echo "$branch → 未找到 PR" fi done 具有 PR 上下文: 合并 PR → 可以安全删除 关闭 PR → 被放弃,确认用户后删除 打开 PR → 活动工作正在进行 — 永远不要删除 没有 PR → 是否在其他地方捕获了该工作?请询问用户。
步骤 5:生成清理命令 生成三个批次的命令: 批次 1:自动安全删除 # 删除合并的本地分支 git branch -d feat/add-login feat/fix-typo chore/update-deps # 删除合并的远程分支 git push origin --delete feat/add-login feat/fix-typo chore/update-deps 批次 2:已删除远程清理(孤立) # 这些曾经有远程跟踪,但远程跟踪已被删除(通过 GitHub UI 合并 PR)