🐙

ghq + pecoのススメ 〜大量のリポジトリ管理を楽にしたいあなたへ〜

2024/07/12に公開

みなさん、GitHub/GitLabのリポジトリをローカルPCで管理する時、どうしてますか?

私は今までディレクトリを切って管理していましたが、最近実務でghqを使い始め、その便利さに感動しました。
特にGitLabのようなグループで細かくリポジトリが分かれている場合にとても強力なツールです。
さらに、プロジェクトで触るリポジトリが 10, 50, 100 とある場合には、pecoという検索ツールと連携し、ディレクトリ移動を入れるともう最高です。
私はもう ghq + peco なしでは生きていけません。

この記事では ghq の魅力から、ghq + pecoの使い方まで、簡単に紹介させて頂きます!

ghqとは?

ghqは、リモートリポジトリをローカルにクローンし、一元管理するため開発されたツールです。
(※日本人が歴史の教科書で学ぶ大文字の組織とは関係ありません。)
Go言語で書かれており、go getコマンドに似た使い心地で利用できます。

主な特徴は以下です。

  • リポジトリをクローンするディレクトリを気にしなくて良くなる。
    • リポジトリのディレクトリパスは全てURLと対応しており、分かりやすい。
  • クローンしたリポジトリ一覧を取得できる。
  • pecoと連携することでリポジトリ移動がとても楽になる。

pecoとは?

pecoは、コマンドラインで動作するシンプルなインタラクティブフィルタリングツールです。
何ができるのかは、demoを見ていただくとイメージが掴みやすいです。

簡単に言うと、文字列一覧からターミナルで特定の文字列を検索し、選択した文字列を標準出力できるツールです。

インストール方法

ghq

macOS)

brew install ghq

Go)

go install github.com/x-motemen/ghq@latest

その他のインストール方法は公式READMEを参照。

peco

macOS)

brew install peco

Go)

go get github.com/peco/peco/cmd/peco

その他インストール方法は公式READMEを参照。

セットアップ方法

ghq

rootディレクトリの設定のみ必要です。
この設定は飛ばすことも可能です。デフォルトでは ~/.ghq ディレクトリが利用されます。

# ghqのrootにするディレクトリを作ります。既存のディレクトリでも構いません。
mkdir ~/src
# gitconfigに反映します。
git config --global ghq.root '~/src'

peco

不要です。

以上でインストール・セットアップは完了です!簡単ですね!

使い方

リポジトリのクローン

ghq get https://github.com/x-motemen/ghq

リポジトリへの移動

こちらはpecoと連携します。後述します。

cd "$(ghq list --full-path | peco)"

その他参考: https://github.com/Songmu/ghq-handbook

使うコマンドもほぼこの2つです!
以降はこの魅力について具体的に紹介します。

魅力1: リポジトリをクローンするディレクトリを気にしなくて良い

例えば、以下のようなリポジトリがあったとします。

GitHub Organization リポジトリ URL
xxx repository-A <URL A>
yyy repository-B <URL B>

それぞれのリポジトリを、Organizationが分かるようにcloneすることを考えます。

ディレクトリで管理している Aさん の場合

Aさん) reposityry-Axxxのリポジトリだな。xxxのディレクトリにまとめよう。

$ mkdir ~/dev/xxx
$ cd ~/dev/xxx
$ git clone <URL A>

Aさん) reposityry-Byyyのリポジトリだな。yyyのディレクトリにまとめよう。

$ mkdir ~/dev/yyy
$ cd ~/dev/yyy
$ git clone <URL B>

Aさん) これでよし。

最終的なディレクトリ

$ tree dev
dev
├── xxx
│   └── repository-A
└── yyy
    └── repository-B

自力でも綺麗に分けられますが、大変ですね。

ghqで管理している Bさん の場合

~/devをghqのrootに設定済みとします。

Bさん) ghqでホイ。

$ ghq get <URL A>
$ ghq get <URL B>

最終的なディレクトリ

