gitの仕組みを学習するために、引き続きgitのコマンドを実装してます。
今回は git hash-object -w を実装してみました。
このコマンドは git add の中で実行されている低レベルのコマンドです。
このコマンドを実行すると、ファイルに含まれるデータをgit のオブジェクトDB (.git/objects) に保存します。
gitのオブジェクトDBに書き込むために、内容をzlib圧縮するのは compless() メソッドで処理しています。
コンパイルしたプログラムを実行して、ファイルをオブジェクトDBに保存してみます。
% echo sample > sample.txt
% kotlin -classpath ../mygit/out/production/classes GitHashObjectWKt ./sample.txt ./.git/objects/d6
./.git/objects/d6/4a3d962e787834f9b43312cdcdb96ef357709a
% git cat-file -p d64a3d962e787834f9b43312cdcdb96ef357709a
sample
保存したデータを git cat-file -p で読み出すことができました。やった!
git hash-object -w を実装して得た知見:
- オブジェクトDBの中身のファイルパーミッションはリードオンリーにセットされてる。一度作成されたオブジェクトは、内容が書き換えられることがないのでこうなってるんだとどっかに書いてました。
- gitのオブジェクトDBのファイル名は、sha1ハッシュの値
- gitのオブジェクトDBのファイルは、zlibで圧縮されてる。
- Kotin, Javaでzlib圧縮するにはDeflaterを使う
今週は以上です。
京都オフィス勤務のエンジニア。アジャイル開発のエキスパートで、お客様とのコミュニケーション能力も高く、ファシリテーターとして各方面で重宝されているため多忙を極めている。