Git
GitDay 4

git rev-parseを使いこなす

More than 3 years have passed since last update.

こんにちは!

Gitを使っているとプログラムからGitのメタ情報を取りたい!ってこと、よくありますよね?

でも、 git status をgrepしたりしていませんか??

git rev-parse から取れる情報もたくさんあるんですよ!

というわけで git rev-parse のちょっと凝った使い方を説明します。


そもそも git rev-parse ってなによ?


Pick out and massage parameters


とのことです。

ちなみに、Google翻訳によると「選ぶとマッサージパラメータ」って出てきました。

つまり、(与えられたモノが)何なのかを明らかにすることと、(gitの)パラメータを出力することができるやつってことです。(雑)


git rev-parse

objectのhashが取得できます。

git rev-parse master # => f62f59973b8d9aeff1731e6f6260ca7fb9694ead


git rev-parse --short

objectのhashの短縮表記が取得できます。

git rev-parse --short master # => f62f599

git rev-parse --short f62f59973b8d9aeff1731e6f6260ca7fb9694ead # => f62f599


git rev-parse --symbolic

objectがシンボルであればそれをそのまま取得します。

git rev-parse --symbolic master # => master

git rev-parse --symbolic f62f599 # => f62f599


git rev-parse -show-cdup

カレントディレクトリからgitのルートディレクトリへの相対パスを得ることができます。

gitのルートディレクトリではなにも得られません。

git rev-parse --show-cdup

cd eg
git rev-parse --show-cdup # => ../


git rev-parse --show-prefix

現在のディレクトリへの、gitのルートディレクトリからの相対パスを得ることができます。

git rev-parse --show-prefix

カレントディレクトリからの相対パスを渡すことでgitのルートディレクトリからの相対パスも作ることができます。

cd eg

git rev-parse --show-prefix lib/MyProj/DB.pm | tr -d '\n' # => eg/lib/MyProj/DB.pm


git rev-parse --is-inside-work-tree

ワークツリーの中にいるかどうかを true または false という文字列で得ることができます。

git rev-parse --is-inside-work-tree # => true


git rev-parse --git-dir

.gitディレクトリのフルパスを得ることができます。

git rev-parse --git-dir # => /Users/karupanerura/project/Aniki/.git


git rev-parse --resolve-git-dir

指定したパスが.gitディレクトリか判定することができます。

パスとして正しければディレクトリすら不在でも通ります。

git rev-parse --resolve-git-dir lib  # => fatal: not a gitdir 'lib'

git rev-parse --resolve-git-dir .git # => .git


git rev-parse --show-toplevel

gitのルートディレクトリを得ることができます。

git rev-parse --show-toplevel # => /Users/karupanerura/project/Aniki


具体例

こういうことができます。捗る!

https://github.com/karupanerura/dotfiles/blob/master/git/config#L62

https://github.com/karupanerura/dotfiles/blob/master/git/config#L69

https://github.com/karupanerura/dotfiles/blob/master/bin/git-save#L5-L8


まとめ

いかがでしたでしょうか? git rev-parse べんり!って感じが伝わればいいなーと思います。

他にもいろんなことができます。「これ判定できないのかな?」って困ったときは git rev-parsegit diffgit log のドキュメントを見ればだいたい解決するきがします。(しないかも)

gitに管理下でメタい操作を行いたいときには必ず使いたくなるコマンドだと思います。

ワンライナーに!やっつけスクリプトに!今晩のおかずに!なんにでもいけますね!

明日は @oh-sky さんの GitGitにしてあげましょうかね(CV:大坪由佳) です。意味深ですね。(意味深ですね。)

お楽しみに!