うならぼ

どうも。アフィリエイトとか広告とか解析とかは/about見てね。

Gitで不要なブランチを列挙する方法いろいろ

マージされたまま放置していたブランチとかその辺を掃除したかった。

不要なブランチを列挙できれば | xargs git branch -D でローカルブランチを削除したり、| xargs git push origin -d でリモートブランチを削除したりできるわけだ。

直接マージされたブランチ(=masterから辿れるコミット)

git branch にはちょうどマージ済みのものを抽出するオプションがある。

git branch --merged master

--format "%(refname:short)" をつければHEADであることを表す * を消せる。

upstreamが消滅しているブランチ

GitHubでPRを送ってマージされてその場でブランチを消した、とか。

そういったブランチは git branch -v だと [gone]git branch -vv だと [origin/hoge: gone] といった形で表示されるが、コミットメッセージにそういった文字列が含まれているかもわからない。

この [gone] は書式文字列では %(upstream:track) で表示できるので、自分で指定した方が安全になる。

git branch --format "%(refname:short) %(upstream:track)" | grep "\[gone\]" | cut -d" " -f1

ローカルでだけ消したブランチ

これを一括で消していいかどうかは運用によるが、ローカルでブランチ作ってPR投げておしまい、みたいなケースならいけると思う。

全てのブランチをpushしてよければ、--prune というオプションがある((まるごと同期というと --mirror なんてオプションもあるが、これはrefsをまるごとミラーする前提なので、リモートのrefをremotes以下に分離する普通のclone元に対して使うものではない。))。

git push --all --prune origin

削除だけしたい場合、そういったコマンドやオプションはなさそうなので、ローカルとリモートのブランチの差分を取ってみる。

