今更だけどghqを使ったリポジトリ管理を布教したい
ghq を使ってない人は人生の1割損してる。
本題
自分が ghq を使い出して数年経ったが、周りには案外、こういうリポジトリの管理ツールを使っていない人が多いらしい。絶対リポジトリの管理ツールはあったほうが良いので、ここで今更ながら宣伝しておく。 ghq 使います。
Goのインストール(準備編①)
まずはGoのインストールから。自分は goenv
を使っている。(言語のバージョン管理は ○○env
をよく使ってる)
goenvのインストールはこちらから。
goenvのインストールが完了したら、goをインストールする。インストールできるバージョンは goenv install --list
で確認できて、このリストは ~/.goenv
で git pull
したら更新される。
$ goenv install --list (省略) 1.11rc2 1.11.1 1.11.2 1.11.3 1.11.4
目的のバージョン(たぶん最新バージョンでいい)を見つけたらそのバージョンをインストール。インストールしたGoは goenv global
で設定できて、 goenv versions
で確認できる。
$ goenv install 1.11.4 (インストールのログ) $ goenv global 1.11.4 $ goenv versions * 1.11.4 (set by /home/user/.goenv/version)
GOPATHの設定
実はGoには元々リポジトリ(外部ライブラリ)を管理する機能が備わっている。
リポジトリの管理は環境変数 GOPATH
で設定されているディレクトリ(デフォルトは ~/go
)で行われて、 go get
で取得したリポジトリはここに入るようになる。ソースは $GOPATH/src
に保存されて、 ghq
みたいにバイナリが付属するやつは $GOPATH/bin
にバイナリが入る。
ただの外部ライブラリ管理ディレクトリのように思えるが、Goのプログラムを開発するときはリポジトリを GOPATH
の下に置いておかないとimport周りが面倒くさくなるので(経験談)、実は普通のリポジトリもここに置いて一元管理しておいたほうが良い。そのため、 GOPATH
にはこれから自分がリポジトリ管理に使いたいディレクトリを設定しておく。
自分の場合は ~/Work
を設定している。リポジトリとかプログラムの管理は全部ここでやってて、 $ work
で ~/Work
に飛ぶエイリアスもある。(あと、 $GOPATH/bin
をパスに追加しておこう)
# bashrc export GOPATH=$HOME/Work export PATH=$GOPATH/bin:$PATH function work { cd ~/Work; }
ghq(とpeco)のインストール(準備編②)
pecoは go get
でバイナリを取得できなくなったこともあり、Linuxだとちょっとだけ手間になった。ここではダウンロードしたソースをbuildする方法でpecoをゲットする。( releases/peco_linux_amd64
のところはOSによると思う)
$ go get github.com/peco/peco $ cd $GOPATH/src/github.com/peco/peco $ make build $ cp releases/peco_linux_amd64/peco $GOPATH/bin
ghqのインストールは go get
で行える。これだけで $GOPATH/bin
にバイナリが入るので、それを利用できる。
$ go get github.com/motemen/ghq
ghqの設定
ghqは go get
のようにリモートリポジトリをまとめる機能を持っていて、このためにGOPATHのようにghqの設定も記載しておかなければならない。設定するファイルは .gitconfig
の [ghq]
部分で、 一番下に次の例のように、 $GOPATH/src
のパスを追記するだけで良い。
(環境変数使えるのかな……。自分は ~/Work/src
を設定していた)
[ghq] root = ~/Work/src
インストール作業は以上。
スーパージャンプ!(本編)
結論から言うとこの関数をbashrcに追記して使用する。関数名は何でもいいが、自分は入力のしやすさから repositories
の re
としている。
# bashrc function re { local path=$(ghq list --full-path | peco --query "$LBUFFER") if [ -n "$path" ]; then if [ -t 1 ]; then cd ${path} echo 'jump to' ${path} fi fi }
仕組みとか
ghq
が使えるようになって設定も完了しているなら、現在 ghq
と go get
がリポジトリ管理に使うディレクトリは同じものになっているはずだ。( $GOPATH
と .gitconfig
の設定)
試しに ghq list
で確認してみると、さっきGoでクローンしたリポジトリが出力される。そして、今回欲しいのは --full-path
を付けたfull pathのリスト。
$ ghq list --full-path /home/shion/Work/src/github.com/motemen/ghq /home/shion/Work/src/github.com/peco/peco
この結果をpecoに食わせて、pecoのQUERYと選択した行を出力してくれる機能を使ってリポジトリを絞り込んでいる。ここで取得したパスは変数 path
に保存され、チェックなどが行わた後にそれを使って cd
で移動する。 echo
は消しても良い。
Gitリポジトリのクローン
Gitリポジトリのクローンは ghq get
を使う。これは別に go get
でもいいけど…。
ghq get https://github.com/githubtraining/hellogitworld
これで設定したディレクトリの下に、パスで区切られたいいかんじの階層でリポジトリが保存される。 ghq list
を実行しても確認できるはず。
ローカルにしかないリポジトリの管理
ghq list
で取得できるのは、指定ディレクトリ以下の .git
を含むディレクトリのパスだ。( ghq get
で取ってきたものだけ、というわけではない)
自分の場合、ローカルのリポジトリは local
というディレクトリに保存している。パスで言うと $GOPATH/src/local
。ここで例えば rails new
とかで自分のプロジェクトを生成し、 git init
で .git
を作成することで ghq list
でパスを取得できるようになる。
$ ghq list local/my-local-project
実行例
$ pwd /home/user $ re jump to /home/user/Work/src/github.com/peco/peco $ pwd /home/user/Work/src/github.com/peco/peco