$shibayu36->blog;

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

GitHubでの仕事を快適にするコマンドを紹介します

 趣味のプログラミングや仕事をgithubを使って行なっていると、「ちょっとこんなかんじの変更してみたんだけど、このcommit見てよ」とか、「このブランチのこのファイルちょっと見てくれない?」みたいなことがよく起こります。そういう時いちいちgithub上のページをポチポチ押して、URLを教えるみたいなことをやっているのが大変だったので、ターミナルからgithub上のページを開くコマンドを作ってみました。すでにこういうのあるかもしれません。

今回のコマンドで出来ること

  • commitを指定してgithub上の該当commitページを開く
    • HEAD^みたいな指定も出来る
  • ファイル名を指定して現在のブランチのそのファイルのページを開く
    • 行を指定してハイライトさせることも出来る
  • それらのコマンドをエディタなどから使うことでさらに便利に使う

openコマンドとperlに依存しているので、これらが使えない人は適宜コマンドいじってみてください。

open-github-from-commit

 これはcommitを指定することで現在のrepositoryの該当commitページを開くコマンドです。https://github.com/shibayu36/config-file/blob/master/bin/open-github-from-commit においてあります。
 使い方は以下のとおり。

# HEADのcommitページを開く
# https://github.com/shibayu36/config-file/commit/3fd0b26f83ae51de7bfdcb2cb2ca0a2cdfea05cf みたいなページが開く
open-github-from-commit

# commitを指定してページを開く
open-github-from-commit 07c40b8

# HEAD^ みたいな指定も出来る
open-github-from-commit HEAD^

以下の様なページがブラウザで開かれます。
f:id:shiba_yu36:20130118205745p:plain:h400

open-github-from-file

 これはファイルを指定することで現在のrepositoryの、現在のbranchの該当ファイルページを開くコマンドです。
 使い方は以下のとおり。

# ファイルを指定して開く
# masterにいた場合、https://github.com/shibayu36/config-file/blob/master/bin/open-github-from-commit のようなページが開く
open-github-from-file bin/open-github-from-commit

# ディレクトリ指定も可能
open-github-from-file bin/

# repositoryのtopにいなくてもやってくれる
cd bin; open-github-from-file open-github-from-commit

# branch変えたらそのbranchのファイルを見てくれる
git checkout other-branch; open-github-from-file bin/open-github-from-commit

# lineを指定するとハイライトした状態で表示してくれる
open-github-from-file bin/open-github-from-commit 5

# lineの範囲指定も出来る
# 5~15行目をハイライト
open-github-from-file bin/open-github-from-commit 5 15

以下の様なページがブラウザで開かれます。
f:id:shiba_yu36:20130118210037p:plain:h400

hub.host

 上の2つのコマンドはhubコマンドと同様、hub.hostを設定しておくことでgithub enterpriseなどを使っていても使うことができます。例えば以下の様な設定をrepository上でやっておけば良いです。

git config --local hub.host my.git.org

エディタからコマンドを使って更に便利に

 ファイルの行指定は普通にコマンドラインから使うと便利ではありませんが、エディタから利用してあげると非常に便利になります。
 例えばemacsで以下のような設定をします。

(defun chomp (str)
  (replace-regexp-in-string "[\n\r]+$" "" str))

(defun git-project-p ()
  (string=
   (chomp
    (shell-command-to-string "git rev-parse --is-inside-work-tree"))
   "true"))

(defun open-github-from-current ()
  (interactive)
  (cond ((and (git-project-p) (use-region-p))
         (shell-command
          (format "open-github-from-file %s %d %d"
                  (file-name-nondirectory (buffer-file-name))
                  (line-number-at-pos (region-beginning))
                  (line-number-at-pos (region-end)))))
        ((git-project-p)
         (shell-command
          (format "open-github-from-file %s %d"
                  (file-name-nondirectory (buffer-file-name))
                  (line-number-at-pos))))))

 これをしたあとに以下の様な状態で、open-github-from-currentを実行してあげます。
f:id:shiba_yu36:20130118210448p:plain

 そうすると選択範囲がハイライトされた状態でgithubが開きます。
f:id:shiba_yu36:20130118210656p:plain

 これがあると、branchを変えていろいろ編集して後に、ちょっとこの部分レビューしてよみたいなのが簡単に出来て、非常に捗ります。emacsではコマンドを使っているだけなので、別のエディタでも簡単に同じようなことをできますね。

今回の技術的tips

git rev-parse

 gitのrepository上のいろいろな情報を見ることが出来るコマンド。今回はHEAD^などをcommitのsha1に変更するのに使っています。それ以外にもいろいろ使い道があります。

# HEADのSHA1
git rev-parse HEAD

# repositoryのworking-dirにいるかどうか
# 中に入ればtrueという文字列が変える
git rev-parse --is-inside-work-tree

現在のbranch名取得

色々方法はあると思いますが、一例として。

# refs/heads/masterみたいなのが返ってくる
git symbolic-ref HEAD 2> /dev/null

repositoryのconfigを取得

hub.hostの情報取ってくるのに使っています。

git config --get hub.host

現在のrepositoryのtopのディレクトリのpathを取得

これもrev-parse使って出来る。

git rev-parse --show-toplevel

おまけ open-github-from-issue

 issueを開くコマンドも同じように作ってみました。
https://github.com/shibayu36/config-file/blob/master/bin/open-github-from-issue においてあります。

open-github-from-issue 2