gitのブランチの一覧を表示するときに最後にcommitした人の名前も一緒に表示する
gitでbranchが多くなってきたときに、どれが何をやっているbranchなのか読み取りづらくなっていくことがある。そのようなときに誰が更新しているbranchなのかがわかると便利ということを同僚から教えてもらい、確かにと思ったのでその方法をメモしておく。
前提条件
ここからは説明のためにjinja2のrepositoryを使う。
その上、通常は付けない -a
オプション付きでbranchを一覧する。
$ git branch * master $ git branch -a * master remotes/origin/2.10.x remotes/origin/2.11.x remotes/origin/2.9.x remotes/origin/GH-1194-formal-grammar remotes/origin/HEAD -> origin/master remotes/origin/isinstance-tests remotes/origin/master remotes/origin/website
この一覧中に最後にcommitした人の情報を併記したい。
--format
git branchには、--format
オプションがある。これを使えば対象のbranchを出力する差異の表現を自分の好みの形に変えられるらしい。
--format <format>
A string that interpolates %(fieldname) from a branch ref being shown and the object it points at. The format is the same as that of git-for-each-ref(1).
ちなみに、利用できるフィールド名は、git-for-each-refにかかれているものと同様のものだそう。
利用例
ここでは以下のような表現を返すことにする。
<branch名> <最後にcommitした人> <最終更新日>
いろいろ試しながら調整したところ、以下の様な形で指定してあげれば望んだ出力が得られそうだった。利用したいフィールドの参照方法が知りたい場合はgit-for-each-refのFIELD NAMESの部分を参考にすれば良さそう
$ git branch -a --format '%(HEAD) %(refname:short)%09%(committername)%09%(committerdate:relative)' * master David Lord 10 days ago origin/2.10.x GitHub 1 year, 4 months ago origin/2.11.x David Lord 3 weeks ago origin/2.9.x GitHub 1 year, 7 months ago origin/GH-1194-formal-grammar Kevin Brown 9 months ago origin/HEAD David Lord 10 days ago origin/isinstance-tests David Lord 1 year, 1 month ago origin/master David Lord 10 days ago origin/website Armin Ronacher 5 years ago
細々と自分の理解をまとめたものを箇条書きにしてみる。
%(fieldname)
と言う形でフィールドを指定する- 特定のfirldによっては、
%(fieldname:<flavor>)
というような形で出力形式を変更できる - current branchを
*
と表現するのはHEAD - TAB文字は'%09'と表現する
この辺は好みで調整すれば良いと思う。色も付けられるらしいが不要なのでスキップ。
整形
タブ区切りはパイプでつなげるのには良いのだけれど、もう少し手元で見やすくしたい。めんどくさいのでawkに任せる。
渡す部分は例えば _gitbranches
とでもしておく。
_gitbranches() { git branch $@ --format '%(HEAD) %(refname:short)%09%(committername)%09%(committerdate:relative)' } gitbranches() { _gitbranches $@ | awk -F'\t' '{printf "%-40s\t%-30s\t%s\n", $1, $2, $3 }' }
これで整形された表示になった。
$ gitbranches * master David Lord 10 days ago origin/2.10.x GitHub 1 year, 4 months ago origin/2.11.x David Lord 3 weeks ago origin/2.9.x GitHub 1 year, 7 months ago origin/GH-1194-formal-grammar Kevin Brown 9 months ago origin/HEAD David Lord 10 days ago origin/isinstance-tests David Lord 1 year, 1 month ago origin/master David Lord 10 days ago origin/website Armin Ronacher 5 years ago
見やすい1。未だにbashで生きているが、他のシェルに切り替えたほうが便利だったりするんだろうか?2
利用する名前の個人的なこだわり
gitbranches
はなんとも見慣れない表記ではあるけれど、これはわざとだったりする。自分用のaliasやシェル関数のようなものは-
や_
で区切らない感じ。
個人的には以下の様な形で名前をつけている。
_cmdname
-- helper的な関数。パイプで後続のコマンドに渡しやすい表現を返すcmdname
-- 個人的なwrapper。alias的なものcmd-name
-- 普通のサブコマンド
こうしてあげると、<command> <subcommand>
や <command>-<sub command>
や <command>_<sub command>
のときには途中で補完が止まるので便利。今回で言えば生の表現(git branch
)を使いたいときにはgit
の後にスペースを入力すれば良いし、誰かが作ったgitコマンドのラッパーを使いたいときはgit-
と書いてから補完させる。今回作ったような独自のaliasの場合には、gitb
などと書いて補完させれば良い3。
個人的な気持ち
個人的には、シェルの華はワンライナーだと思っていて、パイプへの渡しやすさこそが王様だと認識している面がある。それもあってかGUIにしろCLIにしろツールやアプリのようないわゆるviewerのようなものを作った瞬間にそれが依存の最終地点になってしまう感覚があり、どうにも個別に便利ツールを覚えようという気持ちにならなかったりする(ツール労からの逃避)。
とはいえ、便利なものは便利ではあるので、どのような手段であっても良いので楽がしたい。そんなわけでいろいろ試して使っていくのは悪くないことだとは思う4。