はじめに
インフラ事業部でエンジニアをしている丸山です!
普段はDevOps関連の仕事をしており、CI/CD周りの設計やRustを使用した開発を行っています。
私が携わっているプロジェクトは構成管理にRepoを使用しており、管理しているGitHubリポジトリの数がかなり多いです。
このような環境だと以下のような問題がよく発生してしまいます。
- リポジトリをどこにcloneしたか忘れる、ローカルに同じリポジトリが2つ以上存在している
- リポジトリ間の移動に時間がかかる、作業効率が落ちてしまう
そこで今回は、私が個人的にローカルのリポジトリ管理に使用しているghqについて、実際にどう使っているのかを紹介できればと考えています。
ghqとは?
一言で言うと、ローカルにあるリポジトリの管理が可能になるCLIツールです。
主な機能としては、以下の3つがあります。
- リポジトリの一元管理
- リポジトリの検索と移動
リポジトリの一元管理
ghqのサブコマンドはそれぞれ以下の操作を行えます。
ghq get
: git cloneghq remove
: ローカルリポジトリの削除
gitコマンドとの違いは、保存先がリモートリポジトリの構造に則って自動的に決まる点です。
例えば下のようなコマンドを打った場合、clone先のディレクトリがhostやorgごとに分かれて保存されます。
# git clone https://github.com/example/repo ~/.ghq/github.com/example/repo
$ ghq get https://github.com/example/repo
これによってリポジトリが~/.ghq
配下で一元管理され、ローカルの環境にリポジトリが散乱することを防ぐことができます。
$ tree ~/.ghq -L 3
/Users/maruyama/.ghq
└── github.com
├── MaruyamaAki
│ ├── 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
ただ、このまま使用すると
- ghq listでリポジトリのフルパスを取得する
- cdでディレクトリを移動する
と工程が多く、正直使いにくいです。
ghqをカスタムして使いやすくする
以下のツールを併用しています。
- fzf
- zoxide (cdとしてaliasを設定)
- eza (lsとしてaliasを設定)
以下、開発環境です
- MacOS
- fish
- wezterm
実際のスクリプトは以下です。
.zshrc
ghq() {
if [ "$1" = "repo" ]; then
shift
. ~/.config/ghq/ghq-repo.sh "$@" 2>/dev/null
else
command ghq "@"
fi
}
export _ZO_EXCLUDE_DIR="$HOME/.ghq/**/*"
ghq-repo.sh
#!/bin/bash
export FZF=DEFAULT=OPTS="--layout=reverse --height=45% --border --preview-window=down*30%"
if [[ -z "$1" ]]; then
repo_name=$(ghq list --unique | fzf --preview 'ls -C $(ghq list -p | rg {})')
else
repo_name=$(ghq list --unique | rg "$1" | fzf --ansi)
fi
repo_path=$(ghq list -p | rg "/$repo_name$")
cd "$repo_path"
実際に動かすとこんな感じで、リポジトリ間の移動を早く楽に行うことができます。
また、リポジトリは~/.ghq
配下に全て保存されるので、使用するリポジトリが増えてもローカル環境が汚れません。
終わりに
まだまだ改善点はたくさんあります。
個人的には、vimでの作業中に作業リポジトリを変更したいときに、一旦vimから抜けてディレクトリを移動する必要があるのが不満です。(telescope-ghqをいい感じに使えるようにしたいです)
ですが実際に使ってみて、一旦実用に耐え得ているのではと感じています。
(実際に開発で使用して、作業効率が上がったと感じました)
今後も便利なツールを探すなどして、開発体験を向上させていきたいです。