gitのブランチの一覧を表示するときに最後にcommitした人の名前も一緒に表示する

gitでbranchが多くなってきたときに、どれが何をやっているbranchなのか読み取りづらくなっていくことがある。そのようなときに誰が更新しているbranchなのかがわかると便利ということを同僚から教えてもらい、確かにと思ったのでその方法をメモしておく。

前提条件

ここからは説明のためにjinja2のrepositoryを使う。

github.com

その上、通常は付けない -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

gist

参考


  1. この記事を画面幅の狭いスマホで見た場合には見やすくないかもしれない

  2. zshやfishの場合は、補完時にちょっとしたヘルプメッセージを表示できるというようなことを聞いたりはした。

  3. 他にはgithereと言う名前のaliasを作って利用している

  4. 完全にとばっちりかもしれないが、過去の時代にec2のインスタンスに勝手にpecoが有効になるように設定されたときに、苛つきを覚えたことを思い出した。この場合はpecoが悪いのではなく、自分勝手なデフォルトを暗黙に強制されたのが不快だった。pecoは実行したときに画面が一瞬リフレッシュされるuiなので、そのタイミングで頭の中が揮発してしまい何をやりたかったか忘れたりしたことも原因ではあったかもしれない。