git indexの中身
git indexの中身がどうなっているのか知りたくてソースコードを読んだ。
そうそう、以前「first commitが1200行くらいで読みやすい」とオススメされたけど、openssl関係のエラーが出たのでさっさと諦めて最新のバージョンを読んでる。
で、read-cache.cの中のint write_index(struct index_state *istate, int newfd)でindexの書き込みをしている。書かれているのは
#define CACHE_SIGNATURE 0x44495243 /* "DIRC" */ struct cache_header { unsigned int hdr_signature; unsigned int hdr_version; unsigned int hdr_entries; };
と
struct cache_entry { struct cache_time ce_ctime; struct cache_time ce_mtime; unsigned int ce_dev; unsigned int ce_ino; unsigned int ce_mode; unsigned int ce_uid; unsigned int ce_gid; unsigned int ce_size; unsigned int ce_flags; unsigned char sha1[20]; struct cache_entry *next; struct cache_entry *dir_next; char name[FLEX_ARRAY]; /* more */ };
というわけで
$ hexdump -C .git/index 00000000 44 49 52 43 00 00 00 02 00 00 00 01 4f bc 9d 1c |DIRC........O...| 00000010 00 00 00 00 4f bc 9d 1c 00 00 00 00 0e 00 00 02 |....O...........| 00000020 01 69 18 03 00 00 81 a4 00 00 01 f5 00 00 00 14 |.i..............| 00000030 00 00 00 0e 6f 8a 38 cd 87 94 98 e7 83 36 6f 34 |....o.8......6o4| 00000040 0c 30 dc bf b9 02 2d 67 00 06 52 45 41 44 4d 45 |.0....-g..README| 00000050 00 00 00 00 b3 23 ce cf ce 60 7f d3 f8 68 18 47 |.....#...`...h.G| 00000060 0c 81 30 92 d6 4e 82 0f |..0..N..| 00000068
44 49 52 43 // DIRC 00 00 00 02 // hrd.hdr_version; 00 00 00 01 // hdr.hdr_entries (= 1) // ここから各entry 4f bc 9d 1c 00 00 00 00 // ctime 4f bc 9d 1c 00 00 00 00 // mtime 0e 00 00 02 // dev 01 69 18 03 // ino 00 00 81 a4 // mode 00 00 01 f5 // uid 00 00 00 14 // gid 00 00 00 0e // size (= 14) 6f 8a 38 cd 87 94 98 e7 83 36 6f 34 0c 30 dc bf b9 02 2d 67 // sha1 00 06 // flag 52 45 41 44 4d 45 // filename("README") 00 00 00 00 // padding // ここまで各entry b3 23 ce cf ce 60 7f d3 f8 68 18 47 0c 81 30 92 d6 4e 82 0f // これ全体のsha1