$ tree dev
dev
└── github.com
    ├── xxx
    │   └── repository-A
    └── yyy
        └── repository-B

なんということでしょう。。。たった1コマンドでOrganizationのディレクトリまで出来ています。

解説1: ghqはURLに合わせてパスを切ってくれる

これは、ghqが以下のようなGitHubリポジトリのURLに合わせてディレクトリを切ってくれるためです。
例: https://github.com/x-motemen/ghq
そのため、OrganizationやGroupを意識せずに、ghq getを打つだけでcloneすることが可能です。
新たにgitlab.comやSelf-managedなGitHub/GitLabからクローンしたい時も、ディレクトリ構成を気にすることなくghq getだけで取得できます。

このようにghqでは、複数のGitHub Organizationや、GitLabグループ、複数リポジトリサーバーを対象とする時に、かなり管理しやすい形でcloneすることが出来ます。

さらに、ディレクトリ移動する時も見てみましょう。

魅力2: pecoと連携することでリポジトリのディレクトリ移動がとても楽になる

先程と同じく、以下のようなリポジトリがあったとします。

GitHub Organization リポジトリ URL
xxx repository-A <URL A>
yyy repository-B <URL B>

それぞれのcloneしたディレクトリに移動する事を考えます。

ディレクトリで管理している Aさん の場合

Aさん) repository-Aの作業がしたいから、ディレクトリ移動っと。

cd ~/xxx/repository-A

Aさん) 次はrepository-Bの作業がしたいから、ディレクトリ移動。

cd ~/yyy/repository-B

Aさん) あー、あれビルドし直したいからまた戻んないと。

cd ~/xxx/repository-A

このように、リポジトリのディレクトリパスを覚えている必要があり、大変です。

ghq + pecoで管理している Bさん の場合

sdという名前で ghq + peco を呼び出すaliasを設定済みとします。

Bさん) ghq + peco でホイ。

$ sd
# 検索画面が出る
QUERY>
/Users/B/dev/xxx/repository-1
/Users/B/dev/xxx/repository-2

# 検索先を含む文字を入力
QUERY> 1
/Users/B/dev/xxx/repository-1

# カーソルが当たったらEnter
Enter

(※後は同じコマンドを繰り返す)

なんということでしょう。。。たったの1コマンドでディレクトリ移動ができてしまいます。

解説2: pecoを連携するとインタラクティブにリポジトリを検索できる

これは、ghqでクローンリポジトリの一覧を出力→pecoでインタラクティブ検索→選択したディレクトリに移動を1コマンドにまとめることで実現しています。

aliasコマンドの中身は以下です。
これを ~/.zsh_profile, ~/.bash_profile 等に設定してシェル起動時に読み込まれるようにします。

peco-cd () {
  cd "$( ghq list --full-path | peco)"
}
alias sd='peco-cd'

sdは過去にghq紹介記事で良いなと思い、拝借しております。(元記事が思い出せず、すみません🙏)
(Change) Source directoryの略だと思っています。

他にも、ghq-handbookではこのコマンドをキーバインドに設定する方法も紹介されています。

さいごに

ghq + pecoの魅力は伝わったでしょうか?
自分も昔からghqが便利という話は耳にしていたのですが、なんだか難しそうで導入を先延ばしにしていました。
しかし、いざ使ってみると「今まで使ってなかった時間は何だったんだ」と悲しくなるくらい、とても便利なツールでした。

今のプロジェクトでは触る可能性のあるリポジトリも100を超え、とてもじゃないですが手動管理しきれる量ではありません。
このツールを開発してくださった @motemen さんありがとうございます!
「自分本位」でここまで広く役立つツールを産み出せる姿、恐れ入ります...!
https://en-ambi.com/itcontents/entry/2018/02/28/110000/

是非ローカルのリポジトリ管理に困ってる方の参考になっていれば幸いです。
最後まで読んでいただきありがとうございました!

関連リンク

株式会社メンバーズ DevOpsLeadカンパニー

Discussion