tzmfreedom/mygit " />
2019-04-07

自作gitを作ってみた

車輪の再発明シリーズ、今回は自作gitを作ってみましたー

gitの仕組みは公式に載っているのを参考にして実装しました

あとこちらの記事もとても詳しいです

勉強目的なので、gitの仕様を完全に踏襲する感じではなくざっくり模倣しました。

実装内容

だいたいこんなことをやってます↓

commitのファイル仕様

commit
{treeハッシュ}
{前のcommitハッシュ}
{author}
{message}

treeのファイル仕様

tree
{permission} {ファイル種別: file or tree} {ハッシュ} {ファイル名}

ファイルの仕様

blob
{ファイルの中身}

gitの仕様だとヘッダが {オブジェクト種別} {サイズ}\0 というようにサイズが入っていたりNULLバイトが入っていたりするのですが、面倒だったので改行と空白だけで表現しています。

所感

git addは普通にファイルのハッシュ計算してファイル作ってindexファイル更新するだけなのでそんなに難しくはなかったんですが、 git commitはtreeオブジェクトを生成、tree hashの計算、indexの更新などなどやることが結構あったので大変でした…。

ただ、 git commit まで出来てしまえばgit logはcommitオブジェクトをたどって読み込んで表示するだけだし、git diffはツリーの差分を取る処理だけ書いてあげれば良いので後のコマンドは比較的さくっと実装できました。

mygitレベルの実装であればファイル操作、ツリー操作(再帰)、ハッシュ計算、引数パースなど各言語の基本的な処理で構成されているので、 新しい言語を学ぶときの習作ツールとしても良さそうでした。

ちなみに今後はこのへんを実装する予定↓

このエントリーをはてなブックマークに追加