ghqを使うとリポジトリ管理社会がほんの少し滑らかになりますが、どうもgit関連のコマンドが二つに分裂してしまった気がして精神が安定しなかったので、gitのエイリアスでどうにかしてみました1。
あなた2は以下のように設定しました。これで何ができるのかを見ていきます。
[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
: クローン
[alias]
get = !ghq get -p
普通です。-p
をつけるとSSH接続してくれます。
##git cd
: 指定したリポジトリに移動
[alias]
"!ghq look `ghq list | fzy $(echo $1 | awk '{if($1!=\"\") print \"-q\" $1}')` ; :"
どこからでも移動できます。
ghqだけだとリポジトリ名をフルで指定する必要がありますが、ここではfzyの曖昧検索を利用して、適当な入力でも移動できるようにしてみました。大抵の場合、git cd
のあとに検索クエリを指定してEnterを二回押せば移動できます。
##git list
: リポジトリ一覧
[alias]
list = !ghq list
普通です。ghqで管理しているリポジトリを一覧表示してくれます。
##git root
: 作業リポジトリのトップに移動
[alias]
root = "!exec $SHELL ; :"
はい。ghq関係ないですね。ただトップに移動するだけなら.bashrc
にgit-root
のような孤独なエイリアスを書いたりする必要はありません。シェルはリフレッシュしてしまいますが……。
##git unget
: リポジトリを削除
おまけです。
[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
に達した場合には中断するようになっているので、あなたのホームディレクトリを破壊したりしません。たぶん。
万が一使う場合は、神経症者になったつもりで、このスクリプトが何をやっているのか必ず具に確認してからにして下さい。
こちらに似たようなソリューションがあります。というか参考にしました。
#おわり