複数の Git ブランチを一括で削除するシェル関数

以前からなんとかならないかなーと思っていた、複数のローカルブランチを一気に消すコマンドを作った。いつ使うかというと、主に feat/ で始まるローカルブランチを一気に消したい時とか。

ほとんど以下のコードを参考にした。

# 複数の Git ブランチをまとめて削除する
function gbds() {
  if [ -z "$1" ]; then
    echo 'ブランチ名を指定してください'
    return 1
  fi
  
  local branch_name="$1";
  local list=`git branch | grep -i "$branch_name" | grep -v '*'`
  
  if [ -z "$list" ]; then
    echo '該当するブランチはありません'
    return 1
  fi
  
  echo "$list"
  read -p 'これらのブランチを削除してもよろしいですか? [Y/n] ' yn
  case "$yn" in
    [yY]) git branch | grep -i "$branch_name" | grep -v '*' | xargs git branch -D
          echo 'Deleted.'
          ;;
       *) echo '中止'
          return 1
          ;;
  esac
}

コレを ~/.bashrc に書いておき、以下のように使用する。

$ gbds feat

コレで、feat を含むローカルブランチを一括削除できる。

大枠は、

  1. git branch でローカルブランチ一覧を取得する
  2. grep -i "$branch_name" で、引数で指定された文言を含むブランチ名だけを残す
  3. さらに grep -v '*' で、カレントブランチが混じっていた場合に除外する
  4. こうして取得できた「削除したいブランチ一覧」を、xargs を使って git branch -D に流してやる

という流れ。

元のコードでは exit が使われていたが、~/.bashrc に書いた関数から exit が実行されるとターミナルが終了してしまったので、exitreturn に変えた。

どこかで紹介したか忘れたが、read -p '確認メッセージ' yn というイディオムで、変数 yn に入力されたキー文字列が格納される。コレを case 文でチェックして動作を切り替えてやれば、実行前確認ができる。

あとは個人的な好みでのちょっとした整形ぐらい。git コマンドがない場合とか、Git リポジトリでないディレクトリで実行した場合なんかは、local list= 部分のコマンドで標準エラー出力が出るが、もうこの辺の例外処理はいいや。w