🗑️

マージ済みのブランチを自動で消す git alias / hooks

2024/03/01に公開
2

設定すること

github上で、PRをマージして、remoteのブランチを削除したあと、
ローカルにブランチが残って溜まって行ってしまうので、削除すると思います。
1つずつ消していくのは面倒なので自分は下記のコマンドで自動で消すようにしています。

$ git delete-merged-branch

Deleted branch feature/branchA
Deleted branch feature/branchB
Deleted branch feature/branchC

中身は下記の通り

.gitconfig
[alias]
	delete-merged-branch = "!f () { git branch --merged|egrep -v '\\*|develop|master|main'|xargs git branch -d; };f"

処理の中身的には、
マージ済みのブランチをリストにして、develop|master|mainは除外して、ローカルから消すといういった感じです。

最悪、ローカルから消えてしまうだけなので、リモートから再度checkoutすることも可能です。

また、git hooksを使って、git pullの際や、マージ後に、自動で実行するように設定する事もできます。

.git/hooks/に post-merge というファイルを作って、

post-merge
#!/bin/sh
# post-merge hook to delete merged branches except main, master and develop
git delete-merged-branch

と書いて、

$ chmod +x .git/hooks/post-merge

で実行権限を与えれば、

マージ後 や Pull後に自動で実行してくれるようになります。
(どのブランチが消えたかは実行時に表示されます。)

追記(2024/03/08修正 )

コメントで、下記のようにfetch.pruneで同じことができるとご指摘いただいたのですが、

git config --global fetch.prune true

おそらく、
git fetch --prune は、リモートで削除されたブランチに対するrefをローカルから削除しているだけで、ローカルのブランチ自体は削除してくれないようです。(理解が間違えているかもしれません)
それか、自分のなにかの設定が間違えている可能性があります。

Discussion

rakiraki

git config --global fetch.prune true

で足りる気が

Keisuke KAWAHARAKeisuke KAWAHARA

なんと。
わざわざ記事に書いたように自作してました。
ご指摘ありがとうございます。
デフォルトの機能で事足りますね。今度からそちらを使うようにしようと思います。