窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

ghqに複数のrootを設定する

github.com

複数のrootが設定できることを知ったので、使ってみる。

背景

今までghqのrootを ${HOME}/Projects に設定していた。 この状態で ghq get ~ をすると、${HOME}/Projects/github.com/yamachu/hogehoge みたいな感じにリポジトリがクローンされていた。

しかしGoのProjectで問題が起こった。GOPATH 問題。 パッケージやリポジトリみたいなものは ${GOPATH}/src/github.com/yamachu/hogehoge みたいな置き方にしろよーっていうのがGoの流儀。 であれば、${HOME}/Projects にカレントディレクトリに対して src というシンボリックリンクを張れば良いんじゃないかと思ってやってみたが、dep でまたまた問題が…

GOPATH 以下にシンボリックリンクを置いて楽できる! - ハトネコエ Web がくしゅうちょう

これと同じ状況になった。

これの打開策として

  1. 現在Projects以下にあるリポジトリをsrc以下に移してProjectsをGOPATHにする
  2. Goのプロジェクトはghq管理外にする

というのが思いついた。 1.はただmvコマンドを叩くだけで解決するのでそれでも良かったのだが、go getをした時にsrc以下に大量の関連パッケージが流れ込むので、ghq listやそれをpecoなどで絞り込む時に邪魔になる。 2.は ${HOME}/go みたいなところで管理すると決めれば割と平和だけれども、今まで ghq で管理していたのでそのために作った便利エイリアスが使えなくなるのは辛い。

みたいなデメリットなども出てきた。

やったこと

2.の選択肢を採用し、それもghqで管理できるようにした。

.gitconfig

[ghq]
        root = ~/Projects
        root = ~/go

これだけで ghq list した時に今まで管理していたProjectとgoのProjectが表示されるようになった。 pecoとかで絞り込みたくなったら、^src^pkggrepで除外したりすることで通常のghqで管理していたProjectを絞り込めるし、逆にgoのProjectを絞り込みたくなったら^srcで絞り込む…みたいなことが出来る。

また表示だけでなく、goのProjectはGOPATH以下にクローンしたいので、

alias gghq='GHQ_ROOT=${GOPATH}/src ghq'

みたいな形にした。 こうすることで複数のrootをghqで使用し、goとそれ以外のProjectで平和な世界を築けるようになった。

めでたし。

エイリアス関係

今の所こんな感じで使っている。

alias g='cd $(ghq root)/$(ghq list | grep -v -e "^src" -v -e "^pkg" -v -e "^\d"| peco)'
alias gghq='GHQ_ROOT=${GOPATH}/src ghq'
alias gg='cd ${GOPATH}/$(ghq list| grep -E "^src"|peco)'