🗑️

特定のbranch以外を削除するシェルスクリプト

2024/08/08に公開

モチベーション

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