Git
エイリアス
Ghq
fzy

ghqとgit aliasのある生活

ghqを使うとリポジトリ管理社会がほんの少し滑らかになりますが、どうもgit関連のコマンドが二つに分裂してしまった気がして精神が安定しなかったので、gitのエイリアスでどうにかしてみました1

あなた2は以下のように設定しました。これで何ができるのかを見ていきます。

.gitconfig
[alias]
    get = !ghq get -p
    cd = "!ghq look `ghq list | fzy $(echo $1 | awk '{if($1!=\"\") print \"-q\" $1}')` ; :"
    list = !ghq list
    root = "!exec $SHELL ; :"

git get: クローン

.gitconfig
[alias]
    get = !ghq get -p

普通です。-pをつけるとSSH接続してくれます。

git cd: 指定したリポジトリに移動

.gitconfig
[alias]
    "!ghq look `ghq list | fzy $(echo $1 | awk '{if($1!=\"\") print \"-q\" $1}')` ; :"

どこからでも移動できます。

ghqだけだとリポジトリ名をフルで指定する必要がありますが、ここではfzyの曖昧検索を利用して、適当な入力でも移動できるようにしてみました。大抵の場合、git cdのあとに検索クエリを指定してEnterを二回押せば移動できます。

git list: リポジトリ一覧

.gitconfig
[alias]
    list = !ghq list

普通です。ghqで管理しているリポジトリを一覧表示してくれます。

git root: 作業リポジトリのトップに移動

.gitconfig
[alias]
    root = "!exec $SHELL ; :"

はい。ghq関係ないですね。ただトップに移動するだけなら.bashrcgit-rootのような孤独なエイリアスを書いたりする必要はありません。シェルはリフレッシュしてしまいますが……。

git unget: リポジトリを削除

おまけです。

.gitconfig
[alias]
    unget = "!REPO=`ghq list | fzy $(echo $1 | awk '{if($1!=\"\") print \"-q\" $1}') | tee /dev/tty` ; if [ -n \"$REPO\" -a -e \"$(ghq root)/$REPO\" ] ; then REPO=\"`ghq root`/$REPO\" ; else exit 1 ; fi ; if [ -n \"$(git -C \"$REPO\" -c status.color=always status --short | tee /dev/tty)\" -o -n \"$(git -C \"$REPO\" log --branches --not --remotes --simplify-by-decoration --decorate --oneline --color=always | tee /dev/tty)\" ] ; then read -rp \"These changes will be deleted permanently. OK? [yN]\" yN ; case \"$yN\" in [Yy]*) : ;; '' | [Nn]* | *) echo Aborted. ; exit 1 ;; esac ; fi ; for i in `seq 3` ; do if [ -n \"$(realpath --relative-to=\"$REPO\" . | awk '! /^\\.\\./')\" ] ; then cd `dirname $REPO` ; fi ; rm -rf \"$REPO\" ; REPO=`dirname $REPO` ; if [ -n \"$(ls -A \"$REPO\")\" -o \"$(ghq root)\" = \"$REPO\" ] ; then break ; fi ; done ; echo Deleted. ; :"

長すぎる。

ghqで管理しているリポジトリの削除を試みます。変更や未プッシュのコミットがあった場合は[yN]で確認を取ります。削除したことによって親ディレクトリが空になった場合、それも削除してくれます。三回rm -rfするかghq rootに達した場合には中断するようになっているので、あなたのホームディレクトリを破壊したりしません。たぶん。

万が一使う場合は、神経症者になったつもりで、このスクリプトが何をやっているのか必ず具に確認してからにして下さい。

こちらに似たようなソリューションがあります。というか参考にしました。

おわり


  1. ghqはsvnなどもサポートしているので本当はよくないのですが、個人的にはgitしか使っていないので……。 

  2. 筆者のことです。