A tree is a directory listing: each entry has a mode, a type, a hash and a name, pointing to a blob (a file) or another tree (a subdirectory). Names and permissions live here, not in blobs. Stage README.md and a one-line schema, then write the staging area out as a tree:
mkdir db && printf 'CREATE TABLE books (id INTEGER PRIMARY KEY);\n' > db/schema.sql
git add README.md db/schema.sql
git write-tree
git cat-file -p 2fdd726
git cat-file -p 2fdd726:dbOutput
2fdd7266111b3645450e0a6b49c48eb3d4882077 100644 blob 25c8a459b6e162ac7b759d609872fcdbfce206f6 README.md 040000 tree b5d16e349146c9e8137e044d0dd6045880b30de3 db 100644 blob 94568a7a08dacaf7a3afeb81ba74d6e3991cb40c schema.sql
The root tree points at the README.md blob and a db tree (2fdd726:db reads "the db entry of that tree"). Git 1,932 records only five modes: 100644 for a file, 100755 for an executable, 120000 for a symbolic link, 040000 for a tree and 160000 for a submodule (Submodules and Subtrees). So a change from 644 to 600 is invisible to Git, and an empty directory cannot be stored (use a placeholder such as .gitkeep).