GHQ
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