複数の 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 を含むローカルブランチを一括削除できる。
大枠は、
git branchでローカルブランチ一覧を取得するgrep -i "$branch_name"で、引数で指定された文言を含むブランチ名だけを残す- さらに
grep -v '*'で、カレントブランチが混じっていた場合に除外する - こうして取得できた「削除したいブランチ一覧」を、
xargsを使ってgit branch -Dに流してやる
という流れ。
元のコードでは exit が使われていたが、~/.bashrc に書いた関数から exit が実行されるとターミナルが終了してしまったので、exit を return に変えた。
どこかで紹介したか忘れたが、read -p '確認メッセージ' yn というイディオムで、変数 yn に入力されたキー文字列が格納される。コレを case 文でチェックして動作を切り替えてやれば、実行前確認ができる。
あとは個人的な好みでのちょっとした整形ぐらい。git コマンドがない場合とか、Git リポジトリでないディレクトリで実行した場合なんかは、local list= 部分のコマンドで標準エラー出力が出るが、もうこの辺の例外処理はいいや。w