¿Por qué los treees son recursivos en Git?

En Git, el contenido del file se almacena en objects blob. Los objects de tree representan un directory. Enumeran los files en el directory y el blob en el que se almacenan los contenidos del file. También enumeran los subdirectorys y el tree que representa el subdirectory. En este sentido, un tree en Git es una estructura de datos recursiva: puede contener references a sí mismo.

La alternativa sería una estructura de datos no recursiva, donde un solo object de tree enumeraría todos los files rastreados en el repository, y almacenaría no solo el nombre de file, sino la ruta completa relativa a la raíz del repository.

Admiro la manera elegante en que Git trata los datos, así que estoy convencido de que debe haber una buena razón por la cual Git usa la forma recursiva. Se me ocurrió por varias razones, todas las cuales descarté:

  • Un tree por subdirectory permitiría el seguimiento de directorys. Podría permitir el seguimiento de directorys vacíos. El almacenamiento de los metadatos del directory es más elegante en forma recursiva (el tree no recursivo requeriría dos types de inputs para rastrear subdirectorys).

    Sin embargo, Git no rastrea los directorys vacíos ni almacena los metadatos del directory.

  • Los treees recursivos permiten subdirectorys sin cambios para compartir el mismo tree entre los commits. Esto sería más eficiente en términos de espacio en un repository con muchos files, donde solo unos pocos files cambian por compromiso, especialmente cuando se usan muchos subdirectorys.

    Sin embargo, la eficiencia del espacio no es una preocupación en los objects de tree: los files de package se encargan de la compression, y los treees no recursivos podrían incluso ser más compresibles porque contienen less hashes (que son esencialmente aleatorios). Además, la relación de datos a files generalmente será grande, por lo que el tamaño de los objects del tree tiene poco impacto en el tamaño del repository.

  • Los treees recursivos podrían permitir algorithms más elegantes. Las operaciones en el repository se pueden manejar recursivamente.

    Sin embargo, (quizás recursivamente) build una list de todos los files en el repository, y luego operar en la list plana, en muchos casos es aún más fácil.

  • Los treees recursivos podrían permitir una detección más fácil de los nombres de los directorys.

    Sin embargo, Git usa la heurística para detectar los cambios de nombre de todos modos, así que esto es de poca utilidad.

No estoy seguro de las diferencias en el performance. No es obvio para mí que una de las dos representaciones sea más rápida.

Mi pregunta es: ¿por qué se usa la forma recursiva? ¿Hay alguna ventaja específica al usar este formulario?