PCの中に埋もれたgitリポジトリありませんか?私はたくさんあります。以下の方法で探り当てたリポジトリを見ると自分では全然覚えてない作りかけの物が出てきました。実家のタンスの奥から子供の頃のオモチャが出てきたような気分です。
もともとは「数ヶ月さわってないプロジェクトを久しぶりに開くにはどこに置いてたか探すことから始めなきゃならない」という当たり前のことに気付いたからでした。
ghq等を使ってる方はちゃんと管理できてるんでしょう。しかしリポジトリ迷子の私みたいな方はたくさんいると思います。そして思いついたのがpecoを使った方法です。
こんな感じでリポジトリの一覧から選んでVSCODEで開けたら便利ですよね。
その方法を実現する手順は以下の通り。
- findコマンドでPC内からリポジトリの一覧を作成&保存
- zshrcにpecoの設定を追加
- zshrcにfindのエイリアスを追加
これだけです。
ちなみにpecoのインストールについては公式を御覧ください。Homebrew, Scarf, apt等でもインストールできます。
peco/peco: Simplistic interactive filtering tool
1. findコマンドでPC内からリポジトリの一覧を作成&保存
> find ~/Documents -regex ".*/.git" > /path/to/git_paths.txt
引数の~/Documents
はgitリポジトリが眠っていそうな大体の場所です。まさか~/Movies
とか~/Music
なんかにリポジトリを置いてる人はいないでしょう。findは時間がかかるのである程度検索範囲を絞ったほうが良いです。私は基本的に~/Documents
以下に置いているのでここを検索対象にしました。
/path/to/git_paths.txt
は一覧を保存する場所です。適当なpathを指定してください。
ちなみに私の場合、コマンドの実行は約3分。170のリポジトリが発掘されました。
2. zshrcにpecoの設定を追加
.zshrc(他のshellならその設定ファイル)を開いて以下を追記します。
function peco-select-repository() {
local repo=$(cat /path/to/git_paths.txt | sed s/\.git$// | peco)
if [ -n "$repo" ]; then
print -z "${repo}"
fi
}
alias gp=peco-select-repository
内容を解説すると2行目のcatでファイルを読み込み、sedで末尾の.git
を削除(取得したいのは.gitディレクトリの親ディレクトリなので)、そしてpecoに渡しています。
4行目のprint -z "${repo}"
でパスを出力します。そのまま実行しても仕方がないので目的により書き換えたほうが良いかもしれません。
print -z "cd ${repo}" # 移動したい場合
print -z "code ${repo}" # VSCODEで開きたい場合
個々の目的に応じて書き換えてください。
これを保存してターミナルを開き直すと使えるようになります。
gp
+returnでリポジトリの一覧が表示されます。
3. zshrcにfindのエイリアスを追加
1で実行したfindは定期的に行って更新する必要があります。とは言っても最近のリポジトリは覚えているでしょうから頻繁に行う必要はありません。数ヶ月に1回で十分だと思います。
その時にfind hogehoge~~~
と書くのは面倒なのでaliasを設定しておきます。.zshrcに書きます。
alias reposearch='find ~/Documents -regex ".*/.git" > /path/to/git_paths.txt'
ターミナルを開き直すとreposearch
でfindを実行できるようになります。
まとめ
最終的に私の.zshrc
に追記したのはこんな感じです。
my_git_repo.txt
はzshrcの近くにある方が管理しやすいと思うので同じ階層の~/.zsh/
に置くことにしました。
function peco-select-repository() {
local repo=$(cat ~/.zsh/my_git_repo.txt | sed s/\.git$// | peco)
if [ -n "$repo" ]; then
print -z "code ${repo}"
fi
}
alias gp=peco-select-repository
alias reposearch='find ~/Documents -regex ".*/.git" > ~/.zsh/my_git_repo.txt'