gitコマンドの使い方 ~ git cat-file ~

git cat-file コマンド概要
git cat-fileはリポジトリに登録されている以下のオブジェクトの内容を表示するコマンドです。
- commitオブジェクト
- treeオブジェクト
- blobオブジェクト
- tagオブジェクト
以下の図のworking-directory(作業ディレクトリ)のcommitが作成されている状態を元にgit cat-fileコマンドの動作を確認してみましょう。

git cat-file コマンドの使い方
hash値にはcommit、tree、blog、tagのいずれかのhash値を指定します。
commitの場合はcommit-hashのエイリアス(HEADやブランチ名など)を指定することもできます。
また、指定するオプションによってオブジェクトの種類や内容を参照することができます。
-t
-tオプションは指定したhash値のオブジェクトの種類を確認することができます。
次のサンプルは、git cat-file -t でcommit、tree、blobオブジェクトを指定した場合の出力結果です。
-s
指定したオブジェクトのサイズを取得します。
次のサンプルは、git cat-file -t でcommit、tree、blobオブジェクトを指定した場合の出力結果です。
-p
指定したオブジェクトの内容を出力します。
-pオプションで指定するオブジェクトの種類によって出力結果に違いがあります。
commitオブジェクトを指定した場合
commitオブジェクトを指定した場合は、以下の情報が出力されます。
- working-directoryのルートディレクトのtreeオブジェクト
- 親commit-hash
- 作成ユーザ
- commit実施ユーザ
HEADを指定していますが、commit-hash値を指定しても結果は同じです。
treeオブジェクトを指定した場合
treeオブジェクトはディレクトリを意味しますので、treeオブジェクトを指定した場合は、その配下のディレクトリ(treeオブジェクト)やファイル(blobオブジェクト)の情報が表示されます。
概要説明に図のディレクトリ、ファイル構造をgit cat-fileで出力した場合を確認してみましょう。
ディレクトリ、ファイル構造は以下の通り
root-directory
│ file-A.txt
│
├─dir-1
│ file-B.txt
│
└─dir-2
│ file-C.txt
│
└─dir-2-1
file-D.txt
では、root-directoryから順番にgit cat-fileで各treeオブジェクトの内容を出力していきます。
まず、root-directoryのtreeオブジェクトのhashを確認しましょう。
hash値が「858e7d31efdcc582a07490bac9beca8b6084f58c」であることがわかりましたので、コマンドを実行します。
dir-1、dir-2、file-A.txtの3つのオブジェクトがあることがわかりますね。
次は、dir-1のhash値「14c1cc982ae02ab37115a055ffd2c10369e08b5b」で実行します。
file-B.txtのみが格納されていますね。
dir-2についても確認すると、
dir-2-1とfile-C.txtが格納されています。
これで、ディレクトリが階層構造で格納されていることも確認できました。
最後にdir-2-1を確認すると、
file-D.txtのみとなってますね。
応用例として、commitオブジェクト直下のtreeオブジェクトを直接参照する場合は以下のように実行することもできます。
例として、HEADのcommit直下のtreeオブジェクトを参照する場合は、このように入力します。
「git cat-file -p 858e7d31efdcc582a07490bac9beca8b6084f58c」と同じ結果になっていることがわかります。
blobオブジェクトを指定した場合
blobオブジェクトの場合はファイルの内容がそのまま出力されています。
linuxのcatコマンドでファイルを指定した場合似ていますが、git cat-fileはリポジトリのblobオブジェクトの内容を出力することができる点が大きな違いです。
実際にblobオブジェクトを指定して確認してみましょう。
2番目と4番目のコマンドがblobオブジェクトの内容を指定しています。
git cat-file の全てのオプションを確認する方法
以下のコマンドを実行するとブラウザでgit cat-fileのヘルプページが表示される