¿Deben almacenarse las imágenes en un repositorio git?

202

Para un equipo distribuido que usa Git y Github como control de versión, ¿las imágenes también deberían almacenarse en el repositorio de git?

En su mayor parte, las imágenes no se cambiarán. La carpeta que los contiene solo aumentará de tamaño a medida que se agreguen imágenes. Una preocupación es que la carpeta de imágenes puede crecer a un gran tamaño con el tiempo mediante la combinación de imágenes grandes, o simplemente muchas de ellas.

¿Se considera esto una mejor práctica? ¿Qué otras alternativas existen para compartir archivos binarios necesarios en proyectos a los que un equipo distribuido puede acceder fácilmente?

esponja
fuente
17
Cuando dice "imágenes", ¿estamos hablando de archivos sin procesar DSLR de 26 mb, texturas de juegos en 3D de 1 mb o iconos png de <100 k? (Iba a responder "depende" pero me abstendré)
Brook
2
@Brook: Asumí que estábamos hablando de íconos o pequeños elementos gráficos para sitios web. Las texturas del juego, los archivos sin formato del diseño gráfico o los gráficos precisos para la edición de la documentación pueden ser una historia diferente, tiene razón.
haylem
66
Personalmente pensé que se refería a imágenes ISO, no a imágenes.
Mahmoud Hossam
2
Realmente debería ser para imágenes pequeñas / medianas compatibles con la web. Una preocupación es que algunos firmantes de desarrollo comenzarán a pegar cada imagen original grande allí, cuando pienso que probablemente debería usar algo más.
Spong
66
¿Leyendo esta pregunta hoy? Mira la respuesta a continuación en git lfs. Probablemente sea lo que quieres. programmers.stackexchange.com/a/306882/92506
jonnybot

Respuestas:

188

¿Sus imágenes son originales o pueden ser recuperadas (garantizadas?) De otro lugar? ¿Son necesarios para enviar una unidad de software construida desde la fuente? Si son originales, necesitan una copia de seguridad. Póngalos en su control de revisión, si nunca cambian, la penalización de espacio es la misma que una copia de seguridad, y están donde los necesita.

¿Se pueden editar para cambiar la apariencia del software, accidental o intencionalmente? Sí, entonces DEBEN ser controlados de alguna manera, ¿por qué usar otra forma cuando ya tienes una solución perfecta? ¿Por qué introducir el control de versión "copiar y renombrar" desde la Edad Media?

He visto la obra de arte original de todo un proyecto irse "poof" cuando el disco duro MacBook del diseñador gráfico murió, todo porque alguien, con sabiduría infinita, decidió que "los binarios no pertenecen al control de revoluciones", y los diseñadores gráficos (al menos este ) no suelen ser buenos con las copias de seguridad.

Lo mismo se aplica a todos los archivos binarios que se ajustan a los criterios anteriores.

La única razón para no hacerlo es el espacio en disco. Me temo que a $ 100 / terabyte, esa excusa se está desgastando un poco.

Mattnz
fuente
44
Por cierto: Internet NO es una fuente confiable. Si descargó una imagen de "bobsfreestuff.com", probablemente no estará allí la próxima semana.
mattnz
16
+1 - y debería ser + más. El punto de control de la versión es permitirle recuperar / volver a las cosas, cualesquiera que sean las cosas, ALGÚN TIEMPO PASADO. La única forma de ser 100% puede recuperar lo que se suponía que era en ese momento para poner TODO bajo el control de la versión. Esa es la fuente, imágenes, recursos, PDF útiles / de apoyo. Diablos, incluso puse imágenes de CD comprimidas. Incluso se me conoce por poner una máquina virtual VM (incluido el VMDK) en el control de origen. Parece extremo? Salvé mi tocino 2 años después.
rapid_now
3
100% de acuerdo. Si las imágenes son parte del software, deben ser controladas por revisión.
Dean Harding
14
La única razón por la que no estaría de acuerdo sería si tu repositorio fuera engorroso clonar hasta el punto en que los desarrolladores tuvieran que pensar "¿realmente quiero tomarme el tiempo para clonar esto, o puedo simplemente hacer X en esta otra rama"? Si esto ocurre, asegúrese de que las cosas se reorganicen rápidamente
Brook
55
+1 para el punto sobre la necesidad de implementarlo. Si clono su repositorio, porque soy un nuevo miembro del equipo o algo así, debería funcionar de inmediato . Esto incluye tener un equivalente de makefile lo suficientemente inteligente como para obtener las bibliotecas de terceros necesarias si es necesario.
Spencer Rathbun
66

¿Porque diablos no? :)

Guardar binarios se considera una mala práctica, sí, pero nunca me preocupé demasiado por las imágenes.

En el peor de los casos, si tiene toneladas, almacénelas en otro lugar o use elementos externos o una extensión para soporte binario. Y si las imágenes no se cambian con tanta frecuencia, ¿dónde está el problema? No obtendrás un gran delta gordo. Y si se eliminan con el tiempo, es solo su servidor el que sufre un poco de almacenamiento del historial, pero los clientes no verán nada.

