ghq list の 代替案
イントロ
普段 ghqとfzfを使ってリポジトリの切り替えをしています。
とても便利なのですが、最近、かなりもっさりしてきて遅いので改善を考えてみました。
改善方法
ボトルネックとしてはghq listがとても遅くなっていました。
簡易改善
ghq root 配下のディレクトリがそこまで多くない場合 git だけを対象とした改善方法をよく見かけました。
ghq list --vcs=git
こちらで改善する場合はこれだけで良さそうです。
今回実施した改善
findに置き換えて改善している記事を見たいのですが、私の場合は動作がもっさりしたままでした。
そこでRUST製のfdを使いことにしました。
バージョン管理がすべてgitで管理してるのでgitの特性から.gitファイルを探すことにしました。
ghq list
を
fd --type d --min-depth 2 --max-depth 4 --hidden --search-path $i '.git$' | sed -e "s/\/.git\$//"
に変更しています。
このコマンドでは .gitディレクトリを探して .git を削り一覧化しています。
--min-depth 2 --max-depth 4 と しているのは
ghq root を複数設定していてローカルに作成してるリポジトリのディレクトリ構造を考慮しています。
利用される方はお好みに合わせて変えるのが良いかと思います。
今回の変更のdiffは以下の様になっています.
gd configs/fish/config.fish diff --git configs/fish/config.fish configs/fish/config.fish index 9f2755c..5659e0c 100644 --- configs/fish/config.fish +++ configs/fish/config.fish @@ -210,15 +210,20 @@ function fzf_select_ghq_repository set fzf_query --query "$query" end - set -l out (ghq list --vcs=git | \ + set -l out ( + for i in (ghq root -all) + fd --type d --min-depth 2 --max-depth 4 --hidden --search-path $i '.git$' | \ + sed -e "s/\/.git\$//" + end | \ fzf $fzf_query \ --prompt='Select Repository >' \ - --preview="echo {} | cut -d'/' -f 2- | xargs -I{} gh repo view {} ") + --preview="echo {} | awk -F'/' '{ print \$(NF-1)\"/\"\$NF}' | \ + xargs -I{} gh repo view {}" + ) [ $status != 0 ] && commandline -f repaint && return if test -n $out - set -l dir_path (ghq list --vcs=git --full-path --exact $out) - commandline "cd $dir_path" + commandline "cd $out" commandline -f execute end end
これでかなり速度が改善されていて快適になりました。
もっといい方法がありそうなので、何かあればコメントないしはDMなどでご連絡いただけると嬉しいです。