開発をしているとローカルブランチはガンガン溜まっていきます。
仕事だと平均1日1ブランチ作るくらいだと思いますので、2ヶ月放っておくと40ブランチくらいがローカルに存在します……。
そのままでいると git checkout
するときの自動補完の候補が出すぎて面倒になってきますので、
じゃあローカルブランチを削除するか〜と思っても、1件1件削除していくのはなかなか大変です。
どのブランチが作業中で、どれが消していいのか、
ブランチ名からだとわからないこともあります。古いものだと特に。
git branch --merged
というコマンドもありますが、
プルリクエストを「Squash and merge」している場合には、マージ済みブランチとして表示されてくれません。
そこで作ったのがこちら!
git-branch-delete-merged というCLIアプリケーションです!!
マージしたブランチも、「Squash and merge」したブランチも、
削除候補として表示され、その削除候補のブランチの git log
も見られるので
不安なものはそれを確認の上、安心してブランチ削除をすることができます!
go install github.com/nekonenene/git-branch-delete-merged@v1
で簡単にインストールすることができますし、
リリースページから圧縮済みバイナリファイルをダウンロードすることも可能です。
なお、これでローカルブランチの削除をおこなったあとは、
git remote prune origin
のコマンドで、ローカルに残っているリモートブランチ情報を削除しておくのがオススメです。
参考: リモートで消されたブランチが手元で残ってしまう件を解消する - Qiita
開発裏話
git-delete-squashed
リポジトリの README にも書いていますが、今回のコードは
https://github.com/not-an-aardvark/git-delete-squashed を大いに参考にしています。
「Squash and merge」したブランチを削除する方法を探していて
このリポジトリを見つけ使おうと思ったのですが、
コードを読んでいくと、確認なく対象ブランチをすべて削除してしまうと気付いて、
それはちょっと怖いな……って思いました。であれば作ろうかなと。
前回のブログ記事でも書きましたが、この作者さん天才です。
このリポジトリがなければ今回のCLIアプリケーションは作れませんでした。
Rust か Go か
最初は Rust で作ってみようと思って
Learning Rust by Writing a Command Line App in 15 Minutes を読んで
https://github.com/nekonenene/grrs-rust-practice のリポジトリで練習していたのですが、
「やっぱ Rust 難しいわ……」ってなって慣れている Go で書くことにしました。
今回作ったものを Rust で書き直す、というのは難易度がちょうどよさそうなのでやりたいですね。
【追記:実際に Rust でも書いてみました! ↓】
他OSへのクロスコンパイルのやりやすさは goreleaser-action のある Go に軍配が上がるように感じたので、
CLIツールを作るときは今後も基本は Go を使いそうです。
GitHub Actions で Rust のクロスコンパイルをしている例:
- https://github.com/jcaesar/patch-json/blob/v0.1.1/.github/workflows/release.yml
- https://github.com/metaplex-foundation/sugar/blob/v2.5.0/.github/workflows/build.yml
ありがとうReddit
実装でどうしてもわからないところがあり、
Reddit の Go コミュニティーで質問してみたらすぐに回答があり驚きました。
https://www.reddit.com/r/golang/comments/15w4ibl/is_it_possible_to_make_less_or_git_log_command/
これが Reddit の初投稿となりました。
おかげで最初のバージョンよりもわかりやすい git log
の表示が可能となりました。
返信をくださった方々、ありがとうございました。