複数の 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