this fall I worked with the core Git folks on writing an official data model for Git and it just got merged! I learned a few new things from writing it. https://github.com/git/git/blob/master/Documentation/gitdatamodel.adoc

here are some things I learned while writing this:

1. Commits can have "extra fields", for example a GPG signature

2. I always thought entries in a tree had 4 fields, but there are actually only 3 (file name, file type, and object ID)

3. Git sometimes prints out file types as a bit set (100644), but it's really more like an enum, since there are only 5 file types (regular file, executable file, symlink, directory, and gitlink)

(2/?)

@b0rk The way Git displays octal file modes to the user is so unfortunate :( It gives you the false impression that files in a repo *could* have unusual permissions/types, or that perhaps the umask on a commiter's machine might affect the permissions of newly committed files, whereas in reality Git enforces "standard" file modes.

(To be clear, I think it's good that Git can't store any fancy permissions/types - I just wish it would communicate that to the user...)

@dgelessus me too. I’m curious about whether they’d be open to changing it though I don’t think I have the stamina to work on that.