LoginSignup
5
5

More than 5 years have passed since last update.

gitのトップレベルディレクトリに移動する

Last updated at Posted at 2015-01-02

深い階層からトップレベルディレクトリに戻るのが面倒だったので一気にジャンプする方法を考えてみた。
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`'

なんて書き方でもよさそうですね。

5
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5