💬

マージ済みのブランチを削除する

2023/04/15に公開

マージ済みのブランチを削除する

結論

ブランチ固定版

git show-branch origin/master > /dev/null  2>&1;
if [ $? -eq 0 ]; then
    git branch --merged origin/master | grep -v -P "\*" | xargs -r git branch -d;
fi

関数化したもの

function rm-merge-base() {
    branch_name=$1
    git show-branch $branch_name > /dev/null  2>&1;
    if [ $? -eq 0 ]; then
        git branch --merged $branch_name | grep -v -P "\*|main|master|develop|release" | xargs -r git branch -d;
    fi
}


function rm-merge() {
    rm-merge-base origin/master
    rm-merge-base origin/develop
    rm-merge-base origin/main
}

解説

リモートブランチの存在確認を行う

以下のコマンドで origin/master が存在する場合は終了コード($?) は 0 になる。
存在しない場合は、場合は終了コード($?) は 0 以外 (128) になる。

git show-branch origin/master

コマンドの出力で標準出力も標準エラー出力も捨てたいので、 > /dev/null を行って出力をすててて、かつ、2>&1 をすることで標準出力と標準エラー出力をマージして /dev/null に出力する。

https://stackoverflow.com/questions/8223906/how-to-check-if-remote-branch-exists-on-a-given-remote-repository

git show-branch の結果による条件分岐

git show-branch コマンドが失敗した場合は次以降の処理を行わなくするために if [ $? -eq 0 ] で条件分岐する。git show-branch コマンドが成功した場合は終了コードが 0 になるのでそのときだけ以降の処理を実行する。

マージ済みのブランチの列挙

以下のコマンドで origin/master にマージしたローカルブランチを列挙する。

git branch --merged origin/master

カレントブランチの除外

カレントブランチの先頭には * がついているので
grep -v -P "\*"* がついている行を除外することでカレントブランチを除外する。

この際 master や develop ブランチも除外したい場合は
grep -v -P "\*|main|master|develop|release" のように | で区切って条件を複数指定する。

列挙したブランチの削除

xargs で列挙したブランチ名を git branch -d に渡す。
この際 -r オプションを指定することにより grep の結果が空の場合に git branch -d の引数が空で呼ばれることがないようにする。

備考

git show-branch origin/master > /dev/null 2>&1; および xargs -r git branch -d; の最後のカンマは、これらのコマンドを一行で記述できるようにするためのもので複数行で指定するときには削除してもよい。

Discussion