web-dev-qa-db-fra.com

Pourquoi le git ingit / objet / dossier est-il subdivisé dans de nombreux dossiers SHA-préfixe?

Git stocke intérieurement des objets (blobs, arbres) dans le .git/objects/ dossier. Chaque objet peut être référencé par un hachage SHA1 calculé à partir du contenu de l'objet.

Cependant, les objets ne sont pas stockés à l'intérieur de l'.git/objects/ Dossier directement. Au lieu de cela, chaque objet est stocké dans un dossier qui commence par le préfixe de son hachage SHA1. Donc un objet avec le hachage b7e23ec29af22b0b4e41da31e868d57226121c84 serait stocké à .git/objects/b7/e23ec29af22b0b4e41da31e868d57226121c84

Pourquoi Git subdivide-t-il son stockage d'objet de cette façon?

Les ressources que je pouvais trouver, telles que la page sur les internes de GIT sur Git-SCM, uniquement expliquée comment , pas Pourquoi .

21
Qqwy

Il y a deux raisons pour lesquelles cela est souhaitable.

Les répertoires ne peuvent pas être arbitrairement importants. E.G. Certains systèmes de fichiers (raisonnablement modernes!) sont limités à 32 000 entrées dans un seul répertoire. Le nombre de commits dans le noyau Linux est dans cet ordre de grandeur. Subdaying Les commits par leurs deux premiers chiffres hexagonaux limitent la taille de niveau supérieur à 256 entrées. Les sous-répertoires seront beaucoup plus petits pour les repos typiques de Git.

Les répertoires sont scannés linéairement. Dans certains systèmes de fichiers (par exemple, la famille EXT *), un répertoire est une liste liée ou une table des entrées. Pour rechercher un fichier, toute la liste est numérisée jusqu'à ce qu'un nom de fichier correspondant soit trouvé. Clairement, cela n'est pas souhaitable pour la performance. De nombreux systèmes de fichiers modernes utilisent en outre des tables de hachage ou des arbres B pour une recherche rapide, mais tout le monde peut l'avoir. Garder chaque annuaire petit signifie des heures d'accès rapides.

8
amon

Ces 256 godets permettent à GIT de stocker de plus grands référentiels sur des systèmes de fichiers limitant les fichiers numériques dans un répertoire et fournissent des performances de descente sur des systèmes de fichiers qui deviennent plus lents avec des répertoires contenant de nombreux fichiers.

1

Certains systèmes de fichiers et/ou implémentations de système de fichiers et/ou libc sont des implémentations dans lesquelles des performances se dégrade avec un grand nombre d'entrées d'annuaire.

1
Jörg W Mittag