Help us understand the problem. What is going on with this article?

git rev-parseを使いこなす

More than 5 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:大坪由佳) です。意味深ですね。(意味深ですね。)
お楽しみに!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away