今週のコーディング素振り(2018/5/15)

5月 15, 2018 / Posted by 亀田 義裕 / 0 Comments

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を使う

今週は以上です。

Tags: ,