あらまし
Gitリポジトリのワーキングツリーのルートディレクトリや、カレントディレクトリとの相対パスが取得できると、リポジトリ全体に対する処理が楽にかけて便利です。
gitにはその機能が備わっていますので、それを使ってみました。
おことわり
Git 1.9で確認しています。
マニュアル見た限りでは大丈夫そうですが、ちょっと古いバージョンでは動作しない、または挙動が異なる場合があります。
時間のない人用まとめ
$ # Prepare
$ pwd
/home/myname
$ git init foo-repo
/home/myname/foo-repo/.git/
$ cd foo-repo/
$ mkdir -p bar/baz/
$ touch bar/baz/.gitkeep
$ git add bar/baz/.gitkeep
$ git commit -m "Initial commit"
$ # Example
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-toplevel
/home/myname/foo-repo
$ git rev-parse --git-dir # 常に絶対パスを返すとは限らない
/home/myname/foo-repo/.git
$ git rev-parse --show-cdup
../../
$ git rev-parse --show-prefix
bar/baz/
時間のある人用
/home/myname/foo-repo
がワーキングツリーのルートディレクトリです。
ワーキングツリーのルートの絶対パスを表示する
git rev-parse --show-toplevel
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-toplevel
/home/myname/foo-repo
カレントディレクトリから.git へのパスを表示する
git rev-parse --git-dir
このコマンドは少しややこしい振る舞いをします。
カレントディレクトリがワーキングツリーのルートであるとき、相対パスを返します。
つまり、.git
です。
$ pwd
/home/myname/foo-repo/
$ git rev-parse --git-dir
.git
カレントディレクトリがワーキングツリーのサブディレクトリであるとき、絶対パスを返します。
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --git-dir
/home/myname/foo-repo/.git
カレントディレクトリからのワーキングツリーのルートへの相対パスを表示する
git rev-parse --show-cdup
ルート への 相対パスを表示します。
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-cdup
../../
cd $(git rev-parse --show-cdup)
で、ワーキングツリーのルートへ移動します。
ワーキングツリーのルートからカレントディレクトリの相対パスを表示する
git rev-parse --show-prefix
ルート からの 相対パスを表示します。
$ pwd
/home/myname/foo-repo/bar/baz
$ git rev-parse --show-prefix
bar/baz/
ルートへの絶対パスを組み合わせると、カレントディレクトリになります。
つまり、pwd
と echo $(git rev-parse --show-toplevel)/$(git rev-parse --show-prefix)
は等しくなります。
ワーキングツリーの外で実行した場合
いずれも、ワーキングツリーの外で実行するとエラーメッセージを発して0以外の戻り値を返します。
$ git rev-parse --git-dir
fatal: Not a git repository (or any of the parent directories): .git
$ echo $?
128
応用
ワーキングツリーに含まれる.gitignore
を列挙する。
$ find $(git rev-parse --show-cdup) -type f -name .gitignore