progrhyme's tech blog

主にIT関連の技術メモ

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 コマンドは動くでしょうか、というのが気になってきました。

参考

*1:Plain Old DocumentationっていうPerlのドキュメントで使われる記法です。