深い階層からトップレベルディレクトリに戻るのが面倒だったので一気にジャンプする方法を考えてみた。
zshのマークとか使うと簡単かもしれないけど、それはそれ。
git rev-parseを活用する
git rev-paserでリポジトリのトップディレクトリを確認したりカレントディレクトリがワークツリーの中かどうかを判定できるみたいなのでこれを使う。
git rev-parse --is-inside-work-tree
ワークツリーの中であればtrueが返ってくる。
% git rev-parse --is-inside-work-tree
true
%
ワークツリーの外だとエラーが返ってくるんだけど
% git rev-parse --is-inside-work-tree
fatal: Not a git repository (or any of the parent directories): .git
%
と長ったらしいエラーメッセージが返ってくる。
これを判別するのも面倒なのでシェルの$?の方を見てあげる。
そうすると
% git rev-parse --is-inside-wokr-tree
true
% echo $?
0
%
となる。エラーの場合は
% git rev-parse --is-inside-work-tree
fatal: Not a git repository (or any of the parent directories): .git
% echo $?
128
%
ってことになる。これでワークツリーの中にいるかどうかが判定できる。で、ワークツリーの中にいるってことはトップレベルディレクトリがどこかにあるはずなので、そこに移動する。
git rev-parse --show-toplevel
リポジトリのトップレベルディレクトリを表示する。
% git rev-parse --show-toplevel
/User/hinagishi/prog/hoge/
%
みたいな感じになるので、ここに移動してあげる。
シェルで展開してあげると簡単なので
% cd `git rev-parse --show-toplevel`
としてあげるといいかな。
シェル関数を定義する
シェルスクリプト内でcdコマンドを実行しても、端末のワーキングディレクトリは移動しないのでシェル関数を使って移動できるようにする。
cdgitroot () {
git rev-parse --is-inside-work-tree > /dev/null
if [ $? = 0 ];
then
cd `git rev-parse --show-toplevel`
fi
}
自分はzshを使ってるけど、bashも同じ書き方でよかったはず。
自分の使ってるシェルに合わせて書いてあげればOK。
あとは端末上で関数名を入力してあげると、ワークツリー内部であればそのトップレベルディレクトリへ移動するし、そうでなければさっきのエラーメッセージが表示される。
追記
--show-toplevelが失敗すればエラーが出るので単にaliasにするんでもいいかも?
alias cdgitroot='cd `git rev-parse --show-toplevel`
またはコメントで教えてもらった方法を使えば
alias cdgitroot='git rev-parse --is-inside-work-tree && cd `git rev-parse --show-toplevel`'
なんて書き方でもよさそうですね。