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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
garebare
March 20, 2021
Programming
3
770
自作Git作った話
NEW DEBUGで発表したものになります
garebare
March 20, 2021
Tweet
Share
More Decks by garebare
See All by garebare
ペンギンをおすすめする
garebareda
0
47
hey-techcamp-2022
garebareda
2
70
Rustで作った自作コマンド群の話
garebareda
0
170
クリーンアーキテクチャ をGoでする場合に不要な Interfaceは消しやがれ
garebareda
0
150
Rustで自作言語のインタプリタ作って Webで動くようにした話
garebareda
0
850
Vtuberをやりたくなりました
garebareda
1
79
Other Decks in Programming
See All in Programming
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.9k
SourceGeneratorのマーカー属性問題について
htkym
0
180
技術検証結果の整理と解析をAIに任せよう!
keisukeikeda
0
110
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
15
2.9k
15年目のiOSアプリを1から作り直す技術
teakun
1
620
PJのドキュメントを全部Git管理にしたら、一番喜んだのはAIだった
nanaism
0
250
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
780
Claude Code Skill入門
mayahoney
0
150
朝日新聞のデジタル版を支えるGoバックエンド ー価値ある情報をいち早く確実にお届けするために
junkiishida
1
780
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
490
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
470
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
110
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
180
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Balancing Empowerment & Direction
lara
5
940
Google's AI Overviews - The New Search
badams
0
930
Color Theory Basics | Prateek | Gurzu
gurzu
0
240
Measuring & Analyzing Core Web Vitals
bluesmoon
9
780
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
We Have a Design System, Now What?
morganepeng
55
8k
Music & Morning Musume
bryan
47
7.1k
Being A Developer After 40
akosma
91
590k
New Earth Scene 8
popppiees
1
1.7k
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作られるの待ってます! 最 後 パチン
ご清聴ありがとうございました。