🏹

Gitコマンド入門::Gitオブジェクト(Packfile)第五十九回

2021/03/23に公開

みなさんこんにちは! さあ~今回からは、Packfile を学習していきます。また、いつものように、本家サイトに沿って進めていきますね。毎度の話になりますけど、やっぱり本家本元だけあって、内容は分かりやすいです。ただ翻訳が微妙なので、初心者にとっては、言い回しが分かりにくいだけですね~(笑)でも、学習する内容は、やっぱりいいんだよね~

前回、第五十八回の記事はこちらから!

https://zenn.dev/shiozumi/articles/2c79628bbbb042

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

今回からの課題は、ここを参考にしています!

https://git-scm.com/book/ja/v2/Gitの内側-Packfile

10.4 Gitの内側 - Packfile

それでは早速いつもの~ git initから!

$ mkdir func0059 && cd $_
// フォルダー作成と移動を同時に実行、
// 第59回なので、func0059

$ git init
// 毎度のイニシャル!

$ ls -la
drwxrwxr-x  7 shiozumi shiozumi   111  323 15:22 .git
-rwxr--r--  1 shiozumi shiozumi 82354  318 13:09 sakuranoki.png

// 今回は、sakuranoki.png ファイルを使ってみます!
// 勿論、どんなファイルでもOKです!

sakuranoki.png を、add,commit!

$ git add sakuranoki.png
$ git commit -m "1st"
[master (root-commit) 0bd2c31] 1st
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 sakuranoki.png

$ git log --oneline
0bd2c31 (HEAD -> master) 1st

$ find .git/objects/ -type f
.git/objects/57/fee07f6e1ff712f64fa0a8050e7207f6d2c1dc
.git/objects/c2/87d3041c8fd36637d0d9975fa0d8d10c2c1835
.git/objects/0b/d2c31c147b34d7a67b537f2ac9de9d22042960
// 3つのオブジェクトが作成されていますね!
// どのファイルが、sakuranoki.png なので調べて見ましょう!

$ git cat-file -p master^{tree}
100755 blob 57fee07f6e1ff712f64fa0a8050e7207f6d2c1dc    sakuranoki.png
// ハッシュ値と、ファイル名の紐づけを確認!

$ git cat-file -t 57fee07f6e1ff712f64fa0a8050e7207f6d2c1dc
blob
// blob ですね!

$ git cat-file -s 57fee07f6e1ff712f64fa0a8050e7207f6d2c1dc
82354
// 画像ファイルなので、82Kbytesぐらいありますね!

$ ls -a .git/objects/
.  ..  0b  57  c2  info  pack
// 既に、info pack のフォルダーが存在していますが、
// 実際にその中にはファイルは、まだ、ありません。

今回のコマンド操作と確認の流れ!

  1. sakuranoki.png に若干の変更を加える。
  2. 同じファイル名で保存して、add,コミットする。
  3. 新しいオブジェクトが作成される。
  4. git gc コマンドで、オブジェクトを圧縮する。
  5. pack ファルダーに新しくオブジェクトが作成される。
$ cp sakuranoki.png sakuranoki_back.png
// 一応、バックアップを取って置きます。

$ echo "0123" >> sakuranoki.png
4bytesですが、強引にファイルのお尻に追加してみました!

$ ls -la
-rwxr--r--  1 shiozumi shiozumi 82359  323 15:48 sakuranoki.png
-rwxr--r--  1 shiozumi shiozumi 82354  323 15:48 sakuranoki_back.png
// こんな感じで、sakuranoki.pngは、5bytesほど、増えましたね。
// 82359 バイトとなりました!

$ git add sakuranoki.png
$ git commit -m "2nd"
[master eba6383] 2nd
 1 file changed, 0 insertions(+), 0 deletions(-)

$ git log --oneline
eba6383 (HEAD -> master) 2nd
0bd2c31 1st

$ find .git/objects/ -type f
.git/objects/57/fee07f6e1ff712f64fa0a8050e7207f6d2c1dc
.git/objects/c2/87d3041c8fd36637d0d9975fa0d8d10c2c1835
.git/objects/0b/d2c31c147b34d7a67b537f2ac9de9d22042960
.git/objects/3b/8b5e01def241b4076f1b496cbef43311e30caf
.git/objects/d8/f39fbcc331c86f178253103bfdf7dd00c3ed8a
.git/objects/eb/a63831d1d31a30a9c608d68bb3ed98fc1a415a
// さらに3つ増えて、6のオブジェクトが作成されていますね!
// どのファイルが、sakuranoki.png なので調べて見ましょう!

