Optimice un repositorio de git que contenga archivos binarios grandes

21

Nuestro proyecto tiene aproximadamente 11 GB, 10 de los cuales son datos binarios (imágenes .png). En consecuencia, una git diffo las git statusoperaciones toman más de un minuto. Afortunadamente, todos los archivos de datos están separados en una carpeta con el maravilloso nombre data. La tarea es "Evitar comprimir, diferenciar y otras operaciones costosas en archivos binarios".

  • Se consideró dividir el proyecto en dos repositorios. Entonces datasería un repositorio externo, que es verificado por el repositorio de código fuente principal. Se decidió que la sobrecarga de mantener sincronizados los repositorios sería demasiado, especialmente para los artistas que trabajan con los archivos de datos.

  • Explícitamente decirle a git que esos archivos son binarios , se consideraron excluir los archivos de diffs , pero estos parecen ser solo una solución parcial a la pregunta.

Siento que los atributos de git son la solución, pero ¿cómo? ¿O hay una arquitectura mejor que un repositorio monolítico?

Vorac
fuente
1
La primera gran pregunta aquí es qué tan importantes son esos archivos de datos. ¿Su programa necesita todas esas imágenes disponibles para hacer algo útil, o puede salirse con un pequeño subconjunto durante el desarrollo / prueba típico?
Ixrec
@ Ixrec, las imágenes son realmente más importantes que el código fuente. Todos deben estar presentes, y las sumas de verificación .png siempre se verifican en busca de archivos corruptos.
Vorac
1
¿Por qué no es esta pregunta sobre desbordamiento de pila? La Q. Parece exactamente adecuada para ella.
spirc
@spirc esta pregunta se extiende a lo largo de la línea entre "ayuda con una herramienta de software" que es sobre el tema en SO y "estrategia de control de versiones" que es sobre el tema aquí. Como no está pidiendo qué comando git ejecutar para hacer algo, no está claramente en el lado SO de la línea, así que voté para dejarlo abierto aquí.
@Snowman gracias por la respuesta. ¿En qué elemento de la lista de temas encaja eso? programmers.stackexchange.com/help/on-topic
spirc

Respuestas:

18

Puede usar git-lfs o herramientas similares (git-fat, git-annex, etc.). Esas herramientas básicamente reemplazan los archivos binarios en su repositorio con un pequeño archivo de texto con hashes y almacenan los datos binarios reales de una manera no git, como un recurso compartido de red.

Hace que diffs y todo sean superrápidos, ya que solo se comparan los hashes, y es, al menos para git-lfs, transparente para el usuario (después de instalar una vez).

Afaik git-lfs es compatible con github, gitlab, VisualStudio y es de código abierto.

kat0r
fuente
2
¿Has intentado usar git-lfsen un proyecto con muchos gigabytes de activos con un equipo mixto de desarrollador / artista? Me interesa saber si las personas están usando git-lfs para proyectos como juegos y animación. Dado que todavía es bastante nuevo al momento de escribir. Según mi propia experiencia, la barrera de entrada a git para usuarios menos técnicos ya es muy alta, por lo que tener una capa adicional para la administración de archivos además de esto, puede ser difícil de usar para las personas a menos que ya se sientan cómodos con git.
ideasman42
Solo por alrededor de ~ 1 GB de datos, lo siento. Pero git-lfs no debería agregar pasos adicionales para los usuarios finales, debería ser completamente transparente.
kat0r
Esta parece ser la respuesta correcta, si surgen algunos problemas durante la integración, informaré aquí. Entonces, ¿el procedimiento de instalación debe completarse solo una vez en el servidor y no en cada máquina cliente?
Vorac
Si necesita instalar un complemento de cliente pequeño, consulte la página de github. Pero eso debería ser fácil de implementar con una política de grupo / más simple que cualquier otra alternativa.
kat0r
1

Utilice los repositorios GIT y SVN

Si los archivos binarios se pueden separar lógicamente de la fuente, puede considerar usar git para archivos de texto y un DVCS como subversión para los archivos binarios.

Un proyecto en el que trabajo hace esto ya que tenemos muchos GB para bibliotecas compiladas (para dependencias OSX / Win32), que necesitamos mantener versionadas.


Por otro lado, si tiene usuarios no técnicos, el uso de dos sistemas de control de versiones puede ser problemático. Sin embargo, si los artistas no están trabajando en el código, puede proporcionar un script para realizar la actualización, y pueden usar la subversión para confirmar los activos binarios.

Usar SVN (con git svn)

Si bien esta compensación no siempre es tan buena para los desarrolladores que están acostumbrados a usar git regular, puede usar SVN para el repositorio principal, y los desarrolladores pueden usar git svnherramientas.

Esto hace que sea un poco más trabajo para los desarrolladores que usan git, pero significa para todos los que no están familiarizados con DVCS (o VCS en general): pueden usar el modelo simple de SVN sin tener que usar múltiples sistemas complejos de control de versiones.


git-lfs también es una opción, pero no la usé, así que no puedo hablar de lo bien que funciona.

ideasman42
fuente