ghq + pecoのススメ 〜大量のリポジトリ管理を楽にしたいあなたへ〜
みなさん、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-Aはxxxのリポジトリだな。xxxのディレクトリにまとめよう。
$ mkdir ~/dev/xxx
$ cd ~/dev/xxx
$ git clone <URL A>
Aさん) reposityry-Bはyyyのリポジトリだな。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 さんありがとうございます!
「自分本位」でここまで広く役立つツールを産み出せる姿、恐れ入ります...!
是非ローカルのリポジトリ管理に困ってる方の参考になっていれば幸いです。
最後まで読んでいただきありがとうございました!
関連リンク
![株式会社メンバーズ DevOpsLeadカンパニー](https://storage.googleapis.com/zenn-user-upload/avatar/a08a734214.jpeg)
より良く、より早く、より安全に、もっとハッピーに。「DevOps 自由と変化を創造する」をミッションとして、DevOps領域に特化したサービスを展開しています。 公式noteはこちら→note.com/devopslead
Discussion