git pull --pruneしてマージ済みのローカルブランチを削除するgitのサブコマンドを作った
むしろ、どうして今までやってなかったんだろうっていう感もあります。
branch作ってpushしてプルリクエストしてリモートでマージされたらゴミが残りますよね。
今まで何度 git fetch -p
して git pull
して git branch -d <手元のbranch>
と打ってきたことか。
ググればワンライナーをそのままaliasしているような事例も見つかります(後掲)が、私はそこそこ(?)丁寧にシェルスクリプトで書いてみました。
使い方
使い方としては、ひとまずヘルプの表示をちょっと貼ってみます。
% git bc -h NAME git-branch-clean - git subcommand to clean up merged local branches SYNOPSYS git branch-clean [OPTIONS] DESCRIPTION This is a git subcommand to clean up merged local branches. Branches "master" and "develop" are whitelisted by default. You can change the whitelist by "-a|--allow BRANCH" option. Current branch is always whitelisted. OPTIONS -i Interactive mode. Show prompt before deleting branch. -a|--allow BRANCH Add argument as branch name to whitelist which won't be deleted. This option can be specified multiple times. Ex) # Whitelist = (develop, master, CURRENT) git branch-clean # Whitelist = (foo, CURRENT) git branch-clean -a foo # Whitelist = (test, master, CURRENT) git branch-clean -a test -a master -p|--pull Execute "git pull --prune" before deleting branches. -v|--verbose Verbose output. -h|--help Show help text.
だいたい書いてある通りですね。
補足としては、消さないbranchのホワイトリストは環境変数 GIT_BRANCH_CLEAN_WHITELIST
でも配列カンマ区切り文字列で設定できるようにしているので、branchの運用ルールが違うリポジトリなら、 direnv
を使って .envrc
に書いておけば済みます。
また、私は上のスクリプトをPATHの通ったディレクトリに置いた上で、次のようにgitconfigでaliasを設定しています。
[alias] plr = pull --prune bc = branch-clean bcp = branch-clean --pull
最近は9割方 git bcp
を打ってますが、たまに上の2つを打つこともあります。
5/24 追記
Bashでは配列はexportできないことに気がついたので、環境変数 GIT_BRANCH_CLEAN_WHITELIST
に渡すbranchのリストはカンマ区切り文字列とするように修正しました。
余談① git pull の --prune オプションについて
git pull
にもこのオプションがあるのは、今回、上のシェルスクリプトを書きながら調べるまで知りませんでした。
これ、コマンドマニュアルには明記されてないんですよね。
https://git-scm.com/docs/git-pull
ただ、「More precisely, git pull runs git fetch with the given parameters and calls git merge」と書いてあるので、さもありなんって気はします。
-P|--prune-tags
とか通らないオプションもあったので、単にマニュアルに記入漏れてるだけかもしれませんが。
余談②シェルスクリプトのドキュメントコメントについて
昔、何かの本を見て今回の git-branch-clean
のようにシェルスクリプト末尾にPOD形式(*1)でヘルプを書く、というのを続けていますが、あまり一般的ではない気がします。
GoogleのShell Style Guideでもふつうにコメントですしね。
みなさんのお手元では pod2text
コマンドは動くでしょうか、というのが気になってきました。
参考
- gitでbranchをお掃除する際のチートシート - Qiita
- gitで便利なエイリアス達 - Qiita#マージ済みブランチをまとめて消す
- リモートで消されたブランチが手元で残ってしまう件を解消する - Qiita
*1:Plain Old DocumentationっていうPerlのドキュメントで使われる記法です。