💫

年末の大掃除に合わせて、ローカルのリポジトリも掃除しよう

2024/12/14に公開

はじめに

こんにちは、丸山です。

突然ですが、エンジニアって掃除苦手な人多いですよね(偏見)。
仕事ができるエンジニアの方はそんなことはないでしょうが、私と同じ底辺エンジニアの中には片付けが苦手な方もいるはずです。

私のローカル環境は大体こんな感じになっています。

これが原因で以下のような損をしていたと考えています。

  • 作業環境の構築に時間がかかるので、取り掛かるのが面倒になる
  • 既存の実装をすぐに見れないので、既知問題の解決方法を探しにくい
  • 開発体験が低くなる

今回はこのような問題をスクリプトを書いて解決できたので、記事にまとめました。

書いたもの

量がないので、ソースコードは貼ります。

使ったツールは以下です。

  • ghq (1.6.2)
  • fzf (0.55.0)
  • zoxide (0.9.6)
  • eza (0.20.12)

動作環境は以下です。

  • MacOS
  • fish
  • wezterm

fish環境で動かしているせいでPOSIX互換がありません。zshとかbash使っている人は書き直してください。

config.fish
# custom command
function ghq
    if [ $argv[1] = repo ]
        set --erase argv[1]
        source ~/.config/fish/functions/ghq.sh $argv 2>/dev/null
    else
        command ghq $argv
    end
end

# zoxide init
export _ZO_EXCLUDE_DIRS="$HOME/.ghq/**/*"
zoxide init fish | source
ghq.sh
#!/usr/bin/env fish

set -gx FZF_DEFAULT_OPTS "--layout=reverse --height=45% --border --preview-window=down:30%"

if test -z "$argv[1]"
    set repo_name (ghq list --unique | fzf --preview 'ls --grid (ghq list -p | rg {})')
else
    set repo_name (ghq list --unique | rg "$argv[1]" | fzf --ansi)
end

set repo_path (ghq list -p | grep "/$repo_name\$")

cd "$repo_path"

実際に動かすとこんな感じです。

ghq知らない人のために

知っている人は読まなくて大丈夫です。

ghqとは

一言で言うと、ローカルにあるリポジトリの管理が可能になるCLIツールです。
主な機能は、以下の2つです。

  • リポジトリの一元管理
  • リポジトリの検索

リポジトリの一元管理

ghqのサブコマンドはそれぞれ以下の操作を行えます。

  • ghq get: git clone
  • ghq remove: ローカルリポジトリの削除

gitコマンドとの違いは、保存先がリモートリポジトリの構造に則って自動的に決まる点です。
例えば下のようなコマンドを打った場合、clone先のディレクトリがURLのsegmentごとに別れます。

# これと同じ: git clone https://github.com/example/repo ~/.ghq/github.com/example/repo
$ ghq get https://github.com/example/repo

# ここにcloneされる: ~/.ghq/github.com/example/repo

これによってリポジトリが~/.ghq配下で一元管理され、ローカルの環境にリポジトリが散乱することを防ぐことができます。

$ tree ~/.ghq -L 3
/Users/maruyama/.ghq
└── github.com
    ├── "User name"
    │   ├── amplify-sandbox
    │   ├── dotfiles
    │   ├── mkdocs-personal-wiki
    │   ├── rust_workspace
    │   ├── ci_cd_react
    │   ├── custom_chatbot
    │   ├── nostr-study-project
    │   ├── shared-auth
    │   └── shared-utils
    ├── flutter
    │   └── engine
    └── martinvonz
        └── jj

リポジトリの検索

ghqを使用すると、クローンしたリポジトリを素早く検索でき、目的のリポジトリのディレクトリに簡単に移動することができます。

# リポジトリ一覧表示
$ ghq list
github.com/example/repo
github.com/example/another-repo

# フルパスを表示
$ ghq list --full-path
/home/user/.ghq/github.com/example/repo
/home/user/.ghq/github.com/example/another-repo

正直、このフルパスでcdすればリポジトリに飛ぶことができるのですが、毎回フルパスを全て表示してgrepかけるのが面倒だったので今回のスクリプトを書きました。

終わりに

他のエンジニアの人から見たら問題点が沢山あると思いますが、一旦満足しています。
作業効率も体感ですが結構上がったと感じています。

個人的に改善したい点として、vim使用中リポジトリを変えるときに、vimから抜ける必要があるのが面倒です。
telescope-ghqとかで楽にいい感じにできないかと思っています。

こんな感じで今後も面倒なことはできるだけ無くしていきたいです。

追記

  • tmuxを使っているならfzf--tmux=centerを入れた方が強そうに見える。
  • tmux.confにbindしておくとprefix key+設定keyで起動するので便利そう。

Discussion