Les images doivent-elles être stockées dans un référentiel git?


202

Pour une équipe distribuée utilisant Git et Github comme contrôle de version, les images doivent-elles également être stockées dans le référentiel git?

Pour la plupart, les images ne seront pas modifiées. Le dossier qui les contient ne fera que croître au fur et à mesure de l'ajout des images. Un problème est que le dossier d'images peut atteindre une taille importante avec le temps en combinant de grandes images, ou juste beaucoup d'entre elles.

Est-ce considéré comme une meilleure pratique? Quelles autres alternatives existe-t-il pour le partage des fichiers binaires nécessaires aux projets auxquels une équipe distribuée peut facilement accéder?


17
Quand vous dites "images", parlons-nous de fichiers DSLR Raw de 26 Mo, de textures de jeu 3D de 1 Mo ou d'icônes <100k png? (J'allais répondre "ça dépend" mais je vais m'abstenir)
Brook le

2
@ Brookok: J'avais en quelque sorte supposé que nous parlions d'icônes ou de petits éléments graphiques pour des sites Web. Les textures de jeu, les fichiers bruts de conception graphique ou des graphiques précis pour l'édition de documentation peuvent être une autre histoire, vous avez raison.
haylem

6
Personnellement, je pensais qu'il parlait d'images ISO, pas d'images.
Mahmoud Hossam

2
Cela devrait vraiment être pour les images de taille moyenne adaptées au Web. Une préoccupation est que certains développeurs de devoirs vont coller chaque grande image originale là-dedans, alors que je pense que cela devrait probablement utiliser autre chose.
Spong

6
Vous lisez cette question aujourd'hui? Regardez la réponse ci-dessous sur git lfs. C'est probablement ce que tu veux. programmers.stackexchange.com/a/306882/92506
jonnybot

Réponses:


188

Vos images sont-elles une oeuvre originale ou peuvent-elles être récupérées d’ailleurs? Sont-ils nécessaires pour expédier une unité logicielle construite à partir de la source? S'ils sont originaux, ils doivent être sauvegardés. Mettez-les dans votre contrôle de révision, s'ils ne changent jamais, la pénalité d'espace est la même que pour une sauvegarde, et c'est là que vous en avez besoin.

Peuvent-ils être édités pour changer l'apparence du logiciel, accidentellement ou intentionnellement? Oui, alors ils DOIVENT être contrôlés d’une manière ou d’une autre, pourquoi utiliser une autre méthode alors que vous avez déjà une solution parfaite. Pourquoi introduire le contrôle de version "copier et renommer" depuis les âges sombres?

J'ai vu des illustrations d'un projet entier devenir "pouf" lorsque le disque dur MacBook du concepteur graphique est mort, tout cela parce que quelqu'un, avec une sagesse infinie, a décidé que "les fichiers binaires n'appartiennent pas au contrôle de la version", et les concepteurs graphiques (du moins celui-ci ) n’ont pas tendance à bien fonctionner avec les sauvegardes.

Il en va de même pour tous les fichiers binaires répondant aux critères ci-dessus.

La seule raison pour ne pas le faire est l'espace disque. J'ai peur à 100 $ / téraoctet, cette excuse est un peu mince.


44
BTW: Internet n'est pas une source fiable. Si vous avez téléchargé une image de "bobsfreestuff.com", elle ne sera probablement pas là la semaine prochaine.
mattnz

16
+1 - et devrait être + plus. Le contrôle de version a pour but de vous permettre de récupérer / restaurer des éléments, quels qu'ils soient, à un moment donné. La seule façon d’être 100% que vous puissiez récupérer ce qui était supposé être à ce moment-là est de mettre TOUT sous contrôle de version. C’est la source, les images, les ressources, les PDF utiles / compatibles. Heck, j'ai même inséré des images de CD compressées. On m'a même vu mettre une machine virtuelle VM (y compris le VMDK) dans le contrôle de source. Semble extrême? Sauvé mon bacon 2 ans plus tard.
Rapidement maintenant

3
100% d'accord. Si les images font partie du logiciel, elles doivent être contrôlées.
Dean Harding le

14
La seule raison pour laquelle je ne serais pas d’accord, c’est si cela rendait votre repo trop lourde à cloner au point que les développeurs devaient en fait penser «est-ce que je veux vraiment prendre le temps de cloner cela, ou puis-je simplement faire X dans cette autre branche». Si cela se produit, assurez-vous que les choses sont réorganisées très rapidement
Brook

5
+1 pour le besoin de le déployer. Si je clone votre repo, parce que je suis un nouveau membre de l’équipe ou quelque chose du genre, cela devrait fonctionner immédiatement . Cela inclut d'avoir un équivalent dans le fichier makefile assez intelligent pour obtenir les bibliothèques tierces nécessaires, si nécessaire.
Spencer Rathbun

66

Pourquoi diable pas? :)

Stocker des fichiers binaires est considéré comme une mauvaise pratique, oui, mais je ne me suis jamais trop soucié des images.