comm -13 <(git branch | sed 's|*| |' | sort) <(git branch -r --list origin/* | sed -E 's#origin/|.+ -> .+##' | sort)

ローカルのブランチ一覧からは * 印を消し、リモートのブランチ一覧からは origin/ の部分を消してHEADを除外する。それ以外の symbolic-ref があることを考慮していないが、まあ大抵はないだろう…。

ところでリモートの HEAD が参照していたブランチを消してしまった場合、git remote set-head で変更することができる。手動でブランチを指定したり、-a でリモートの情報に合わせたりできるが、そもそもこれいるんだろうか。-d で消してちょっと様子を見てみよう。

squashマージされたブランチ

こいつが厄介。squashマージによるコミットはマージしたブランチのコミット群と履歴が連続していないので、履歴を辿ってもマージ済みかどうか判断することができない。

そこで見つけたのが、git cherry コマンドを使った方法。

not-an-aardvark/git-delete-squashed: Delete branches that have been squashed and merged into master

ちょっと短くしつつ、やっぱり長いのでここでは \ で行を分割して書く。

git branch --format="%(refname:short)" | \
while read branch; do
    mergeBase=$(git merge-base master $branch) && \
    [[ $(git cherry master $(git commit-tree $(git rev-parse $branch^{tree}) -p $mergeBase -m _)) == "-"* ]] && \
    echo $branch;
done

git cherry はブランチポイントからの各コミットについて、相手のブランチに既に取り込まれているかをファイルの中身で判定してくれるので、squash されていようと問題ない。ただコミット単位での判定になるため、例えば最終的に残らなかった変更のコミットについても評価されてしまうという git cherry-pick 同様の問題があり、これを防ぐために上の例では git commit-tree で squash コミットを作成している。結果が一行になるので判定が楽というのもある。

ただこれまでのパターンと比べるとやはり時間がかかるので、他の可能性を先に調べたり、判定除外を指定できるようにあれこれ足してシェルスクリプトにした。プレビューしてから再評価することなく本番を実行できるように、コピペ用のワンライナーも出力するようにした。

https://gist.github.com/unarist/2f6da154ddb30eb52993713e9d064a83

CDを紹介する記事

はてなブログの設定でアソシエイトIDを指定していたのに紹介している記事がほとんどなかった*1ことに気づき、かといってしれっとアフィリエイトリンクを貼るのは個人的に迷うところがあるので、それ用の記事を書いてみることにした。

以下の商品リンクを踏むとAmazon.co.jpアソシエイトでもって紹介料が発生したりしなかったりするので、(Amazon|アフィリエイト)が嫌いな人は申し訳ないですが商品名でググるなりなんなりしてもらえれば。あとレビューが雑だけど怒らないでね

デレマス

デレマスはデレステや周辺のオタクのせいおかげで個別に気になっている曲も多く、これだって感じのベスト盤もなくて、やむなくシングルも色々買っている。Amazonとかだと試聴できないけれどYouTubeにだいたい公式で上がってる。

THE IDOLM@STER CINDERELLA MASTER EVERMORE

THE IDOLM@STER CINDERELLA MASTER EVERMORE

曲名アーティスト名共に前方一致泣かせなあれ。

周子ってなんか魅力あるの?と知り合いに聞かれたが、曲を聞いてCD買っただけなのでよくわからない。謎の献血アピールは悪くなかった。

THE IDOLM@STER CINDERELLA MASTER 039塩見周子

THE IDOLM@STER CINDERELLA MASTER 039塩見周子

属性曲シリーズはカバー曲もドラマパートも入ってて三度おいしい。アタポンと咲いてJewelも買ったけれど、やっぱりこれが好き。

あとこういう曲好きなので薦めてもらえると喜びます。lilac timeは割と伏兵だった。

THE IDOLM@STER CINDERELLA MASTER 041大槻唯

THE IDOLM@STER CINDERELLA MASTER 041大槻唯

アイカツ

Amazonっていうかjmd試聴プレイヤーでだいたい試聴できるので試聴してどうぞという感じがある。だいたい好き。

TVアニメ/データカードダス アイカツ! 2ndシーズンベストアルバム SHINING STAR*

TVアニメ/データカードダス アイカツ! 2ndシーズンベストアルバム SHINING STAR*

TVアニメ/データカードダス「アイカツ!」4thシーズン挿入歌ミニアルバム「Wonderful Tour」

TVアニメ/データカードダス「アイカツ!」4thシーズン挿入歌ミニアルバム「Wonderful Tour」

  • アーティスト: AIKATSU☆STARS!,みほ・ななせ from AIKATSU☆STARS!,るか・ななせ from AIKATSU☆STARS!,もな from AIKATSU☆STARS!,ななせ・もな from AIKATSU☆STARS!,かな from AIKATSU☆STARS!,みき from AIKATSU☆STARS!,るか・かな from AIKATSU☆STARS!,るか・もな・みき・みほ・ななせ・かな from AIKATSU☆STARS!,GENMAI,只野菜摘
  • 出版社/メーカー: ランティス
  • 発売日: 2016/01/27
  • メディア: CD
  • この商品を含むブログ (2件) を見る

いくつか曲名を挙げろと言われると、Thriling Dreamとか、Sweet Sp!ceとか、Blooming Bloomingとか、ミエルミエールとか、他にも…え、聞いてない?そう。

アイカツスターズアイカツフレンズはまた別だし、スマホアプリであるところのフォトカツ向けに作られた曲はまた別。STARDOM!とかPOPCORN DREAMINGとか、話題になったりならなかったりしたDreaming birdとか。

アニメ

アニメ最近疎くって、音ゲーで知って周回遅れで買うみたいなのが増えている。

今になって絶望先生やっぱいいわねになった。最近豚のご飯も聞けるようになった。

絶望大殺界

絶望大殺界

絶望レストラン

絶望レストラン

2曲目は大久保瑠美のにゃんにゃんにゃーんを聞く曲。

TVアニメ「あっちこっち」エンディングテーマ 手をギュしてね

TVアニメ「あっちこっち」エンディングテーマ 手をギュしてね

その他

ソニックのCDがほしくて適当にこれを買ってみたけどよい。

HISTORY OF SONIC MUSIC 20th Anniversary Edition

HISTORY OF SONIC MUSIC 20th Anniversary Edition

あとここなつではキモチコネクトが好きです。よろしくお願いします。

*1:しかもそのわずかな記事はID設定前に書いたものらしく、はてなのデフォルトIDのままだった。意味がない。