¿Cómo almacena Git los objects de tree?

Estoy tratando de entender el formatting exacto de cómo git almacena los objects de tree. ¿Cómo se calcula el hash de un tree?

object de tree

'tree' ' ' size_decimal '\0' tree_content 

para cada input en tree_content

 mode ' ' filename '\0' hash_20_bin 

modo: 100644 para un file regular, 100755 ejecutable; 040000: tree; 120000: enlace simbólico; 160000: gitlink

table http://linquize.blogspot.hk/2011/10/supplemental-information-for-git.html

Un object de tree se almacena internamente como un object binary (de tipo "tree", que lo distingue de los files reales) que contiene una list de inputs. Una input puede describir un file u otro tree (directory). Cada línea contiene el nombre de la input, su hash SHA1 y su modo. Una descripción más detallada se puede encontrar aquí.

Comandos como git ls-tree y git cat-file -p generarán una representación textual de este object. Esta forma textual es una conversión bastante sencilla: el SHA-1 se muestra antes del nombre de la input en forma hexadecimal, con una columna adicional que describe el tipo de object al que apunta ("blob", "tree") solo para mayor claridad.

Su hash se calcula simplemente como el hash de ese contenido. Como contiene los nombres y hashes de sus componentes, se garantiza que el hash del tree cambia cada vez que cambia el hash de cualquiera de los subtreees.