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