git cloneしたリポジトリを一元管理して、ローカル環境を整理する

目次

はじめに

インフラ事業部でエンジニアをしている丸山です!
普段はDevOps関連の仕事をしており、CI/CD周りの設計やRustを使用した開発を行っています。

私が携わっているプロジェクトは構成管理にRepoを使用しており、管理しているGitHubリポジトリの数がかなり多いです。
このような環境だと以下のような問題がよく発生してしまいます。

  • リポジトリをどこにcloneしたか忘れる、ローカルに同じリポジトリが2つ以上存在している
  • リポジトリ間の移動に時間がかかる、作業効率が落ちてしまう

そこで今回は、私が個人的にローカルのリポジトリ管理に使用しているghqについて、実際にどう使っているのかを紹介できればと考えています。

ghqとは?

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

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

リポジトリの一元管理

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

  • ghq get: git clone
  • ghq 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

ただ、このまま使用すると

  1. ghq listでリポジトリのフルパスを取得する
  2. 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をいい感じに使えるようにしたいです)

ですが実際に使ってみて、一旦実用に耐え得ているのではと感じています。
(実際に開発で使用して、作業効率が上がったと感じました)

今後も便利なツールを探すなどして、開発体験を向上させていきたいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次