Shell

ghq管理下のリポジトリを検索するとき、自分で作ったのから絞り込めるようにした

からの続き。

あれ以来、特に置き場の決まっていないなにかをGithubからcloneするときはghq getして、シェル関数で検索できるようにしています。便利。

しかし、管理下にあるリポジトリが増えるにつれ、自分で作ったリポジトリだけ検索したい場合が増えてきました。

そこで、シェル関数をちょっと弄って、「ghq全体から検索」と「自分で作ったリポジトリの中から検索」を分けてみました。

シェル関数

.bashrcで定義。

参考として、ghq管理下のディレクトリ構成は以下のようになります。

(ghqルートディレクトリ)/(リモートリポジトリのドメイン)/(ユーザ名)/(プロジェクト名)

~/.gitconfigでghqルートディレクトリを指定。

1
2
[ghq]
root = ~/ghq

するとこんな感じ。

~/ghq/github.com/catfist/MyHexo
~/ghq/bibucket.org/catfist/dotfiles

ghq listで検索する場合、ドメインは検索対象になりません。(ユーザ名)/(プロジェクト名)から部分一致検索されます。

1個だけ出力して即cd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 自分で作ったのだけ(find repositories)
fr ()
{
dir=$(ghq list -p "catfist/"|grep -im1 "$(ghq root)/[^/]*/catfist/.*$1.*")
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit";
fi
}
# ghq全体(find repositories all)
fra ()
{
dir=$(ghq list -p|grep -im1 ".*$1.*")
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}

pecoで絞り込みしてcd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 自分で作ったのだけ(ghq+peco)
gp () {
dir=$(ghq list -p catfist/|grep "$(ghq root)/.*/catfist/.*$1.*"|peco)
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}
# ghq全体(ghq+peco all)
gpa () {
dir=$(ghq list -p "$1"|peco)
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}

分散したローカルリポジトリをhln+ghq+pecoで管理する

こんなことをやっていたら、それghqという彼方からの説教が聞こえたので。

ghqとは

Gitのローカルリポジトリを一括管理できるコマンドラインツールです。指定したディレクトリ以下にローカルリポジトリを配置することにより、検索してcdとかが簡単にできます。

pecoとは

標準入力をインクリメンタルサーチするコマンドラインツールです。これにより、ghq管理下のリポジトリをインクリメンタルサーチすることができます。

ローカルリポジトリの分散

ghq+pecoによるローカルリポジトリ管理は非常に快適なのですが、一身上の都合によりディレクトリを移動できないリポジトリも存在します。Alfred WorkflowとかSublime Textの設定ファイルとか。

ghqのルートディレクトリ以下に/プロジェクト名/.gitを配置しないと、ghqで管理することができません。

どうするか。

ディレクトリのハードリンクを作成する

hlnを利用して、ghqルートディレクトリ以下にディレクトリのハードリンクを作成します。

例えば、Alfred Workflowのディレクトリをターミナルで開いているとして…

1
2
3
$ hln $(pwd) $(ghq root)/github.com/catfist/Add-to-Listacular
$ ghq list Add
github.com/catfist/Add-to-Listacular

こんな具合ですね。当初、シンボリックリンクとかエイリアスとかでなんとかしようとして吐きそうになってました。

おまけ:Gistsもghqで管理しようとしたが

gistyで既存のGistsを全部ローカルに引っ張れるので、これでコード管理楽勝じゃんヤッホーと一瞬だけ思ったのですが。

スクリーンショット

これはつらい。人間が読めるディレクトリ名してないので無理があります。

Gistsだけは別枠で管理するしかなさそうです。まあ、実際そのほうがいいとも思う。

AlfredからCloud.appで開くとアップロードできる


ver. 3.0.1 - 無料( 仕事効率化 )
Linebreak

Cloud.appでファイルを開くとアップロードされる

単なる常駐アプリだと思っていたので、今まで試しもしなかったのですが、Mac版のCloud.appでなんでもいいからファイルを開くと、アップロードされます。

必ずしもMac OS Xサービスとか、ドラッグアンドドロップじゃなくていいわけです。

ということは、色々と使い道が増えてきます。

Alfredから


ver. 1.2 - 無料( 仕事効率化 )
Running with Crayons Ltd

ヒットしたファイルをCloud.appで開く、でアップロードできます。というかこれができることに気付いてアッてなった。

特にAlfred2 Powerpack導入済みの場合、ファイルナビゲーションからのアップロードが強力です。

ターミナルから

1
open -a cloud.app example.zip

こんなコマンドで、簡単にアップロードできます。何かを圧縮ついでにアップロードとか便利そうではある。

AppleScriptから

なんかできるらしいことが書いてありますが。

公式ドキュメントが見当たらないんだよなあ。

まあ、個人的にはAppleScript対応アプリでいじってるものをアップロードすることはあんまりなさそうなのですぱっと諦め。