Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自作Git作った話
Search
garebare
March 20, 2021
Programming
3
720
自作Git作った話
NEW DEBUGで発表したものになります
garebare
March 20, 2021
Tweet
Share
More Decks by garebare
See All by garebare
ペンギンをおすすめする
garebareda
0
40
hey-techcamp-2022
garebareda
2
62
Rustで作った自作コマンド群の話
garebareda
0
160
クリーンアーキテクチャ をGoでする場合に不要な Interfaceは消しやがれ
garebareda
0
130
Rustで自作言語のインタプリタ作って Webで動くようにした話
garebareda
0
810
Vtuberをやりたくなりました
garebareda
1
74
Other Decks in Programming
See All in Programming
AIでLINEスタンプを作ってみた
eycjur
1
230
Zendeskのチケットを Amazon Bedrockで 解析した
ryokosuge
3
320
AI時代のUIはどこへ行く?
yusukebe
18
9.1k
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
130
AWS発のAIエディタKiroを使ってみた
iriikeita
1
190
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
170
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
110
楽して成果を出すためのセルフリソース管理
clipnote
0
190
概念モデル→論理モデルで気をつけていること
sunnyone
3
300
複雑なフォームに立ち向かう Next.js の技術選定
macchiitaka
2
240
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
460
Navigating Dependency Injection with Metro
zacsweers
3
3.5k
Featured
See All Featured
Faster Mobile Websites
deanohume
309
31k
We Have a Design System, Now What?
morganepeng
53
7.8k
Being A Developer After 40
akosma
90
590k
Designing for Performance
lara
610
69k
Gamification - CAS2011
davidbonilla
81
5.4k
It's Worth the Effort
3n
187
28k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
RailsConf 2023
tenderlove
30
1.2k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
Docker and Python
trallard
46
3.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
Navigating Team Friction
lara
189
15k
Transcript
自作Git作った話 @garebare521 NewDebug #3.0
自己紹介 I’m Batman 自 己 紹 介 名前:ガレバレ Twitter:@garebare521 作ったもの
自作Shell 自作言語 ゲーム 最近ロゴみたいなのができた インターンしたい Microsoft好き
近況 自作Shellと自作gitを作った後ゲームを 一本リリースした。 ポートフォリオも更新した。
あとなんかZennで記事を2 つ書いたら2つとも トレンドに乗った
そして現在自作言語とゲームを並行して開発してます
ちなみにこのスライドLTする二ヶ月前に完成しました
本編 ゼロワン本編だけ微妙だった 本 編
Gitとは? Gitとは
例の流出事件で巻き添え食らってそうなやつ GitHubは悪くない Gitとは ?
分散バージョン管理ツール Gitとは ?
まぁ皆知ってるだろうから他の事は 飛ばしますが 64のクッパくらい飛ばす Gitとは ?
自作Gitの仕様 仕様を使用して 自 作 Gitの 仕 様
自作Gitのファイルの仕様 自 作 Gitの 仕 様 Blob Tree Commit の3種類のファイルが存在しています。
自作Gitのファイルの仕様 自 作 Gitの 仕 様 Blob は ファイルの役割 Tree は ディレクトリ、他のTreeのハッシュやBlobのハッシュ
Commit は Treeのハッシュ、前のコミットの情報 それぞれこのような情報を有している
Blobの中身 自 作 Gitの 仕 様 Blobの 中 身 Blob
{サイズ}\0{ファイルの中身} この部分は自作GitもGitも同じ。
Treeの中身 自 作 Gitの 仕 様 Treeの 中 身 tree
{サイズ}\0 tree {Treeのハッシュ} {ディレクトリのパス}\n blob {Blobのハッシュ} {ファイルのパス}\n 多分ここはGitと違う。
Commitの中身 Gitの 仕 様 Com m itの 中 身 commit
{サイズ}\0 tree {Treeのハシッシュ} bfore{前のCommitのハッシュ} ここはGitと全然違う。
ハッシュの生成 Blobだと Blob {サイズ}\0{ファイルの中身} これ全部をSHA-1でハッシュ値にする。
ファイルの生成 各種ファイルはzlibで圧縮されファイル名を ハッシュにして生成される
初めに実装した箇所 馴れ初め 初 め に 実 装 した 箇 所
とりあえず init コマンドから実装した 初 め に 実 装 した 箇
所 initコ マ ン ド .smallgit /index /refs /refs/main /objects 以上のファイルが生成される。
とりあえず init コマンドから実装した 初 め に 実 装 した 箇
所 initコ マ ン ド .smallgit /index addしたファイルがメモされるファイル /refs ブランチが入るディレクトリ /refs/main mainブランチ、ファイルの中に最新のCmmitハッシュ /objects Commit、TreeやBlobファイルが全てはいる
実装したコマンド 実 装 した コマ ン ド コマンドだからコマンドーは安易
add コマンド 実 装 した コマ ン ド add コ
マ ン ド 前回のコミットと見比べながらステータスと一緒にindex書き込む 前回のコミットのblobのハッシュと現在のblobハッシュが違えば edit 前回のコミットのTreeにパスがなければ create パスが前回のコミットのTreeにあって現在に存在しなければ delete {ステータス} {パス} {ハッシュ} このコマンドが実行された時点でファイルから生成されたBlobが objectsディレクトリの中に生成される
commitコマンド indexファイルにメモしたパスとハッシュを読み込んでTreeファイルを 生成する。 パスからディレクトリを抽出したり、ツリー構造にして書き込んだりす る、結構複雑。 Commitを生成してブランチにハッシュを書き込む 実 装 した コマ
ン ド com m itコ マ ン ド
もうちょっとcommitコマンド 前回のコミットから比較して違う場所のTreeも差し替えなければなら ないので前回のコミットも読み込んで保持しておく。 今回のTreeのハッシュと前回のハッシュが違えば差し替える。 ただ一つのTreeが違えば芋づる式に違うの総入れ替えになってしま う。 実 装 した コマ
ン ド com m itコ マ ン ド
結構Gitっぽくなってきた 結 構 Gitぽ くな って きた それっぽい
というかコミットができたらすでにGitでは 結 構 Gitぽ くな って きた それっぽい
中身見れねぇじゃねぇか! 中 身 み れ な い 中 身 見
れ な い 中身みれない
catコマンド cat {ハッシュ}でファイルの中身が見れる BlobとCommitはそのまま中身を表示 Treeはディレクトリとファイルを段々に表示してくれる 実 装 した コマ ン
ド catコ マ ン ド にゃーん
比較して差分とかは出せないまぁできた
最後に 最 後 誰がストーンとガントレットを
これ用のGithub作られるの待ってます! 最 後 パチン
ご清聴ありがとうございました。