if [[ ${#branches[@]} -eq 0 ]]; then echo"✅ 没有匹配的本地分支" return 0 fi
echo"即将删除以下本地分支:"
# 使用关联数组存储序号和分支名称的映射关系 declare -A branch_map local i=1 for branch in"${branches[@]}"; do branch_map[$i]="$branch" echo"$i) $branch" ((i++)) done
print -n "选择要删除的分支编号(多个用空格分开): " read -r input
local selected_indexes=(${(s. .)input})
if [[ ${#selected_indexes[@]} -eq 0 ]]; then echo"❌ 没有选择任何分支" return 1 fi
# 遍历用户选择的序号 for index in"${selected_indexes[@]}"; do if [[ "$index" =~ ^[0-9]+$ ]]; then # 使用关联数组直接查找分支名称 local branch="${branch_map[$index]}"
if [[ -n "$branch" ]]; then# 检查是否找到了对应的分支 echo"✅ 正在删除分支 $branch..." if git branch -D "$branch"; then echo"✅ 分支 $branch 删除成功。" else echo"❌ 删除分支 $branch 失败,可能存在其他问题。" fi else echo"❌ 无效的分支选择:$index (超出范围或不存在)" fi else echo"❌ 输入无效:$index 不是有效的分支编号" fi done }
# 删除远端分支 drb() { # 检查是否在 Git 仓库内 if [[ ! -d .git ]]; then echo"❌ 错误:当前目录不是 Git 仓库" return 1 fi
local prefix="$1"
if [[ -z "$prefix" ]]; then echo"用法: drb <分支前缀>" return 1 fi
# 更新本地远端分支信息 echo"正在更新本地远端分支信息..." if ! git fetch -p; then echo"❌ 更新本地远端分支信息失败,请检查网络连接或 Git 仓库状态。" return 1 fi echo"✅ 本地远端分支信息更新完成。"
# 获取远端分支列表 local remote_branches=($(git for-each-ref --format='%(refname:short)' refs/remotes/origin | grep "$prefix"))
if [[ ${#remote_branches[@]} -eq 0 ]]; then echo"✅ 没有匹配的远端分支" return 0 fi
echo"即将删除以下远端分支:"
# 显示分支列表 declare -A remote_branch_map local i=1 for branch in"${remote_branches[@]}"; do local display_branch=$(echo"$branch" | sed 's/^origin\///') remote_branch_map[$i]="$branch" echo"$i) $display_branch" ((i++)) done
if [[ "$input" == "q" ]]; then echo"操作已取消。" return 0 fi
local selected_indexes=(${(s. .)input})
if [[ ${#selected_indexes[@]} -eq 0 ]]; then echo"❌ 没有选择任何分支" return 1 fi
# 遍历用户选择的序号并删除远端分支 for index in"${selected_indexes[@]}"; do if [[ "$index" =~ ^[0-9]+$ ]]; then local full_branch="${remote_branch_map[$index]}" if [[ -n "$full_branch" ]]; then local branch=$(echo"$full_branch" | sed 's/^origin\///')
# 判断是否为 master 或 develop 分支 if [[ "$branch" == "master" || "$branch" == "develop" ]]; then echo"❌ 禁止删除 '$branch' 分支。master 和 develop 分支是受保护分支。" continue# 跳过该分支,继续处理下一个分支 fi
echo"✅ 正在删除远端分支 '$branch'..." if git push origin --delete "$branch"; then echo"✅ 远端分支 '$branch' 删除成功。" else echo"❌ 删除远端分支 '$branch' 失败,可能存在其他问题。 请通过 Web 界面或检查相关配置删除" fi else echo"❌ 无效的分支选择:$index (超出范围或不存在)" fi else echo"❌ 输入无效:$index 不是有效的分支编号" fi done return 0 # 删除完所有选择的分支后,直接退出 }
# 删除本地和远端分支 dab() { # 检查是否在 Git 仓库内 if [[ ! -d .git ]]; then echo"❌ 错误:当前目录不是 Git 仓库" return 1 fi
local prefix="$1" if [[ -z "$prefix" ]]; then echo"用法: dab <分支前缀>" return 1 fi
# 1. 更新本地远端分支信息 echo"正在更新本地远端分支信息..." if ! git fetch -p; then echo"❌ 更新本地远端分支信息失败,请检查网络连接或 Git 仓库状态。" return 1 fi echo"✅ 本地远端分支信息更新完成。"
# 2. 获取所有匹配的分支(包括本地和远程),去除重复的分支名称 local branches=() local branch # 获取所有本地和远程分支,去重,且排除 master 和 develop git branch -a | grep "$prefix" | grep -v -E "^(master|develop)$" | sed 's/\* //' | whileread branch; do if [[ "$branch" =~ remotes/origin/ ]]; then # 如果是远程分支,去掉 remotes/origin/ 前缀 branch="${branch#remotes/origin/}" fi # 将处理后的分支添加到列表中(去重) branches+=("$branch") done