r7km/s

r7kamura per second.

GHQ

2014-06-21

ghqというレポジトリ管理ツールを使ってみた。

Installation

Goがインストールされていてかつ環境変数$GOPATHが設定されている環境で、go getを使うとインストールできる。 手元の環境を調べてみると、Goのversionは1.2.1、環境変数$GOPATHは$HOME/.goに設定されていた。 $GOPATH/bin に実行ファイルが入るので、$PATHに$GOPATH/bin を含めておく必要がある。

$ go get github.com/motemen/ghq
$ go version
go version go1.2.1 darwin/amd64

$ echo $GOPATH
/Users/r7kamura/.go

$ cat /Users/r7kamura/.zshrc.local | grep GO
export GOPATH=$HOME/.go
export PATH=$PATH:$GOPATH/bin

$ which ghq
/Users/r7kamura/.go/bin/ghq

Usage

引数無しでghqを実行すれば使い方が表示された。

$ ghq
NAME:
   ghq - Manage GitHub repository clones

USAGE:
   ghq [global options] command [command options] [arguments...]

VERSION:
   HEAD

COMMANDS:
   get      Clone/sync with a remote repository
   list     List local repositories
   look     Look into a local repository
   import   Import repositories from other web services
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --version, -v    print the version
   --help, -h       show help

ghq get

ghq getを試してみる。

$ ghq get motemen/ghq
     clone https://github.com/motemen/ghq -> /Users/r7kamura/.ghq/github.com/motemen/ghq
       git clone https://github.com/motemen/ghq /Users/r7kamura/.ghq/github.com/motemen/ghq
Cloning into '/Users/r7kamura/.ghq/github.com/motemen/ghq'...
remote: Reusing existing pack: 536, done.
remote: Total 536 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (536/536), 88.96 KiB | 0 bytes/s, done.
Resolving deltas: 100% (316/316), done.
Checking connectivity... done.

これで /Users/r7kamura/.ghq/github.com/motemen/ghq にGitレポジトリがcloneされた。

ghq list

続いてghq listを試してみる。

$ ghq list
github.com/motemen/ghq

さっきghq getでcloneしてきたレポジトリが表示されている。 もう1つレポジトリをcloneしたあと、-pオプションとquery引数、それから-eオプションを試してみる。

$ ghq get https://github.com/r7kamura/r7kamura.github.io

$ ghq list
github.com/motemen/ghq
github.com/r7kamura/r7kamura.github.io

$ ghq list -p
/Users/r7kamura/.ghq/github.com/motemen/ghq
/Users/r7kamura/.ghq/github.com/r7kamura/r7kamura.github.io

$ ghq list r7kamura
github.com/r7kamura/r7kamura.github.io

$ ghq list -e r7kamura
$ ghq list -e r7kamura.github.io
github.com/r7kamura/r7kamura.github.io

-pオプションを使うと、出力結果がレポジトリの絶対パスになる。 出力結果を使って更に何かしたいというときに便利だろうな。 また引数を与えると、引数の値を含むものだけが出力されるようになる。 引数と同時に-eオプション(exactly)を使うと、 この引数がprojectかuser/projectかhost/user/projectに一致したときだけ出力されるようになる。

ghq look

ghq lookを試してみる。

$ ghq look ghq
        cd /Users/r7kamura/.ghq/github.com/motemen/ghq

レポジトリの存在するディレクトリに移動できるみたい。 では同じ名前のレポジトリが複数あればどうか。

$ ghq get r7kamura/ghq
$ ghq look ghq
     error More than one repositories are found; Try more precise name
     error - github.com/motemen/ghq
     error - github.com/r7kamura/ghq

エラーが出る。 利用可能なコマンドの候補とか提示してくれると便利そう。

$ ghq look motemen
     error No repository found

あと十分に候補が絞り込める場合でもghq listの引数のように部分一致は通用しない模様。

Peco

pecoとghqを連携させてみた。

$ go get github.com/peco/peco/cmd/peco

まず便利関数として、pecoで絞り込んだ出力結果に対してコマンドを実行する関数pをつくった。

$ p() { peco | while read LINE; do $@ $LINE; done }

ls | p foo とやると、lsの出力結果をpecoで絞り込んで、その出力結果を引数にfooを実行できる。 xargsを使っても良かったが、xargsは別プロセスでコマンドを実行するのでcdと併用できないという問題がある。 zshであれば上記のように書けばcdも使えるのでこうした。これをghqと組み合わせて使う。 ghq list -p でフルパスを出力した後、pecoで絞り込んでcdで移動する。

$ ghq list -p | p cd

だるいのでたまたま空いてたeにaliasした。

$ alias e='ghq list -p | p cd'

これで好きなレポジトリにサクッと移動できるようになった。めでたい。

Configuration

手元のマシンに持ってくるレポジトリは言語問わず全て ~/src/github.com/:user/:repo に持ってくることにしたい。 GOPATHとghqの設定を変えておけばすべて上手くいく。

$ export GOPATH=$HOME
$ git config --global ghq.root ~/src