Upgrade to Pro — share decks privately, control downloads, hide ads and more …

自作Git作った話

 自作Git作った話

NEW DEBUGで発表したものになります

8e8d56e1b27437990e5e1feff1b33777?s=128

garebare

March 20, 2021
Tweet

More Decks by garebare

Other Decks in Programming

Transcript

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

  2. 自己紹介 I’m Batman 自 己 紹 介 名前:ガレバレ Twitter:@garebare521 作ったもの

     自作Shell  自作言語  ゲーム 最近ロゴみたいなのができた インターンしたい Microsoft好き
  3. 近況 自作Shellと自作gitを作った後ゲームを 一本リリースした。 ポートフォリオも更新した。

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

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

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

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

  8. Gitとは? Gitとは

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

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

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

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

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

  14. 自作Gitのファイルの仕様 自 作 Gitの 仕 様 Blob  は ファイルの役割 Tree  は ディレクトリ、他のTreeのハッシュやBlobのハッシュ

    Commit は Treeのハッシュ、前のコミットの情報 それぞれこのような情報を有している
  15. Blobの中身 自 作 Gitの 仕 様 Blobの 中 身 Blob

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

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

    {サイズ}\0 tree {Treeのハシッシュ} bfore{前のCommitのハッシュ} ここはGitと全然違う。
  18. ハッシュの生成 Blobだと Blob {サイズ}\0{ファイルの中身} これ全部をSHA-1でハッシュ値にする。

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

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

  21. とりあえず init コマンドから実装した 初 め に 実 装 した 箇

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

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

  24. add コマンド 実 装 した コマ ン ド add コ

    マ ン ド 前回のコミットと見比べながらステータスと一緒にindex書き込む 前回のコミットのblobのハッシュと現在のblobハッシュが違えば edit 前回のコミットのTreeにパスがなければ create パスが前回のコミットのTreeにあって現在に存在しなければ delete {ステータス} {パス} {ハッシュ} このコマンドが実行された時点でファイルから生成されたBlobが objectsディレクトリの中に生成される
  25. commitコマンド indexファイルにメモしたパスとハッシュを読み込んでTreeファイルを 生成する。 パスからディレクトリを抽出したり、ツリー構造にして書き込んだりす る、結構複雑。 Commitを生成してブランチにハッシュを書き込む 実 装 した コマ

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

    ン ド com m itコ マ ン ド
  27. 結構Gitっぽくなってきた 結 構 Gitぽ くな って きた それっぽい

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

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

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

    ド catコ マ ン ド にゃーん
  31. 比較して差分とかは出せないまぁできた

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

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

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