2009-12-15 25 views
12

Actualmente estoy empezando a usar git para mi sistema de control de versiones, sin embargo, realizo un poco de desarrollo de web/juegos que, por supuesto, requiere que se almacenen imágenes (datos binarios). Entonces, si mi comprensión es correcta si comprometo una imagen y ésta cambia 100 veces, si obtengo una copia nueva de ese repos, básicamente estaría revisando las 100 revisiones de ese archivo binario.Git y datos binarios

¿No es esto un problema con los repositorios de gran tamaño en los que las imágenes cambian con regularidad, pero la búsqueda inicial del repositorio no sería demasiado grande? ¿Alguien ha tenido algún problema con esto en el mundo real? He visto algunas alternativas, por ejemplo, el uso de submódulos y el mantenimiento de imágenes en un repositorio separado, pero esto solo mantiene la base de código más pequeña, el repositorio de imágenes aún sería enorme. Básicamente, me pregunto si hay una buena solución para esto.

+1

Esta es una limitación de diseño de git. Fue escrito para hacer una cosa bien: administrar el árbol fuente de Linux, que es prácticamente todo en texto sin formato. Git se trata de diffs y fusiones, cosas que realmente no se aplican a las imágenes.Si sus archivos multimedia son realmente grandes o se editan con frecuencia, es mejor que utilice un mecanismo diferente para almacenar el historial de esos archivos, y si realmente no está colaborando en el código o creando muchas ramas, entonces puede ser mejor. no usar git en absoluto. – user57368

+2

git manejará los archivos binarios, y el sistema que usa para * almacenar * deltas se basa en contenido binario (las diferencias de texto que ve en los parches se calculan sobre la marcha, no en una representación de lo que está almacenado). Una vez dicho esto, xdelta para imágenes comprimidas no es probable que reduzca mucho el requisito de espacio. Puede guardar todas sus imágenes como XPM o BMP: p – araqnid

Respuesta

7

No llamaría a eso "checkout", pero sí, la primera vez que obtenga el repositorio, siempre que los datos binarios sean enormes e incompresibles, van a ser lo que son: enormes. Y sí, dado que la ley de conservación todavía está vigente, dividirla en módulos no le ahorrará espacio y tiempo en la extracción inicial del repositorio.

Una posible solución sigue utilizando el repositorio por separado y la opción --depth al tirar de ella. Los repositorios poco profundos tienen algunas limitaciones, pero no recuerdo exactamente, ya que nunca lo usé. Verifica los documentos. La palabra clave es "superficial".

Editar: De git-clone(1):

Un repositorio superficial tiene una serie de limitaciones (no se puede clonar o ir a buscar de ella, ni empujar desde ni en él), pero es adecuado si son solo interesados ​​en la historia reciente de un proyecto grande con un largo historial, y querrían enviar revisiones como parches.

+1

. Es interesante si tiene en cuenta la cita del documento anterior. Casi parece que un vcs no distribuido podría ser mejor para datos binarios, ya que le faltan muchas de las ventajas de usar git cuando lidiando con datos binarios de todos modos. – Jamie

+1

Sí, pero aún así puede tomar el dolor de buscar un enorme repositorio una vez. Además, puede usar un repositorio independiente no git para datos binarios. Pero dado que realmente amo a git (aunque al principio era escéptico al respecto, todo lo que Linus escribe será elogiado), sugiero separar los datos binarios y ... bueno, lidiar con eso por separado ;-) –

2

Desafortunadamente, git no está hecho para almacenar datos binarios. Debido a que se distribuye, usted extraerá todas las versiones de todos los archivos cada vez que lo clone. También se vuelve ridículamente difícil eliminar esos grandes archivos binarios del depósito de código. Más sobre eso aquí: (http://www.somethingorothersoft.com/2009/09/08/the-definitive-step-by-step-guide-on-how-to-delete-a-directory-permanently-from-git-on-widnows-for-dumbasses-like-myself/).

Recomendaría probarlo pero mantener los archivos binarios por separado del código (es decir, utilizando submódulos). En ese caso, si no funciona, puede usar otra solución sin reescribir todo el historial de su repositorio principal.

2

Lo que hago es crear directorios ignorados/desbloqueados, y sincronizar el directorio/directorios de imágenes usando otros sistemas que no son git (o simplemente copiar manualmente los cambios al directorio de imágenes una vez, cuando se habla de una gran cantidad de imágenes que no necesita mantener sincronizadas por completo).