🗑️
特定のbranch以外を削除するシェルスクリプト
モチベーション
GitHubを使用して開発の仕事をしていると、手元にブランチが溜まってくるので、必要なブランチ以外はシュッと削除したいことがあります。
ということで、以下の要件でシェルスクリプトを作成しました。
- main、master、staging、カレントブランチは削除しない
- その時々で削除したくないブランチが存在する場合があるので、上記以外に削除しないブランチを柔軟に設定したい(引数で渡せればOK)
シェルスクリプト
以下のスクリプトを.zshrc
に追記しました。
※こちらはzshでのみ動作確認しています。
# main,master,staging,カレントブランチ,引数で渡したブランチ以外のブランチを削除するfunction
delete-branches() {
local default_excluded_branches=(main master staging) # デフォルトで除外するブランチの一覧
local excluded_branches=("${default_excluded_branches[@]}" "$@") # 全ての引数を配列として取得
# 除外するブランチのパターンを作成
local excluded_pattern=""
for branch in "${excluded_branches[@]}"; do
if [ -n "$excluded_pattern" ]; then
excluded_pattern+="|"
fi
excluded_pattern+="$branch"
done
# 除外パターンを作成
local pattern="^\s*($excluded_pattern|^\* )"
# 削除するブランチの一覧を取得
local branches_to_delete
branches_to_delete=$(git branch | grep -vE "$pattern")
# 削除するブランチの一覧を表示
if [ -n "$branches_to_delete" ]; then
echo "Branches to be deleted:"
echo "$branches_to_delete"
# 削除の確認を求める
if [ -n "$ZSH_VERSION" ]; then
read confirm"?Are you sure you want to delete these branches? (y/n) "
else
read -p "Are you sure you want to delete these branches? (y/n) " confirm
fi
if [ "$confirm" = "y" ]; then
echo "$branches_to_delete" | xargs -r git branch -D
echo "Branches deleted."
else
echo "No branches were deleted."
fi
else
echo "No branches to delete."
fi
}
シェルスクリプトを実行するとこのようになります。
$ git branch
* current
foo
hoge
main
master
staging
$ delete-branches foo
Branches to be deleted:
hoge
Are you sure you want to delete these branches? (y/n) y
Deleted branch hoge (was 1b71b67).
Branches deleted.
$ git branch
* current
foo
main
master
staging
Discussion