Shiopon Labo

しおぽん(@shiopon01)の個人ブログです

今更だけどghqを使ったリポジトリ管理を布教したい

ghq を使ってない人は人生の1割損してる。

本題

自分が ghq を使い出して数年経ったが、周りには案外、こういうリポジトリの管理ツールを使っていない人が多いらしい。絶対リポジトリの管理ツールはあったほうが良いので、ここで今更ながら宣伝しておく。 ghq 使います。

Goのインストール(準備編①)

まずはGoのインストールから。自分は goenv を使っている。(言語のバージョン管理は ○○env をよく使ってる)

goenvのインストールはこちらから。

goenvのインストールが完了したら、goをインストールする。インストールできるバージョンは goenv install --list で確認できて、このリストは ~/.goenvgit 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の設定

ghqgo get のようにリモートリポジトリをまとめる機能を持っていて、このためにGOPATHのようにghqの設定も記載しておかなければならない。設定するファイルは .gitconfig[ghq] 部分で、 一番下に次の例のように、 $GOPATH/src のパスを追記するだけで良い。

環境変数使えるのかな……。自分は ~/Work/src を設定していた)

[ghq]
  root = ~/Work/src

インストール作業は以上。

スーパージャンプ!(本編)

結論から言うとこの関数をbashrcに追記して使用する。関数名は何でもいいが、自分は入力のしやすさから repositoriesre としている。

# 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 が使えるようになって設定も完了しているなら、現在 ghqgo 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