En mi opinión, no debería preocuparse por eso, dado que no almacena GB de esos.

Sin embargo, lo que podría hacer es almacenar imágenes de "fuente": SVG, macros de LaTeX, etc. y obtener las imágenes finales generadas por su sistema de compilación. Probablemente sea aún mejor, si puedes. Si no, entonces no te molestes.

(Dicho todo esto, Git brilla para archivos de texto, pero no es el mejor VCS para imágenes. Danos más contexto y métricas si puedes)


Para obtener información adicional, puede consultar estas preguntas y respuestas:

haylem
fuente
44
+1 para almacenar la fuente, pero si pueden hacer pruebas de desarrollo sin una compilación completa, eso podría estropearlo. Eso también significa que necesitaría construir todas las imágenes antes de comenzar a trabajar en la mañana
TheLQ
@TheLQ: Supongo, pero tal vez deberías tener compilaciones en cascada, donde tus compilaciones aguas abajo (prueba) solo pueden confiar en las construcciones aguas arriba (la construcción real). Y luego expórtelos a una carpeta pública para que los probadores los reutilicen localmente. Eso implica un poco de infraestructura, obviamente, pero esa sería mi forma de hacer las cosas en un equipo relativamente considerable.
haylem
¿Qué son los binarios?
Daniel Pendergast
1
@DantheMan: en.wikipedia.org/wiki/Binary_file
haylem
55
"¿Porque diablos no?" - porque si su repositorio supera los 2 GB, Bitbucket (y también lo probé con Github) rechazará su repositorio. Así que prepárate para alojar tus propios repositorios si los hinchas con toneladas de imágenes.
Jez
48

Esta pregunta es bastante antigua, pero esta es una pregunta común que surge cuando se trata de Git y hay cierto progreso en las soluciones modernas para almacenar archivos grandes en un repositorio de Git desde la última respuesta.

Para almacenar archivos grandes en Git existen los siguientes proyectos:

  • git-annex : esto ha existido por un tiempo pero, francamente, su complejidad se interpone en el camino.
  • git-media : no hay experiencia personal con este. Parece bastante complejo también.
  • git-fit : un intento de crear un complemento más simple. Requiere almacenamiento S3. Si bien aprecio la simplicidad, mi principal preocupación con el complemento es que es bastante desconocido y mantenido por 1 persona (divulgación completa, soy el único otro confirmador en este momento y fue por un problema trivial).
  • git-lfs : aunque no lo he usado mucho, parece ser el santo grial. Está respaldado por Github y está disponible en todos sus repositorios a partir de octubre de 2015 y pone la complejidad de la administración de archivos en el sitio que almacena sus repositorios. El único inconveniente es que esto es bastante nuevo, por lo que más allá de Github no hay mucho soporte, aunque Gitlab también tiene soporte , al igual que Gitea , y Bitbucket ha aludido a brindar soporte en el futuro .

TLDR: si puede, use git-lfs para almacenar imágenes u otros archivos binarios en git.

James McMahon
fuente
99
Por primera vez en mucho tiempo, estoy muy contento de haberme desplazado hacia abajo para leer las respuestas con menos votos. ¡git lfs es exactamente lo que quiero, y Atlassian incluso está agregando soporte para BitBucket Server ! Si pudiera votar esto un millón de veces, lo haría.
jonnybot
77
@ Jonnybot, gracias. Recibí una respuesta tardía, así que no obtuve mucha visibilidad, pero después de usar git-lfs, creo que es la mejor solución actual para almacenar archivos binarios en git.
James McMahon
45

Todo "no almacenar binarios en el control de origen" se establece por una razón específica: si tiene código fuente que compila, no almacene la compilación real, sino solo el código fuente. Las imágenes y los activos visuales no tienen una "fuente", por lo que deben rastrearse en el control de versiones.

Jason T Featheringham
fuente
44
A veces, los activos visuales tienen "algo así como una fuente", y luego es una buena idea automatizar el proceso de creación de la salida final y solo almacenar la fuente en el control de versiones. Ejemplos: versiones gráficas ráster hechas de archivos SVG, activos de sitios web recortados de una hoja de sprites.
tanius
Correcto, ese es un argumento completamente justo.
Jason T Featheringham
21

Creo que la forma recomendada con Git es usar un submódulo (introducido en Git 1.5.3) que es básicamente un repositorio separado que está asociado con el principal. Usted almacena sus imágenes (y otros activos binarios) en el submódulo. Esto puede verificarse con el repositorio principal o dejarse, dependiendo de lo que se requiera.

De http://book.git-scm.com/5_submodules.html

"El soporte de submódulos de Git permite que un repositorio contenga, como subdirectorio, un pago de un proyecto externo. Los submódulos mantienen su propia identidad; el soporte de submódulos solo almacena la ubicación del repositorio de submódulos y el ID de confirmación, por lo que otros desarrolladores que clonan el proyecto que contiene (" el superproyecto ") puede clonar fácilmente todos los submódulos en la misma revisión. Es posible realizar pagos parciales del superproyecto: puede decirle a Git que clone ninguno, algunos o todos los submódulos".

