Slide 1

Slide 1 text

自作Git作った話 @garebare521 NewDebug #3.0

Slide 2

Slide 2 text

自己紹介 I’m Batman 自 己 紹 介 名前:ガレバレ Twitter:@garebare521 作ったもの  自作Shell  自作言語  ゲーム 最近ロゴみたいなのができた インターンしたい Microsoft好き

Slide 3

Slide 3 text

近況 自作Shellと自作gitを作った後ゲームを 一本リリースした。 ポートフォリオも更新した。

Slide 4

Slide 4 text

あとなんかZennで記事を2 つ書いたら2つとも トレンドに乗った

Slide 5

Slide 5 text

そして現在自作言語とゲームを並行して開発してます

Slide 6

Slide 6 text

ちなみにこのスライドLTする二ヶ月前に完成しました

Slide 7

Slide 7 text

本編 ゼロワン本編だけ微妙だった 本 編

Slide 8

Slide 8 text

Gitとは? Gitとは

Slide 9

Slide 9 text

例の流出事件で巻き添え食らってそうなやつ GitHubは悪くない Gitとは ?

Slide 10

Slide 10 text

分散バージョン管理ツール Gitとは ?

Slide 11

Slide 11 text

まぁ皆知ってるだろうから他の事は 飛ばしますが 64のクッパくらい飛ばす Gitとは ?

Slide 12

Slide 12 text

自作Gitの仕様 仕様を使用して 自 作 Gitの 仕 様

Slide 13

Slide 13 text

自作Gitのファイルの仕様 自 作 Gitの 仕 様 Blob Tree Commit の3種類のファイルが存在しています。

Slide 14

Slide 14 text

自作Gitのファイルの仕様 自 作 Gitの 仕 様 Blob  は ファイルの役割 Tree  は ディレクトリ、他のTreeのハッシュやBlobのハッシュ Commit は Treeのハッシュ、前のコミットの情報 それぞれこのような情報を有している

Slide 15

Slide 15 text

Blobの中身 自 作 Gitの 仕 様 Blobの 中 身 Blob {サイズ}\0{ファイルの中身} この部分は自作GitもGitも同じ。

Slide 16

Slide 16 text

Treeの中身 自 作 Gitの 仕 様 Treeの 中 身 tree {サイズ}\0 tree {Treeのハッシュ} {ディレクトリのパス}\n blob {Blobのハッシュ} {ファイルのパス}\n 多分ここはGitと違う。

Slide 17

Slide 17 text

Commitの中身 Gitの 仕 様 Com m itの 中 身 commit {サイズ}\0 tree {Treeのハシッシュ} bfore{前のCommitのハッシュ} ここはGitと全然違う。

Slide 18

Slide 18 text

ハッシュの生成 Blobだと Blob {サイズ}\0{ファイルの中身} これ全部をSHA-1でハッシュ値にする。

Slide 19

Slide 19 text

ファイルの生成 各種ファイルはzlibで圧縮されファイル名を ハッシュにして生成される

Slide 20

Slide 20 text

初めに実装した箇所 馴れ初め 初 め に 実 装 した 箇 所

Slide 21

Slide 21 text

とりあえず init コマンドから実装した 初 め に 実 装 した 箇 所 initコ マ ン ド .smallgit /index /refs /refs/main /objects 以上のファイルが生成される。

Slide 22

Slide 22 text

とりあえず init コマンドから実装した 初 め に 実 装 した 箇 所 initコ マ ン ド .smallgit /index  addしたファイルがメモされるファイル /refs   ブランチが入るディレクトリ /refs/main mainブランチ、ファイルの中に最新のCmmitハッシュ /objects  Commit、TreeやBlobファイルが全てはいる

Slide 23

Slide 23 text

実装したコマンド 実 装 した コマ ン ド コマンドだからコマンドーは安易

Slide 24

Slide 24 text

add コマンド 実 装 した コマ ン ド add コ マ ン ド 前回のコミットと見比べながらステータスと一緒にindex書き込む 前回のコミットのblobのハッシュと現在のblobハッシュが違えば edit 前回のコミットのTreeにパスがなければ create パスが前回のコミットのTreeにあって現在に存在しなければ delete {ステータス} {パス} {ハッシュ} このコマンドが実行された時点でファイルから生成されたBlobが objectsディレクトリの中に生成される

Slide 25

Slide 25 text

commitコマンド indexファイルにメモしたパスとハッシュを読み込んでTreeファイルを 生成する。 パスからディレクトリを抽出したり、ツリー構造にして書き込んだりす る、結構複雑。 Commitを生成してブランチにハッシュを書き込む 実 装 した コマ ン ド com m itコ マ ン ド

Slide 26

Slide 26 text

もうちょっとcommitコマンド 前回のコミットから比較して違う場所のTreeも差し替えなければなら ないので前回のコミットも読み込んで保持しておく。 今回のTreeのハッシュと前回のハッシュが違えば差し替える。 ただ一つのTreeが違えば芋づる式に違うの総入れ替えになってしま う。 実 装 した コマ ン ド com m itコ マ ン ド

Slide 27

Slide 27 text

結構Gitっぽくなってきた 結 構 Gitぽ くな って きた それっぽい

Slide 28

Slide 28 text

というかコミットができたらすでにGitでは 結 構 Gitぽ くな って きた それっぽい

Slide 29

Slide 29 text

中身見れねぇじゃねぇか! 中 身 み れ な い 中 身 見 れ な い 中身みれない

Slide 30

Slide 30 text

catコマンド cat {ハッシュ}でファイルの中身が見れる BlobとCommitはそのまま中身を表示 Treeはディレクトリとファイルを段々に表示してくれる 実 装 した コマ ン ド catコ マ ン ド にゃーん

Slide 31

Slide 31 text

比較して差分とかは出せないまぁできた

Slide 32

Slide 32 text

最後に 最 後 誰がストーンとガントレットを

Slide 33

Slide 33 text

これ用のGithub作られるの待ってます! 最 後 パチン

Slide 34

Slide 34 text

ご清聴ありがとうございました。