dive into .git 日本語版

22
Dive into .git 2012-05-24 西尾泰和

Upload: nishio

Post on 24-May-2015

4.015 views

Category:

Documents


0 download

DESCRIPTION

社内勉強会で使った資料です

TRANSCRIPT

Page 1: Dive into .git 日本語版

Dive into .git

2012-05-24 西尾泰和

Page 2: Dive into .git 日本語版

about

•このスライドは社内勉強会で10分間でgitの中身を見てみるデモをするためにアンチョコとして作られたものです。

• 1ページ16スライドで印刷すると1枚で収まるのでちょうどいいかと思います。

Page 3: Dive into .git 日本語版

Gitよくわからん?

•「Gitのいろんな概念が難しい」?•じゃあ概念は置いといて、「物理的にはどうなってんの?」を確認してみよう!

• Gitがどんなものかイメージしやすくなれば幸い

Page 4: Dive into .git 日本語版

$ mkdir test$ cd test$ ls -a. ..

$ git initInitialized empty Git repository in .../test/.git/

$ git init test でもOK

種も仕掛けもないただの空のディレクトリを作る

実験用のリポジトリを作る

←できた!

Page 5: Dive into .git 日本語版

$ ls -a. .. .git

リポジトリができた!

Page 6: Dive into .git 日本語版

中身を見てみよう$ cd .git$ tree.|-- HEAD|-- config|-- description|-- hooks|-- info| `-- exclude|-- objects| |-- info| `-- pack`-- refs |-- heads `-- tags hooksの中身は省略した

Page 7: Dive into .git 日本語版

$ cd ..$ touch README$ git add README$ git commit -m “initial commit”[master (root-commit) 4dd66d3] initial commit

コミットしたら何が変わる?

Page 8: Dive into .git 日本語版

objectsが増えた$ tree .git/objects .git/objects|-- 4d| `-- d66d3a32a66f3578317717ccfb18|-- 54| `-- 3b9bebdc6bd5c4b22136034a95dd|-- e6| `-- 9de29bb2d1d6434b8b29ae775ad8|-- info`-- pack

長いファイル名の末尾は省略した他にも変わる部分があるが今回は割愛

Page 9: Dive into .git 日本語版

$ cat > show.py#!/usr/bin/env python import sys import zlib

data = file(sys.argv[1], "rb").read()data = zlib.decompress(data) print repr(data)

中を見てみよう!表示スクリプトを作る

以下ではshow.py。chmod +xを忘れずに

Page 10: Dive into .git 日本語版

Commitの中身$ ./show.py .git/objects/4d/d6... 'commit 201\x00tree 543b...\nauthor NISHIO Hirokazu <...> 1337655529 +0900\ncommitter NISHIO Hirokazu <...> 1337655529 +0900\n\ninitial commit\n'

適当に改行を入れたtree 543bに注目

ハッシュ値はコミット時のメッセージに表示されている

Page 11: Dive into .git 日本語版

Treeの中身$ ./show.py 54/3b...'tree 34\x00100644 README\x00\xe6\x9d\xe2\x9b...'

適当に改行を入れたe69bに注目

Page 12: Dive into .git 日本語版

Blobの中身

$ ./show.py e6/9d...'blob 0\x00'

これがREADMEの中身今は空なのでサイズが0\x00の後に何もない

Page 13: Dive into .git 日本語版

ファイル名

$ python -c “import hashlib; hashlib.sha1('blob 0\x00').hexdigest()”'e69de29b...'

実は中身のSHA1ハッシュ!

Page 14: Dive into .git 日本語版

まとめ•リポジトリは.git/の中に入っている• .git/objects/に、sha1ハッシュを名前にし、値をzlibで圧縮して、いろいろ入っている

•「いろいろ」の中にはcommitオブジェクト、treeオブジェクト、blobオブジェクト

•今回はtagやrefsの話は割愛(次回?)

Page 15: Dive into .git 日本語版

やってみよう• READMEを編集してどう変わるか観察しよう•新しいcommitオブジェクトには「parent <ハッシュ値>」の行がある

•新しいblobにはREADMEの内容が入っている•新しいファイルを追加してみよう。Treeはどう変わる?

•ファイルに追記したら?blobは差分?全体?

Page 16: Dive into .git 日本語版
Page 17: Dive into .git 日本語版

おまけ

• git show --format=rawがぜんぜんrawじゃなくて使いものにならない話

Page 18: Dive into .git 日本語版

中を見てみよう$ git show --format=raw 4dd6commit 4dd66d3a32a66f3578317717ccfb1876d43034eatree 543b9bebdc6bd5c4b22136034a95dd097a57d3ddauthor NISHIO Hirokazu <...> 1337138246 +0900committer NISHIO Hirokazu <...> 1337138246 +0900

initial commit

diff --git a/README b/READMEnew file mode 100644index 0000000..e69de29

メールアドレスは省略した

Page 19: Dive into .git 日本語版

Treeの中身

$ git show --format=raw 543btree 543b

README

Page 20: Dive into .git 日本語版

Blobの中身

何も表示されない

$ git show --format=raw e69d

Page 21: Dive into .git 日本語版

おかしい

これの中身がe69dだという情報はどこ?

$ git show --format=raw 543btree 543b

README

というわけで表示スクリプトを作った

Page 22: Dive into .git 日本語版

Q&A

• Q: スクリプト作らなくてもgunzipとかで解凍すれば良いのでは?

• A: zlibで圧縮されてはいるが、zipファイルとしてvalidなフォーマットにはなっていないので解凍できなかった。もしもっと手軽な方法があれば教えて下さい。