$ git cat-file -p master^{tree}
100755 blob 3b8b5e01def241b4076f1b496cbef43311e30caf    sakuranoki.png
// ハッシュ値と、ファイル名の紐づけを確認!

$ git cat-file -s 3b8b5e01def241b4076f1b496cbef43311e30caf
82359
// ファイルサイズも、82359 で、一緒ですね。

du でファイル容量の確認

$  du .git/objects/
0       .git/objects/pack
0       .git/objects/info
80      .git/objects/57 // <!-- sakuranoki.png 元のファイル
4       .git/objects/c2
4       .git/objects/df
80      .git/objects/3b // <!-- sakuranoki.png 新しいファイル
4       .git/objects/d8
4       .git/objects/27
176     .git/objects/

$  du .git/objects/ -sh
176K    .git/objects/
// 総容量が、176K bytesです。

git gc コマンドで、オブジェクトを、pack!!

$ git gc
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 12 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), done.
Total 6 (delta 1), reused 0 (delta 0)
Computing commit graph generation numbers: 100% (2/2), done.

// なにやら、処理をしてくれたみたいです!(笑)

find .git/objects/ -type f

$ find .git/objects/ -type f
.git/objects/pack/pack-18f35d1d2b0fbd7a02db044d4c062a4ed702f9fc.pack
.git/objects/pack/pack-18f35d1d2b0fbd7a02db044d4c062a4ed702f9fc.idx
.git/objects/info/packs
.git/objects/info/commit-graph
// commit-graph っていうのは、Gitサイトのドキュメントとは、異なりますけど、
// pack idx の2つのファイルが出来ました!

du で再度pack後のファイル容量の確認

$ du .git/objects/
84      .git/objects/pack // <-- pngファイルだけでなく、全部、pack されましたね。
8       .git/objects/info
92      .git/objects/

$ du .git/objects/ -sh
92K     .git/objects/
// git gc pack前の、176Kから、92Kに減っていますね。

git verify-pack -v

では、新しくできた、pack-18f35d~の中身をのぞいてみましよう!

$  git verify-pack -v .git/objects/pack/pack-18f35d1d2b0fbd7a02db044d4c062a4ed702f9fc.idx
eba63831d1d31a30a9c608d68bb3ed98fc1a415a commit 232 156 12
0bd2c31c147b34d7a67b537f2ac9de9d22042960 commit 184 126 168
3b8b5e01def241b4076f1b496cbef43311e30caf blob   82359 81168 294
d8f39fbcc331c86f178253103bfdf7dd00c3ed8a tree   42 53 81462
c287d3041c8fd36637d0d9975fa0d8d10c2c1835 tree   42 53 81515
57fee07f6e1ff712f64fa0a8050e7207f6d2c1dc blob   11 23 81568 1 3b8b5e01def241b4076f1b496cbef43311e30caf
non delta: 5 objects
chain length = 1: 1 object
.git/objects/pack/pack-18f35d1d2b0fbd7a02db044d4c062a4ed702f9fc.pack: ok

3b8b5e01def241b4076f1b496cbef43311e30caf

こちらが、sakuranoki.png の新しいファイルです。blob 82359 81168 294 と4つのパラメーターがありまして、blobの次の2つ目のパラメーター、82359が、ファイルサイズです。ファイルサイズが、一致しているのが確認できました。

57fee07f6e1ff712f64fa0a8050e7207f6d2c1dc

こちらが、sakuranoki.png の元のファイルですね。blob 11 23 81568 1 3b8b5e01def241b4076f1b496cbef43311e30caf こちらは、5つのパラメーターですね。
ファイルサイズは、11 bytesとなっていて、一番最後のハッシュ値、3b8b5e~は、新しく追加作成した、sakuranoki.png のハッシュ値を参照していますね。

まとめ

古い方のファイルは、新しいファイルを元にして、その差分だけを保存しているようです。.git/objects/ 以下のファイルの総容量としては、実際に、176Kから、92Kに圧縮されていることも確認できましたね!

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/cdf62fdf696b98
https://twitter.com/esmile2013

Discussion