1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

gitリポジトリのマージ済みで古いブランチをいっきに消す

Posted at

注意

ここで紹介するスクリプトの実行は各自の責任でお願いします。

モチベーション

プロジェクトでプルリクエストのブランチは溜まりがち。気がつくと数ヶ月分とか。
だいたいのgit hostのweb UIではちまちま消さなきゃいけない。ひとつずつ。

…… め ん ど い!!ザックリ選んでガサッと消したい!!

git delete-merged-branches

スクリプト(gist)にしました。
interactiveに

  • どのリモートのブランチで
  • どのブランチにマージ済みで
  • 最終コミット(ブランチのhead)がいつより古いか

を指定していっきにブランチをクリーンします。ローカルのブランチも古ければクリーン対象になります。
(繰り返しになりますが、冒頭にも書いた通り実行は自己責任で。)

前提

  • bash
  • git

セットアップ

  1. 上のスクリプトをダウンロード
  2. PATHの通った場所に置く
  3. 実行権限付与 (chmod +x)

実行

任意のリポジトリのディレクトリに移動し、git delete-merged-branchesを実行すると条件を聞かれます。
以下は入力値がデフォルトのまま(指定なし)の実行例。

  • originにある
  • origin/masterにマージ済みの
  • 最終コミットが4ヶ月以上前の

ブランチをクリーンします。

$ cd wok/my/awesome/product
$ git delete-merged-branches
remote (origin):
base (origin/master):
older than (4 months ago):
deleting: 36d0389 2020-02-01 ... (origin/feature/foo) ...  # 省略 time, committer, subject)
deleting: 02237d9 2020-02-19 ... (origin/feature/bar) ...
deleting: 3d6c833 2020-03-05 ... (origin/feature/baz) ...
deleting: 79d8e5a 2020-03-09 ... (work/some) ...  # ローカルブランチ
deleting: 41df532 2020-03-28 ... ...
remaining: 176e94c 2020-04-03 ... ...
remaining: 17f115a 2020-04-11 ... ...
...
...
continue? (yes/No): yes
continue...
To ... (remote URL)
 - [deleted]    feature/foo
To ...
 - [deleted]    feature/bar
To ...
 - [deleted]    feature/baz
...

まずリモートを指定します。デフォルトはorigin

remote (origin):

複数のリモートをトラッキングしていて、消したいブランチがmirror上にある場合は

remote (origin): mirror

と入力し、実行(enter)します。
次にクリーンしたいブランチがどのブランチにマージ済みか(ベースブランチ)を指定します。(←ここ重要)
デフォルトはorigin/master。リモート名も含めて指定します。

base (origin/master):

developブランチにマージ済みのブランチをクリーンしたい場合はorigin/developと入力します。

base (origin/master): origin/develop

最後にいつより古いブランチをクリーンするか指定します。デフォルトは4 months ago

older than (4 months ago):

remote、base同様に任意に指定できます。指定する日時は相対、絶対いずれも指定可能です。詳しくはgit logコマンドの--since--afterオプションを調べてみてください。

older than (4 months ago): 2 weeks ago
older than (4 months ago): 2020-04-01

条件の指定が終わるとbaseにマージ済みの(baseを除く)ブランチが時刻昇順で一覧され、指定した日時より古いものはdeleting:、新しいものはremaining:と表示されます。
下の例ではリモートのfeature/bazとローカルのsomeはクリーン対象、リモートのfeature/hogeとローカルのtweakは対象外となります。

deleting: 3d6c833 2020-03-05 ... (origin/feature/baz) ...
deleting: 79d8e5a 2020-03-09 ... (some) ...
remaining: 176e94c 2020-04-03 ... (origin/feature/hoge) ...
remaining: 17f115a 2020-04-11 ... (tweak) ...

最後に本当に実行を継続するか確認があります。ここでyesと指定でブランチのクリーンを行います。デフォルトではnoとなっているので未入力のままenterでなにもせず終了します。

continue? (yes/No): # 入力待ち。引き返すならここが最後。

オプション

interactiveに実行せず、オプションを引数で指定できます。

  • --remote -r: リモート
  • --base -b: マージベースブランチ
  • --older-than -s: 基準日時(いつより古いか)
    • "を忘れないように (--older-than "1 month ago")
  • --yes: 指定すると最後のyes/noなしでクリーン実行

  • --dry-run -n: ブランチの一覧までで終了(クリーンを実行しない)
  • --local-only: 条件にマッチするローカルのブランチのみクリーン

捕捉

  • どんな指定をしてもremoteのmasterブランチは常にクリーンの対象外です。
  • コミットの時刻比較(older than)にはcommitterdateが使われます。auhordateではありません。
  • どのブランチにもマージされていない(合流していない)ブランチは、このスクリプトでは消せません。手動で消してください。
  • 説明上「ベースブランチを指定」と書きましたが、<commit>で指定可能です。commit hash、tag、HEADHEAD~10など。

Note

「クリーンの対象期間にあるけど消したくない」といったブランチを除くオプションをつけようかどうしようか。--exclude <pattern>とか。
ローカルを対象外にするオプションをつけようかどうか。--remote-onlyとか。(ローカルにブランチを作らないからなぁ……。)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?