Además, el tamaño no debería ser un problema importante si las imágenes no cambian con frecuencia. También puede ejecutar comandos para podar / reducir el tamaño, como:

git gc
git gc-aggressive
git prune
Dan Diplo
fuente
7

.

Digamos que lanzas la versión de software 1.0. Para la versión 2.0, decide rehacer todas las imágenes para que tengan sombras. Entonces haces esto y lanzas 2.0. Luego, algunos clientes que usan 1.0 y no pueden actualizar a 2.0 deciden que quieren el programa en otro idioma. Te dan $ 1G para hacerlo, así que dices seguro. Pero en una cultura diferente, algunas de sus imágenes no tienen sentido, por lo que debe cambiarlas ...

Si mantendría sus imágenes en el control de la fuente, esto es fácil, basado en 1.0 realiza cambios en las imágenes (entre otras cosas), compilación, lanzamiento. Si no los tuviera en el control de la fuente, sería mucho más difícil, ya que tendría que encontrar las imágenes antiguas, cambiarlas y luego construirlas.

earlNameless
fuente
7

Si es parte del Proyecto, tiene que estar en el VCS . La forma de lograr esto mejor puede depender del VCS o de cómo organice un proyecto. Tal vez un repositorio para los diseñadores, y solo los resultados en el repositorio del codificador, o solo las 'Fuentes de imagen' (una vez tuve un proyecto con solo un archivo .svg, y las imágenes se generaron a través de make / inscape cli).

Pero, si un VCS no puede manejar eso, o se vuelve inutilizable, diría que no es la herramienta adecuada para su trabajo.

Hasta ahora, no tuve problemas para poner cantidades 'habituales' de gráficos (maquetas, conceptos y gráficos de página) para proyectos web en git.

keppla
fuente
5

Debería almacenar sus imágenes en SCM: sí. Sin ninguna duda.

Debería almacenar sus imágenes en git: esto se vuelve más complicado.

git es muy bueno con los archivos de texto, pero por su propia naturaleza no es demasiado atractivo con los binarios. Tendrá problemas con el tamaño de los datos transferidos cuando clone o empuje, sus directorios .git crecerán y podría confundirse con la fusión (es decir, ¡cómo fusiona 2 imágenes!)

Una respuesta es usar submódulos, ya que esto significa que el vínculo entre su proyecto y las imágenes será más débil, por lo que no tendrá que administrar las imágenes como si fueran parte de su fuente, pero aún así mantenerlas controladas y no tener se preocupa por ramificarlos, suponiendo que el subproyecto es solo un repositorio 'plano' de datos que no pasa por la misma rotación durante el proceso de desarrollo habitual.

La otra respuesta es colocarlos en un proyecto diferente, nunca bifurcarlo, y asegurarse de que todos los que se comprometan con ese proyecto lo empujen inmediatamente, nunca permita que 2 personas cambien la misma versión del archivo, lo encontrará más difícil. aspecto como git no está diseñado para un flujo de trabajo no distribuido. Tendrá que usar métodos de comunicación anticuados para prever esta regla.

Una tercera respuesta es colocarlos en un SCM completamente diferente que esté mejor orientado a trabajar con imágenes.

gbjbaanb
fuente
0

Agregando a la respuesta de @ haylem, tenga en cuenta que el tamaño juega un factor importante en esto. Dependiendo del VCS, podría no funcionar bien con toneladas de imágenes. Cuando los clones o los grandes empujes comienzan a tomar toda la noche, entonces es realmente demasiado tarde ya que todas las imágenes ya están en su repositorio.

Planee imágenes grandes y crecimiento futuro. No quieres tener dos años en este proyecto y tener un "oh mierda, tal vez el repositorio es un poco demasiado grande".

TheLQ
fuente
1
Su respuesta es algo irrelevante, ya que la pregunta es específica de git. ¿Sabes si el tamaño juega un factor grande (o cualquier otro) para los repositorios git?
yannis
@Yannis Debe haber perdido esa primera oración ... AFAIK, git es mejor con repositorios más grandes, pero el problema del tamaño sigue siendo relevante ya que los clones gigantescos o los empujes son un problema
TheLQ
Con GIT es trivialmente fácil reorganizar repositorios y crear clones parciales, etc., si esto se convierte en un problema. No confunda las melazas históricas de las herramientas de control de revisiones de hace décadas con las de hoy.
mattnz
0

Definitivamente estoy de acuerdo en que almacenarlos técnica y económicamente es factible. Pregunta como es "¿son estas imágenes parte del producto de envío o parte del contenido de un producto de envío?" No es que no pueda almacenar contenido en GIT (o cualquier otro VCS) sino que es un problema separado para un VCS separado.

Wyatt Barnett
fuente