なまえは まだ ない

思いついたことをアウトプットします

ghqとpecoでGitのローカルリポジトリを超スマートに管理する

ローカルのリポジトリ管理どうしてますか?

みなさん、Git使ってますか?使ってますよね? 今時ファイルやディレクトリに日付を書いて手動バージョン管理しているような人は、 今すぐGitに入門しましょう。便利ですよ。

GitのリモートリポジトリにはGitHubを使うのがど定番です。 まだGitHubのアカウント持ってないよ!って人は是非次の記事を参考にしてみてください(宣伝)。

furusax0621.hatenablog.com

さて、Gitでソースコードを管理できるようになったとして、 ローカルリポジトリってどこに置こう?とか、考えたことないですか? 自身のPCのあっちこっちにリポジトリが散乱してたら美しくないですし、 かといって一箇所に管理してリポジトリ名がバッティングしたら目も当てられないですよね。

本記事では、そんな悩みをもつみなさんにナイスなソリューションを提供します! といっても、タイトルにあるghqpecoの組み合わせなんてQiitaに腐る程情報がある、知り尽くされた情報です。 何番煎じかわからない記事なので、今すぐブラウザバックしてご自身で探していただいて構いません。

Gitのリポジトリ管理にghqを使う

ghqはローカルリポジトリをスマートに管理することができるコマンドです。 具体的には、GitHubなどリモートリポジトリをクローンする際、一貫性のあるディレクトリ構造を作ってクローンします。

github.com

ghqのインストール

ghqコマンドはHomebrewでサクッとインストールできます。

$ brew install ghq

ghqはGoで書かれたパッケージなので、go getでもインストールできます。 Goの環境がある方はこちらの方がいいかもしれません。

$ go get github.com/motemen/ghq

ghqの初期設定

ghqはひとつのディレクトリ以下にすべてのローカルリポジトリを格納します。 特に設定しない場合、$HOME/.ghqとなります。 このままで全然支障はありませんが、もしディレクトリを変更したい場合は次のように設定することができます。 例えば$HOME/srcとしたい場合は、次のように実行します。

$ git config --global ghq.root $HOME/src

ghqを使ってみる

リポジトリをクローンするには、git cloneの代わりにghq getを使います。

$ ghq get <repository URL> | <user>/<project>

ghqがイケてるのは、公開リポジトリであればURLを全入力しなくても<user>/<project>の形式でクローンできるところです。 残念ながら、というか当然ながらプライベートなリポジトリはこうはいかないので、 プライベートリポジトリをクローンしたい場合はSSHのURLをまるっと渡してあげます。

$ ghq get git@github.com:furusax0621/dotfiles.git

ghqで管理しているリポジトリを確認する

ghqでクローンしたリポジトリは次のようなディレクトリ構造で管理されます。 リモートのホスト名やユーザー毎にディレクトリを掘るので、同名のリポジトリを複数クローンしてもバッティングしません!すごい!

src (ghq root)
  |
  | -- code.google.com/
  |    `-- p/
  |         `-- vim/
  `-- github.com/
       | -- furusax0621/
       |    | -- dotfiles/
       |    | -- prezto/
       |    `-- tour-of-go/
        `-- nukata/
             `-- linq-in-go/

これ、GoにおけるGOPATHと同じ構造なんですよね。 会社の先輩曰く、そもそもghqってGoのパッケージ管理のためのパッケージらしいです。なるほど。

ghqで管理しているリポジトリの一覧はghq listと実行すれば簡単に取得できます。

$ ghq list

code.google.com/p/vim
github.com/furusax0621/dotfiles
github.com/furusax0621/prezto
github.com/furusax0621/tour-of-go
github.com/nukata/linq-in-go

もっとスマートに管理するためにpecoを使う

ghqで無事一箇所にリポジトリを格納できるようになりました。 が、上述のとおりホスト名/ユーザー名でディレクトリが階層化されています。 作業するたびにこれをいちいちターミナルで掘っていくのはダルすぎますよね?

pecoは標準入力されたテキストをインクリメンタルサーチしてくれる非常にナイスなコマンドです。 これを組み合わせることで、超スマートなリポジトリ管理を実現できます。

pecoのインストール

こちらもHomebrewでサクッとインストールできます。

$ brew install peco

リポジトリを管理するコマンドを記述する

pecoをインストールしたら、自身の.bashrcなどに次のようなエイリアスを貼ってみましょう。

alias gs='cd $(ghq root)/$(ghq list | peco)'

エイリアス名となるgsは適当です。ご自身で覚えやすい、かつ叩きやすいエイリアス名を考えてください。 で、これを叩くとどうなるかというと、こうなります。

f:id:furusax0621:20190430173647g:plain

すごい!リポジトリを検索しつつ、簡単にリポジトリへ移動できるようになった! このエイリアスを叩くタイミングでghq rootを参照するので、git configghq.rootを変更してもちゃんと追随します。 カレントディレクトリやghq.rootの設定を全く意識することなくローカルリポジトリを管理できます。

おわりに

というわけで、何番煎じになるかわかりませんがghqとpecoを使ったGitのローカルリポジトリ管理方法でした。 こういう細かい技をちゃんと使っていると、エンジニアとして生産性上がっている気がしますよね。 インターネットにこういった便利な技はたくさん公開されているので、たくさん吸収して周囲にドヤれるエンジニアになりましょう。