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
41
hey-techcamp-2022
garebareda
2
62
Rustで作った自作コマンド群の話
garebareda
0
160
クリーンアーキテクチャ をGoでする場合に不要な Interfaceは消しやがれ
garebareda
0
130
Rustで自作言語のインタプリタ作って Webで動くようにした話
garebareda
0
820
Vtuberをやりたくなりました
garebareda
1
74
Other Decks in Programming
See All in Programming
Devoxx BE - Local Development in the AI Era
kdubois
0
120
タスクの特性や不確実性に応じた最適な作業スタイルの選択(ペアプロ・モブプロ・ソロプロ)と実践 / Optimal Work Style Selection: Pair, Mob, or Solo Programming.
honyanya
3
160
Conquering Massive Traffic Spikes in Ruby Applications with Pitchfork
riseshia
0
160
Your Perfect Project Setup for Angular @BASTA! 2025 in Mainz
manfredsteyer
PRO
0
160
CI_CD「健康診断」のススメ。現場でのボトルネック特定から、健康診断を通じた組織的な改善手法
teamlab
PRO
0
200
Flutterで分数(Fraction)を表示する方法
koukimiura
0
130
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
190
NetworkXとGNNで学ぶグラフデータ分析入門〜複雑な関係性を解き明かすPythonの力〜
mhrtech
3
1.2k
GraphQL×Railsアプリのデータベース負荷分散 - 月間3,000万人利用サービスを無停止で
koxya
1
1.2k
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
2.4k
チームの境界をブチ抜いていけ
tokai235
0
160
What's new in Spring Modulith?
olivergierke
1
140
Featured
See All Featured
Designing for Performance
lara
610
69k
Facilitating Awesome Meetings
lara
56
6.6k
How to Ace a Technical Interview
jacobian
280
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
189
55k
How GitHub (no longer) Works
holman
315
140k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
590
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作られるの待ってます! 最 後 パチン
ご清聴ありがとうございました。