Optimiser un dépôt git, contenant de gros fichiers binaires

21

Notre projet fait environ 11 Go, dont 10 sont des données binaires (images .png). Par conséquent, une opération git diffou git statusprend plus d'une minute. Heureusement, tous les fichiers de données sont séparés dans un dossier avec le merveilleux nom data. L'affectation est "Évitez de compresser, de différer et d'autres opérations coûteuses sur des fichiers binaires."

  • Il a été envisagé de diviser le projet en deux référentiels. Ce dataserait alors un dépôt externe, qui est vérifié par le dépôt principal du code source. Il a été décidé que les frais généraux liés à la synchronisation des dépôts seraient trop importants, en particulier pour les artistes qui travaillent avec les fichiers de données.

  • Dire explicitement à git que ces fichiers sont binaires , excluant les fichiers des différences ont été considérés, mais ceux-ci ne semblent être qu'une solution partielle à la question.

Je pense que les attributs git sont la solution, mais comment? Ou existe-t-il une meilleure architecture qu'un dépôt monolithique?

Vorac
la source
1
La première grande question ici est de savoir à quel point ces fichiers de données sont importants. Votre programme a-t-il besoin de toutes ces images disponibles pour faire quelque chose d'utile, ou peut-il s'en tirer avec un petit sous-ensemble pendant le développement / test typique?
Ixrec
@Ixrec, les images sont en fait plus importantes que le code source. Tous doivent être présents et les sommes de contrôle .png sont toujours vérifiées pour les fichiers corrompus.
Vorac
1
Pourquoi cette question n'est-elle pas sur le débordement de pile? Le Q. Semble exactement adapté à cela.
spirc
@spirc, cette question chevauche la ligne entre "l'aide avec un outil logiciel" qui est sur le sujet chez SO, et "la stratégie de contrôle de version" qui est sur le sujet ici. Comme il ne demande pas quelle commande git exécuter pour faire quelque chose, ce n'est pas clairement du côté SO de la ligne, j'ai donc voté pour le laisser ouvert ici.
@Snowman merci pour la réponse. À quel élément de la liste sur le sujet cela correspond-il? programmers.stackexchange.com/help/on-topic
spirc

Réponses:

18

Vous pouvez utiliser git-lfs ou des outils similaires (git-fat, git-annex, etc.). Ces outils remplacent essentiellement les fichiers binaires de votre référentiel par un petit fichier texte avec des hachages et stockent les données binaires réelles de manière non git - comme un partage réseau.

Rend les différences et tout ultra-rapides car seuls les hachages sont comparés, et est - au moins pour git-lfs - transparent pour l'utilisateur (après l'installation une fois).

Afaik git-lfs est pris en charge par github, gitlab, VisualStudio et est open source.

kat0r
la source
2
Avez-vous essayé d'utiliser git-lfssur un projet avec de nombreux gigaoctets d'actifs avec une équipe mixte développeur / artiste? Je suis intéressé de savoir si les gens utilisent git-lfs pour des projets tels que les jeux et l'animation. Depuis son encore assez nouveau au moment de la rédaction. D'après ma propre expérience, la barrière d'entrée à git pour les utilisateurs moins techniques est déjà très élevée, donc avoir une couche supplémentaire pour la gestion des fichiers en plus - peut être difficile à utiliser pour les gens à moins qu'ils ne soient déjà à l'aise avec git.
ideasman42
Seulement pour environ ~ 1 Go de données, désolé. Mais git-lfs ne devrait ajouter aucune étape supplémentaire pour les utilisateurs finaux, il devrait être complètement transparent.
kat0r
Cela semble être la bonne réponse, si certains problèmes surviennent lors de l'intégration, je reviendrai ici. La procédure d'installation ne doit donc être effectuée qu'une seule fois sur le serveur, et non sur chaque machine cliente?
Vorac
Afaik, vous devez également installer un petit complément client, consultez la page github. Mais cela devrait être facile à déployer avec une stratégie de groupe / plus simple que n'importe quelle alternative.
kat0r
1

Utilisez les dépôts GIT et SVN

Si les fichiers binaires peuvent être séparés logiquement de la source, vous pouvez envisager d'utiliser git pour les fichiers texte et un non DVCS tel que subversion pour les fichiers binaires.

Un projet sur lequel je travaille fait cela car nous avons beaucoup de Go pour les bibliothèques par compilation (pour les dépendances OSX / Win32), dont nous devons garder la version.


D'un autre côté, si vous avez des utilisateurs non techniques, l'utilisation de deux systèmes de contrôle de version peut être problématique. Cependant, si les artistes ne travaillent pas sur du code, vous pouvez fournir un script pour effectuer la mise à jour et ils peuvent utiliser subversion pour valider des ressources binaires.

Utiliser SVN (avec git svn)

Bien que ce compromis ne soit pas toujours aussi agréable pour les développeurs habitués à utiliser git normal, vous pouvez utiliser SVN pour le référentiel principal et les développeurs peuvent utiliser des git svnoutils.

Cela rend un peu plus de travail pour les développeurs utilisant git, mais signifie pour tous ceux qui ne sont pas familiers avec DVCS (ou VCS en général) - ils peuvent utiliser le modèle simple de SVN sans avoir à utiliser plusieurs systèmes de contrôle de version complexes.


git-lfs est également une option, mais je ne l'ai pas utilisée, je ne peux donc pas parler de son bon fonctionnement.

ideasman42
la source