$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

zawを使って最近更新したブランチをチェックアウトする

仕事でgit使っていてレビューとかしていると、どうもgitのブランチ切り替えがだるくなってくる。それで、zawで更新日時順でブランチが並んでいて、選択するとgit checkout出来ればすぐにブランチ切り替えが出来て便利ではと思いやってみた。

bindしたキーを押すと、更新日時順でブランチが表示されて、Enterを押すとチェックアウトする。更新日時順なので数回キーを押すだけで、チェックアウトしたいブランチに辿り着けることが多い。zawを使っているので絞り込みも出来る。

インストール

zawを使っていれば、導入は簡単。

まずzawのsourceのディレクトリに以下のファイルを置く。もしくは適当なところに置いて、zawのloadの後にsourceを使ってloadする。

次にzshrcで適当にbindingを決める。僕はC-x C-bに割り当ててる。

bindkey '^x^b' zaw-git-recent-branches

あとはC-x C-bを押したら使える。

zawが入ってない時は https://github.com/nakamuray/zaw あたりを見て入れてください。

技術的tips

今回は以下の二つを行った。

  • gitでブランチを更新日時順で表示する
  • zawで絞り込みを行う

gitでブランチを更新日時順で表示する

なんかいつもperlとかrubyとかでいろいろやってたりしたんだけど、git for-each-ref使ったら一行だった。git、奥が深すぎて全く使いこなせない。

ローカルブランチを更新した順に取得

git for-each-ref --format='%(refname:short)' --sort=-committerdate refs/heads

リモートブランチも一緒に取得

git for-each-ref --format='%(refname:short)' --sort=-committerdate refs/heads refs/remotes

zawで絞込みを行う

zawで絞込みを行うにはsource関数を定義し、その中でcandidates, actions, act_descriptions辺りを定義すればいいみたい。今回だったら

function zaw-src-git-recent-branches () {
    git rev-parse --git-dir >/dev/null 2>&1
    if [[ $? == 0 ]]; then
        candidates=( $(git for-each-ref --format='%(refname:short)' --sort=-committerdate refs/heads) )
    fi

    actions=(zaw-src-git-recent-branches-checkout)
    act_descriptions=("check out")
}

function zaw-src-git-recent-branches-checkout () {
    BUFFER="git checkout $1"
    zle accept-line
}

zaw-register-src -n git-recent-branches zaw-src-git-recent-branches

のように

  • zaw-src-git-recent-branchesを定義し、candidates, actions, act_descriptionsあたりを定義
  • actionでやることを関数で実装(zaw-src-git-recent-branches-checkout)
  • zaw-register-srcで登録

まとめ

zaw結構簡単にsourceを作れて便利だった。あとgit奥深すぎて色々出来て全く使いこなせない。