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

2020年4月12日git-command

git cat-file コマンド概要

git cat-fileはリポジトリに登録されている以下のオブジェクトの内容を表示するコマンドです。

  • commitオブジェクト
  • treeオブジェクト
  • blobオブジェクト
  • tagオブジェクト

以下の図のworking-directory(作業ディレクトリ)のcommitが作成されている状態を元にgit cat-fileコマンドの動作を確認してみましょう。

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

git cat-file [オプション] [hash値]

hash値にはcommit、tree、blog、tagのいずれかのhash値を指定します。

commitの場合はcommit-hashのエイリアス(HEADやブランチ名など)を指定することもできます。

また、指定するオプションによってオブジェクトの種類や内容を参照することができます。

-t

git cat-file -t [hash値]

-tオプションは指定したhash値のオブジェクトの種類を確認することができます。

次のサンプルは、git cat-file -t でcommit、tree、blobオブジェクトを指定した場合の出力結果です。

(master)
$ git cat-file -t 7facabecde5d21d3b74da27a6b2c83918927db45
commit

(master)
$ git cat-file -t HEAD
commit

(master)
$ git cat-file -t master
commit

(master)
$ git cat-file -t 858e7d31efdcc582a07490bac9beca8b6084f58c
tree

(master)
$ git cat-file -t bb9c29cef8f89d01eebf37599c1fb1e86d068cd2
blob

-s

git cat-file -s [hash値]

指定したオブジェクトのサイズを取得します。

次のサンプルは、git cat-file -t でcommit、tree、blobオブジェクトを指定した場合の出力結果です。

// commit
(master)
$ git cat-file -s 7facabecde5d21d3b74da27a6b2c83918927db45
222

// tree
(master)
$ git cat-file -s 858e7d31efdcc582a07490bac9beca8b6084f58c
102

// blob
(master)
$ git cat-file -s bb9c29cef8f89d01eebf37599c1fb1e86d068cd2
21

-p

git cat-file -p [hash値]

指定したオブジェクトの内容を出力します。

-pオプションで指定するオブジェクトの種類によって出力結果に違いがあります。

commitオブジェクトを指定した場合

commitオブジェクトを指定した場合は、以下の情報が出力されます。

  • working-directoryのルートディレクトのtreeオブジェクト
  • 親commit-hash
  • 作成ユーザ
  • commit実施ユーザ
(master)
$ git cat-file -p HEAD
tree 858e7d31efdcc582a07490bac9beca8b6084f58c
parent 7144ef898defdf46d8f774ba3f060750ad3eb14c
author snow <snow@abc.com> 1586662818 +0900
committer snow <snow@abc.com> 1586662818 +0900

HEADを指定していますが、commit-hash値を指定しても結果は同じです。

(master)
$ git cat-file -p 7facabecde5d21d3b74da27a6b2c83918927db45
tree 858e7d31efdcc582a07490bac9beca8b6084f58c
parent 7144ef898defdf46d8f774ba3f060750ad3eb14c
author snow <snow@abc.com> 1586662818 +0900
committer snow <snow@abc.com> 1586662818 +0900

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を確認しましょう。

(master)
$ git cat-file -p HEAD
tree 858e7d31efdcc582a07490bac9beca8b6084f58c
parent 7144ef898defdf46d8f774ba3f060750ad3eb14c
author snow <snow@abc.com> 1586662818 +0900
committer snow <snow@abc.com> 1586662818 +0900

hash値が「858e7d31efdcc582a07490bac9beca8b6084f58c」であることがわかりましたので、コマンドを実行します。

(master)
$ git cat-file -p 858e7d31efdcc582a07490bac9beca8b6084f58c
040000 tree 14c1cc982ae02ab37115a055ffd2c10369e08b5b    dir-1
040000 tree 0080f636c894f51949e73b78aea8f3b658876156    dir-2
100644 blob bb9c29cef8f89d01eebf37599c1fb1e86d068cd2    file-A.txt

dir-1、dir-2、file-A.txtの3つのオブジェクトがあることがわかりますね。

次は、dir-1のhash値「14c1cc982ae02ab37115a055ffd2c10369e08b5b」で実行します。

(master)
$ git cat-file -p 14c1cc982ae02ab37115a055ffd2c10369e08b5b
100644 blob 803a86a58c9e2323ec97ca8adcf9c33b803c445c    file-B.txt

file-B.txtのみが格納されていますね。

dir-2についても確認すると、

(master)
$ git cat-file -p 0080f636c894f51949e73b78aea8f3b658876156
040000 tree f0af2af9337138fbcc787d5d7dd4399f55f5375b    dir-2-1
100644 blob 6a6d44ff5efb70bfecfb63e4969fe142fe7a33d0    file-C.txt

dir-2-1とfile-C.txtが格納されています。

これで、ディレクトリが階層構造で格納されていることも確認できました。

最後にdir-2-1を確認すると、

(master)
$ git cat-file -p f0af2af9337138fbcc787d5d7dd4399f55f5375b
100644 blob 5a9d1f7d866621e1309a223003a935c400c67972    file-D.txt

file-D.txtのみとなってますね。

応用例として、commitオブジェクト直下のtreeオブジェクトを直接参照する場合は以下のように実行することもできます。

git cat-file -p [commit-hash]^{tree}

例として、HEADのcommit直下のtreeオブジェクトを参照する場合は、このように入力します。

(master)
$ git cat-file -p HEAD^{tree}
040000 tree 14c1cc982ae02ab37115a055ffd2c10369e08b5b    dir-1
040000 tree 0080f636c894f51949e73b78aea8f3b658876156    dir-2
100644 blob bb9c29cef8f89d01eebf37599c1fb1e86d068cd2    file-A.txt

「git cat-file -p 858e7d31efdcc582a07490bac9beca8b6084f58c」と同じ結果になっていることがわかります。

blobオブジェクトを指定した場合

blobオブジェクトの場合はファイルの内容がそのまま出力されています。

linuxのcatコマンドでファイルを指定した場合似ていますが、git cat-fileはリポジトリのblobオブジェクトの内容を出力することができる点が大きな違いです。

実際にblobオブジェクトを指定して確認してみましょう。

(master)
$ git cat-file -p HEAD^{tree}
040000 tree 14c1cc982ae02ab37115a055ffd2c10369e08b5b    dir-1
040000 tree 0080f636c894f51949e73b78aea8f3b658876156    dir-2
100644 blob bb9c29cef8f89d01eebf37599c1fb1e86d068cd2    file-A.txt

(master)
$ git cat-file -p bb9c29cef8f89d01eebf37599c1fb1e86d068cd2
aaaaaaaaaa
AAAAAAAAAA

(master)
$ git cat-file -p 14c1cc982ae02ab37115a055ffd2c10369e08b5b
100644 blob 803a86a58c9e2323ec97ca8adcf9c33b803c445c    file-B.txt

(master)
$ git cat-file -p 803a86a58c9e2323ec97ca8adcf9c33b803c445c
bbbbbbbbbb
BBBBBBBBBB

2番目と4番目のコマンドがblobオブジェクトの内容を指定しています。

git cat-file の全てのオプションを確認する方法

以下のコマンドを実行するとブラウザでgit cat-fileのヘルプページが表示される

git cat-file --help

Gitコマンドの使い方一覧

git-command

Posted by snow