Dans le pire des cas, si vous avez des tonnes, stockez-les ailleurs ou utilisez des externes ou une extension pour le support binaire. Et si les images ne sont pas souvent changées, où est le problème? Vous n'obtiendrez pas un gros delta. Et s’ils sont supprimés au fil du temps, seul votre serveur souffre d’un peu de stockage de l’historique, mais les clients ne verront rien.

À mon avis, vous ne devriez pas vous en inquiéter, à condition de ne pas en stocker de Go.

Ce que vous pouvez faire cependant, n’est que de stocker des images "sources": SVG, macros LaTeX, etc ... et de faire en sorte que les images finales soient générées par votre système de construction. C'est probablement encore mieux, si vous le pouvez. Si non, alors ne vous inquiétez pas.

(Tout cela étant dit, Git brille pour les fichiers texte, mais n’est pas le meilleur VCS pour les images. Donnez-nous plus de contexte et de mesures si vous le pouvez)


Pour plus d'informations, vous pouvez consulter ces questions et réponses:


4
+1 pour stocker le code source, mais s’ils peuvent effectuer des tests de développement sans génération complète, ils risquent de perdre leur temps. Cela signifie également que vous devez créer toutes les images avant de commencer à travailler le matin
TheLQ

@TheLQ: Je suppose, mais dans ce cas, vous devriez peut-être utiliser des versions en cascade, où vos versions en aval (test) ne peuvent s'appuyer que sur des versions en amont (la version réelle). Et ensuite, exportez-les dans un dossier public pour pouvoir les réutiliser localement par les testeurs. Cela implique évidemment un peu d’infrastructure, mais ce serait ma façon de faire les choses au sein d’une équipe relativement importante.
haylem

Que sont les binaires?
Daniel Pendergast


5
"Pourquoi diable pas?" - parce que si votre référentiel dépasse 2 Go, Bitbucket (et je viens de l'essayer avec Github aussi) rejettera votre référentiel. Soyez donc prêt à héberger votre propre dépôt si vous les gonflez de tonnes d’images.
Jez

48

Cette question est assez ancienne, mais c’est une question courante qui se pose lorsqu’on traite avec Git et des progrès ont été réalisés dans les solutions modernes de stockage de gros fichiers dans un dépôt Git depuis la dernière réponse.

Pour stocker de gros fichiers dans Git, il existe les projets suivants:

  • git-annex - Cela existe depuis un moment, mais franchement, la complexité l’entrave.
  • git-media - Aucune expérience personnelle avec celui-ci. Cela semble assez complexe aussi.
  • git-fit - Une tentative pour créer un plugin plus simple. Nécessite un stockage S3. Bien que j'apprécie la simplicité, mon souci principal avec le plugin est qu'il est relativement inconnu et maintenu par une personne (divulgation complète, je suis le seul autre auteur à l'heure actuelle et c'était pour une question triviale).
  • git-lfs - Bien que je ne l'utilise pas beaucoup, il semble que ce soit le Saint Graal. Il est soutenu par Github et est disponible sur tous leurs pensions à partir d'octobre 2015 et met la complexité de la gestion des fichiers sur le site pour stocker vos pensions. Le seul inconvénient, c’est que c’est relativement nouveau, donc au-delà de Github, il n’ya pas beaucoup de support, bien que Gitlab le soit aussi , tout comme Gitea , et Bitbucket a fait allusion au support dans le futur .

TLDR: si vous le pouvez, utilisez git-lfs pour stocker des images ou d’autres fichiers binaires dans git.


9
Pour la première fois depuis longtemps, je suis ravi d'avoir fait défiler la liste pour lire les réponses avec un vote inférieur. git lfs est précisément ce que je veux, et Atlassian ajoute même un support pour cela sur BitBucket Server ! Si je pouvais voter un million de fois, je le ferais.
Jonnybot

7
@ Jonnybot, merci. Comme ma réponse était tardive, je n'ai donc pas eu beaucoup de visibilité, mais après avoir utilisé git-lfs moi-même, je pense que c'est la meilleure solution actuelle pour stocker des fichiers binaires dans git.
James McMahon

45

L'ensemble "ne stocke pas les fichiers binaires dans le contrôle de code source" est défini pour une raison spécifique: si le code source est compilé, ne stockez pas la compilation proprement dite, mais uniquement le code source. Les images et les éléments visuels n'ont pas de "source", ils doivent donc être suivis dans le contrôle de version.


4
Parfois, les ressources visuelles ont "quelque chose qui ressemble à une source", puis automatiser le processus de création de la sortie finale et stocker uniquement la source dans le contrôle de version. Exemples: versions graphiques raster créées à partir de fichiers SVG, ressources de site Web découpées dans une feuille de sprite.
tanius

Correct, c'est un argument tout à fait juste.
Jason T Featheringham

21

Je pense que la méthode recommandée avec Git consiste à utiliser un sous-module (introduit dans Git 1.5.3), qui est essentiellement un référentiel distinct associé au principal. Vous stockez vos images (et autres actifs binaires) dans le sous-module. Cela peut ensuite être extrait avec le référentiel principal ou laissé, en fonction des besoins.

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

"Le support des sous-modules de Git permet à un référentiel de contenir, en tant que sous-répertoire, le contrôle d'un projet externe. Les sous-modules conservent leur propre identité. superproject ") peut facilement cloner tous les sous-modules lors d'une même révision. Des extractions partielles du superprojet sont possibles: vous pouvez demander à Git de ne cloner aucun, certains ou tous les sous-modules."

