Alojar repositorios de Git a gran escala es un problema difícil que nace del propio diseño distribuido del sistema creado por Linus Torvalds en 2005 para sustituir a BitKeeper en el kernel de Linux. Veinte años después, Git es un estándar de la industria, pero su naturaleza distribuida, basada en packfiles como bloque fundamental de almacenamiento y de red, complica más que ayuda a la hora de centralizar el servicio en empresas y proyectos de código abierto que dependen de un servidor central.
El artículo recorre los tres enfoques principales para escalar el hosting de Git, ordenados por complejidad creciente: distribuir el sistema de ficheros, distribuir los packfiles o distribuir Git mismo. Distribuir Git al nivel de objetos (blobs, árboles, commits, identificados por SHA-1) parece encajar de forma natural con un almacén clave-valor distribuido, pero la estructura real del repositorio es un grafo acíclico dirigido que hay que recorrer paso a paso, de modo que cada salto requiere un nuevo acceso al almacén distribuido. El intento más prometedor fue el de Shawn Pearce en Google, que sustituyó los packfiles en disco por una tabla hash distribuida gracias a JGit, pero el rendimiento del comando git clone fue lo bastante malo para descartar el enfoque.
GitHub nació en 2008 en San Francisco con el lema «Git repository hosting: no longer a pain in the ass» y empezó como un monolito Rails sobre una sola máquina potente. Escalar una aplicación Rails es sencillo: basta con desplezar más instancias, pero como cada instancia necesitaba acceder a los repositorios en disco, el equipo chocó enseguida con el mismo problema. Los ingenieros probaron primero NFS, después GFS y más tarde DRBD para replicar el sistema de ficheros; todas las opciones se quedaron cortas por las exigencias de semántica de ficheros del cliente Git, que presupone un disco local y se comporta de forma deficiente sobre sistemas de ficheros en red. El texto deja abierta la búsqueda de una solución y sirve como introducción al problema que la propia plataforma Cursor ha tenido que abordar.
