gitを使ってるのにghqとpecoの組み合わせをまだ知らない人へ
こんにちは、たつきちです。
エンジニア歴12年ぐらいで今はベンチャー企業のCTOをしています。
この記事では、 ghq と peco というコマンドを組み合わせて使うとgitでのローカルリポジトリ管理がめちゃくちゃ楽になるというお話をします。
知らなかった人はこの記事で100%幸せになれるので、ぜひ最後までお付き合いください。
何ができるようになるのか
以下のように、ローカルに存在するgitリポジトリをインクリメンタルサーチして選択し、そのディレクトリにジャンプすることができるようになります。

導入手順
1. ghqをインストール
gqh は、GitHubなどのリモートgitリポジトリのローカルcloneを管理するためのツールです。
git clone の代わりに ghq get {リポジトリURL} を実行するとghqルートディレクトリ(デフォルトでは ~/ghq/ )にリポジトリがcloneされ、 ghq list でclone済みのリポジトリを一覧表示できたりします。
なお、cloneしたいリモートリポジトリがGitHUbの場合は、リポジトリURLを打ち込む代わりに単に ghq get {user}/{repo} とだけ指定すれば github.com/{user}/{repo} をcloneしてくれます。
Macの場合はhomebrewでインストールできます。
$ brew install ghq
それ以外の環境の方は、 go get か make install でインストールしましょう。
$ go get github.com/x-motemen/ghq
# または
$ git clone https://github.com/x-motemen/ghq .
$ make install
2. pecoをインストール
peco は、CLI上でリスト表示されるものをインクリメンタルサーチできるようにしてくれるツールです。
公式のデモ動画(gif) を見れば一目瞭然です。
こちらもMacの場合はhomebrewでインストールできます。
$ brew install peco
それ以外の環境の方は 公式のREADME をご参照ください🙏
3. ghqとpecoをいい感じに連動させるaliasを書く
ghqとpecoがインストールできたら、あとはこれらをいい感じに連動させるためのaliasをシェルのプロファイル(bashなら ~/.bashrc や ~/.bash_profile )に以下のaliasを追記しましょう。
alias gi='(){ cd $(ghq root)/$(ghq list | peco --query "$*") }'
-
ghq listの結果をpecoに渡して - 選択されたリポジトリのパスを
ghq rootに繋げることでフルパスを得て - そこに
cdする - という処理を
giで呼び出せるようにする
ということをやっています。
これで、冒頭に貼ったスクリーンキャプチャのような操作が可能になりました
GitHubをよく使うなら hub コマンドも組み合わせるとさらに便利に
GitHubの公式CLIツール hub コマンドも組み合わせるとさらに便利になります。
hubコマンドも、Macの方はhomebrewでインストールできます。
$ brew install hub
それ以外の環境の方は 公式のREADME をご参照ください🙏
hubコマンドをインストールした上で、以下のaliasを登録してみましょう。
alias gh='(){ hub browse $(ghq list | peco --query "$*" | cut -d "/" -f2,3) }'
こうしておくと、以下のように、ローカルに存在するgitリポジトリをインクリメンタルサーチして選択し、そのリポジトリのリモートリポジトリ(GitHubリポジトリ)をブラウザで開くことができるようになります。

便利ですね!
あと、些細ですが「 ghq get でGitHubリポジトリをcloneして、完了したらそのディレクトリに移動する」という作業も地味に面倒なので、僕は以下のようにalias化しています。
alias gg='(){ ghq get -u -p $1 && $(ghq root)/github.com/$_ }'
ghq getの-uは「もしすでにclone済みだったら最新の内容に更新する」というオプション、-pは「SSHでcloneする」というオプションです。
まとめ
- gitを使っているなら
ghqとpecoを組み合わせるとローカルリポジトリの行き来がめっちゃ便利になる! - GitHubをよく使うなら
hubコマンドも組み合わせるとさらに便利に!
Discussion