どういう記事?
本記事は ディップ with 全部俺 Advent Calendar 2022 1日目の記事になります。
個人のPCで新しいMacを買ってセットアップをしていたのですが、既存のリポジトリをcloneしてくるのがちょっと面倒だったのでいい感じにできるやつを組んでみたよ。
という記事です。
git clone
をするのに毎回gitリポジトリのURLをコピーしてコマンドに貼り付けてというのが面倒だなと思い、コマンドを叩けばリポジトリ選択ができて、選択したリポジトリをclone出来るようになればいいなと思ったのが発端です。
実行環境
- homebrew
$ brew -v
Homebrew 3.6.10
Homebrew/homebrew-core (git revision d38f0f7b60a; last commit 2022-11-12)
- peco ※brewからinstall
$ peco --version
peco version v0.5.10 (built with go1.17.2)
- gh ※brewからinstall
$ gh --version
gh version 2.20.0 (2022-11-08)
https://github.com/cli/cli/releases/tag/v2.20.0
- ghq ※brewからinstall
$ ghq --version
ghq version 1.3.0 (rev:ccbbc18)
設定編
インストールしたアプリそれぞれに幾つかの設定が必要なので設定を行います。
ssh Keyをgithubに登録する。
これから作るコマンドはssh経由でgit cloneを行うため、ssh Keyの登録を行う必要があります。
例)ssh keyの作成
ssh-keygen -t rsa -b 4096
設定方法は他の記事を参照してみてください。
ghq の設定を行う。
ghqのrootディレクトリを設定する必要があるので、~/.gitconfig
に下記2行を追加します。
この辺の設定は下記を参照してもらえるといいかと思います。
びくんびくんしながらコードを書く:ghqとpecoで作るお手軽プロジェクト管理環境
[ghq]
root = ~/go/src
ghコマンドのログインを済ませておく。
普段からghコマンドを利用している場合は問題ありませんが、これのためにインストールした場合は、先にログインをしておく必要があります。
gh auth login
.zshrc に追記する
clone-repo () {
local org=""
# organizationを指定したい場合、標準入力で受け付ける。
read "org?input organization name:"
# 取得するリポジトリ数を指定したい場合、標準入力で受け付ける
read "limit?input limit Repository count:"
# 設定がなければデフォルト1000を指定
if [ -z $limit ]; then
limit=1000
fi
# リポジトリの選択を行うコマンド。
# 選択が終わったらrepoという変数に選択されたリポジトリが格納される。
local repo=$(gh repo list $org --limit $limit --json sshUrl --jq '.[].sshUrl' | peco)
# pecoでの選択をescなどで抜けた場合、ghq getコマンドがコケるのでその前に抜けるようにする。
if [ -z $repo ]; then
return 0
fi
ghq get $repo
# cloneしたリポジトリのディクトりへ移動する。
cd $(ghq list --full-path | grep $(basename $repo .git))
}
# ウィジェットへ登録
zle -N clone-repo
# keybindへの設定(esc+l)
bindkey '^[l' clone-repo
上記手順で一通り設定完了です。
コマンドそれぞれに挙動のコメントを記載しているので、ご参考にしていただければと思います。
※もっといい方法があるよというのをご存じでしたら教えてください。
使い方
esc+lでコマンドが起動します。
起動後はpecoのインクリメンタルサーチが即起動するため、cloneしたいリポジトリを選択します。
下記表示例
QUERY> Regexp [30 (1/2)]
git@github.com:unagiya/dotfiles.git
git@github.com:unagiya/cram.git
git@github.com:unagiya/habu.git
git@github.com:unagiya/ISUCON12q.git
・
・
・
また、コマンドラインからコマンドを起動するとorganization選択用のキー入力が求められます。
$ clone-repo
input organization name:
ここでorganizationを入力すると、自分以外のアカウントなども含め、公開されているリポジトリを選択できます。
おまけのヘルプ
キーバインドの方から起動すると標準入力でorganization, limitを受け取る部分がなぜか起動してくれず、自分のアカウントのリポジトリからしか選択できないです。。。
※なぜそうなるかご存知の方がいたらご教授いただきたいです。
最後に
とりあえず使えればいいやで実装したため、こうした方が良いなど改善点はあると思いますのでツッコミ大歓迎です。
また、改善点として、すでにclone済のリポジトリなどはcloneしないようにする制御などを入れても良いですね。
※今はすでにclone済のリポジトリをcloneしようとするとghq側のコマンドでエラーが吐かれ異常終了します。
あまりガンガン使う機能ではないですが、git 管理を楽にするためのコマンドのご紹介でした。