De plus, la taille ne devrait pas être un problème important si les images ne changent pas souvent. Vous pouvez également exécuter des commandes d'élagage / réduction de taille, telles que:

git gc
git gc-aggressive
git prune

7

Oui .

Disons que vous publiez la version 1.0 du logiciel. Pour la version 2.0, vous décidez de refaire toutes les images avec des ombres. Donc, vous faites cela, et la version 2.0. Ensuite, un client qui utilise la version 1.0 et ne peut pas passer à la version 2.0 décide qu'il souhaite le programme dans une autre langue. Ils vous donnent 1G $ pour le faire, alors vous dites bien. Mais dans une culture différente, certaines de vos images n'ont pas de sens, vous devez donc les changer ...

Si vous souhaitez conserver vos images dans le contrôle de la source, cela est simple: sur la base de la version 1.0, vous apportez des modifications aux images (entre autres), générez, libérez. Si vous n'aviez pas ces éléments dans le contrôle de source, vous auriez beaucoup plus de difficulté, car il vous faudrait trouver les anciennes images, les modifier, puis les compiler.


7

Si cela fait partie du projet, il faut que ce soit dans le VCS . La meilleure façon d’atteindre cet objectif dépend du VCS ou de la manière dont vous organisez un projet. Peut-être un référentiel pour les concepteurs, et uniquement les résultats dans le référentiel du codeur, ou uniquement les «sources d’image» (jadis, j’avais un projet avec un fichier .svg uniquement, et les images étaient générées via make / inscape cli).

Mais, si un VCS ne peut pas gérer cela, ou devient inutilisable, je dirais que ce n’est pas le bon outil pour votre travail.

Jusqu'à présent, je n'avais aucun problème à mettre des quantités de graphismes «habituelles» (maquettes, concepts et graphiques de page) pour des projets Web dans git.


5

Si vous stockez vos images dans SCM: oui. Sans aucun doute.

Si vous stockez vos images dans git: cela devient plus compliqué.

git est très bon avec les fichiers texte, mais de par sa nature, il n’est pas trop chaud avec les binaires. Vous aurez des problèmes avec la taille des données transférées lorsque vous clonez ou appuyez sur Puss, vos répertoires .git s'agrandissent et vous risquez de vous perdre dans la fusion (c.-à-d. Comment fusionner deux images!)

Une solution consiste à utiliser des sous-modules, car cela signifie que le lien entre votre projet et les images sera plus faible. Ainsi, vous ne devrez pas gérer les images comme si elles faisaient partie de votre source, tout en les maintenant sous contrôle, sans avoir se soucier de les ramifier - en supposant que le sous-projet est simplement un référentiel «à plat» de données qui ne subit pas le même désordre au cours du processus de développement habituel.

L’autre solution est de les placer dans un projet différent, de ne jamais créer de branche et de s’assurer que tous ceux qui s’engagent dans ce projet le mettent immédiatement en amont - ne laissez jamais deux personnes modifier la même version du fichier - vous trouverez que cela est le plus difficile. l’aspect comme git n’est pas conçu pour un tel flux de travail non distribué. Vous devrez utiliser des méthodes de communication à l'ancienne pour appliquer cette règle.

Une troisième solution consiste à les placer dans un autre SMC totalement mieux adapté au travail avec des images.


0

Ajoutant à la réponse de @ haylem, notez que la taille joue un rôle important dans cette situation. En fonction du VCS, il peut ne pas fonctionner correctement avec des tonnes d’images. Lorsque des clones ou de grandes pressions commencent à prendre toute la nuit, il est vraiment trop tard car toutes les images se trouvent déjà dans votre référentiel.

Planifiez de grandes images et la croissance future. Vous ne voulez pas avoir deux ans dans ce projet et avoir un "oh merde, peut-être que le repo est un peu trop gros."


1
Votre réponse est quelque peu hors de propos, car la question est spécifique à git. Savez-vous si la taille joue un grand (ou aucun) facteur pour les dépôts git?
Yannis

@Yannis Doit manquer cette première phrase ... Pour autant que je sache, git est mieux avec des référentiels plus grands mais la question de la taille est toujours d'actualité car des clones ou des poussées gigantesques sont un problème
TheLQ le

Avec GIT, il est très facile de réorganiser les référentiels et de créer des clones partiels, etc., si cela pose problème. Ne confondez pas la mélasse historique des outils de contrôle de révision d'il y a plusieurs décennies avec ceux d'aujourd'hui.
mattnz

0

Je suis absolument d'accord pour dire qu'il est possible de les stocker techniquement et économiquement. Question que je poserais tel quel "ces images font-elles partie du produit expédié ou du contenu d'un produit expédié?" Non pas que vous ne puissiez pas stocker de contenu dans GIT (ou tout autre VCS), mais qu'il s'agisse d'un problème distinct pour un VCS distinct.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.