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

自作Git作った話

 自作Git作った話

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

garebare

March 20, 2021
Tweet

More Decks by garebare

Other Decks in Programming

Transcript

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

    View full-size slide

  2. 自己紹介
    I’m Batman




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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    View full-size slide

  8. Gitとは?
    Gitとは

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    Gitの


    View full-size slide

  13. 自作Gitのファイルの仕様


    Gitの


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

    View full-size slide

  14. 自作Gitのファイルの仕様


    Gitの


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

    View full-size slide

  15. Blobの中身


    Gitの


    Blobの


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

    View full-size slide

  16. Treeの中身


    Gitの


    Treeの


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

    View full-size slide

  17. Commitの中身
    Gitの


    Com
    m
    itの


    commit {サイズ}\0
    tree {Treeのハシッシュ} bfore{前のCommitのハッシュ}
    ここはGitと全然違う。

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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





    した


    View full-size slide

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





    した


    initコ



    .smallgit
    /index
    /refs
    /refs/main
    /objects
    以上のファイルが生成される。

    View full-size slide

  22. とりあえず init コマンドから実装した





    した


    initコ



    .smallgit
    /index  addしたファイルがメモされるファイル
    /refs   ブランチが入るディレクトリ
    /refs/main mainブランチ、ファイルの中に最新のCmmitハッシュ
    /objects  Commit、TreeやBlobファイルが全てはいる

    View full-size slide

  23. 実装したコマンド


    した
    コマ


    コマンドだからコマンドーは安易

    View full-size slide

  24. add コマンド


    した
    コマ


    add




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

    View full-size slide

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


    した
    コマ


    com
    m
    itコ



    View full-size slide

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


    した
    コマ


    com
    m
    itコ



    View full-size slide

  27. 結構Gitっぽくなってきた


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

    View full-size slide

  28. というかコミットができたらすでにGitでは


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

    View full-size slide

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












    中身みれない

    View full-size slide

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


    した
    コマ


    catコ



    にゃーん

    View full-size slide

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

    View full-size slide

  32. 最後に


    誰がストーンとガントレットを

    View full-size slide

  33. これ用のGithub作られるの待ってます!


    パチン

    View full-size slide

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

    View full-size slide