Git

Git 「配管」コマンド 'hash-object' の例

この記事では「配管」コマンドと呼ばれる Git の基礎的なコマンドについて、簡単にまとめます。
各例において、「*入力」の下に記載されたコマンドを実行する直前のワークツリーの状態は下の PROJECT/ の状態と同じです。
.git/ フォルダーの内容は '$ git init' で初期化した状態のままです。

PROJECT/
PROJECT/
├ file1.txt
├ file2.txt
├ folder1/
│ ├ file3.txt
│ └ file4.txt
└ .git/
file1.txt
text 1
file2.txt
text 2
file3.txt
text 3
file4.txt
text 4

<file>...

<file>... は hash-object コマンドによって、blob オブジェクト(など)を作成するファイルを指定します。
blob オブジェクトはファイルの内容によって、名称・その他が決まります。ファイル名は考慮されません。

例1
*入力
$ git hash-object file1.txt

*出力
a118c4fd81877803e4becf8fbf49642edc9ac688

*.git/objects
[空です]

*staging area
[空です]

b59c62... の中身は file1.txt の中身である 'text 1' に加えて、このオブジェクトが blob であるということと、中身の文字列の長さが記録されています。

例2
*入力
$ git hash-object folder/file3.txt

*出力
b59c624beffc60a2515e185224926c338ebe674b

*.git/objects
[空です]

*staging area
[空です]

フォルダー名/ファイル名とすることもできます。

例3
*入力
$ git hash-object file1.txt folder/file3.txt

*出力
a118c4fd81877803e4becf8fbf49642edc9ac688
b59c624beffc60a2515e185224926c338ebe674b

*.git/objects
[空です]

*staging area
[空です]

複数のファイルを指定することもできます。

--stdin

--stdin をコマンドに含むことで、標準入力の内容から blob オブジェクト(など)を作成します。

例1
*入力
$ echo 'test' | git hash-object --stdin

*出力
9daeafb9864cf43055ae93beb0afd6c7d144bfa4

*.git/objects
[空です]

*staging area
[空です]

標準入力の内容は上記のように git コマンドに渡します。

例2
*入力
$ echo 'test' | git hash-object --stdin file1.txt

*出力
9daeafb9864cf43055ae93beb0afd6c7d144bfa4
a118c4fd81877803e4becf8fbf49642edc9ac688

*.git/objects
[空です]

*staging area
[空です]

同時にファイル名を指定すると、blob オブジェクト(など)が複数作成されます。

-w

-w をコマンドに含むことで、作成した blob オブジェクト(など)を .git/objects フォルダに保存します。
※出力には、以下のような文字列も含まれますが、文字数が徒に増えてしまうので、それを省略します。
'warning: LF will be replaced by CRLF in file1.txt.
The file will have its original line endings in your working directory'

*入力
$ git hash-object -w file1.txt file2.txt

*出力
a118c4fd81877803e4becf8fbf49642edc9ac688
e263913fb333115e7f9e5b6b7a38434ca5391d27

*.git/objects
a1/18c4fd81877803e4becf8fbf49642edc9ac688
e2/63913fb333115e7f9e5b6b7a38434ca5391d27

*staging area
[空です]

blob オブジェクトの名称の最初の2文字がフォルダー名に、残りの38文字がファイル名になります。