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 Slide

  2. 自己紹介
    I’m Batman




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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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


    View Slide

  8. Gitとは?
    Gitとは

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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


    Gitの


    View Slide

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


    Gitの


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

    View Slide

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


    Gitの


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

    View Slide

  15. Blobの中身


    Gitの


    Blobの


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

    View Slide

  16. Treeの中身


    Gitの


    Treeの


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

    View Slide

  17. Commitの中身
    Gitの


    Com
    m
    itの


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

    View Slide

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

    View Slide

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

    View Slide

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





    した


    View Slide

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





    した


    initコ



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

    View Slide

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





    した


    initコ



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

    View Slide

  23. 実装したコマンド


    した
    コマ


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

    View Slide

  24. add コマンド


    した
    コマ


    add




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

    View Slide

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


    した
    コマ


    com
    m
    itコ



    View Slide

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


    した
    コマ


    com
    m
    itコ



    View Slide

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


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

    View Slide

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


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

    View Slide

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












    中身みれない

    View Slide

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


    した
    コマ


    catコ



    にゃーん

    View Slide

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

    View Slide

  32. 最後に


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

    View Slide

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


    パチン

    View Slide

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

    View Slide