Est-ce que git est bon avec les fichiers binaires?

99

Est-ce que git est bon avec les fichiers binaires?

Si j'ai beaucoup de fichiers non compressés en cours de modification, et de nombreux fichiers compressés jamais (ou presque jamais) modifiés, est-ce que git le gérerait bien? Par exemple, si j'insère ou supprime le milieu et insère des données vers la fin, il le remarquera comme avec le texte?

Si git n'est pas bon avec les fichiers binaires, quel outil pourrais-je envisager?

Trigonométrie
la source
1
très bon avec binaire - je l'utilise moi
tekknolagi
C'est un peu vrai. Vous pouvez mettre votre / home sous révision git et cela devrait fonctionner plutôt bien.
Loïc Faure-Lacroix
1
Ce n'est pas dans l'esprit de la question, qui a été clairement notée comme étant préoccupée de savoir si les fichiers binaires avaient des différences faites sur eux (probablement pour des raisons de gonflement du référentiel et de performances). Cependant, je ne l'ai pas contre-voté (et il semble que celui qui l'a fait l'ait depuis retiré).
coreyward
1
Remarque: vous avez maintenant git-lts, pour stocker vos binaires ailleurs: stackoverflow.com/a/29530784/6309
VonC
1
Est-ce qu'il gonfle le dossier .git?
Nikhil

Réponses:

48

Dès la sortie de la boîte, git peut facilement ajouter des fichiers binaires à son index, et également les stocker de manière efficace, à moins que vous ne fassiez des mises à jour fréquentes sur de gros fichiers non compressibles.

Les problèmes commencent lorsque git a besoin de générer des différences et des fusions: git ne peut pas générer de différences significatives, ni fusionner des fichiers binaires de quelque manière que ce soit. Ainsi, toutes les fusions, rebases ou cherrypicks impliquant une modification d'un fichier binaire impliqueront que vous effectuiez une résolution manuelle des conflits sur ce fichier binaire.

Vous devez décider si les modifications du fichier binaire sont suffisamment rares pour que vous puissiez vivre avec le travail manuel supplémentaire qu'elles provoquent dans le flux de travail git normal impliquant des fusions, des rebases, des cherrypicks.

ndim
la source
26
Je dois souligner que les changements de fichiers binaires ne sont pas un problème, faire des changements à plusieurs endroits, puis essayer de les fusionner.
Winston Ewert
15
git peut générer des différences significatives. Un diff créé avec git diff --binarypourra patcher des fichiers binaires.
CB Bailey
46

En plus d'autres réponses.

  • Vous pouvez envoyer un diff dans un fichier binaire en utilisant le format de diff binaire . Il n'est pas lisible par l'homme, et il ne peut être appliqué que si vous avez une pré-image exacte dans votre référentiel, c'est-à-dire sans aucune fuzz.
    Un exemple:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • Vous pouvez utiliser textconv gitattribute pour git diffafficher des différences lisibles par l'homme pour les fichiers binaires ou des parties de fichiers binaires. Par exemple, pour les fichiers * .jpg, il peut y avoir une différence dans les informations EXIF, pour les fichiers PDF, il peut y avoir une différence entre leur représentation textuelle (pdf2text ou quelque chose comme ça).

HTH.

Jakub Narębski
la source
5
Un grand merci de m'avoir appris les gitattributes! Ouvre un tout nouveau monde de possibilités.
hermannloose
15

Si vous avez de très gros fichiers binaires, vous pouvez utiliser git-annex pour stocker les données en dehors du référentiel. Consultez: http://git-annex.branchable.com/

John Gibb
la source
6
Git-annex est assez merveilleux, mais probablement mieux adapté aux fichiers qui ne changent pas souvent , par exemple une collection de fichiers musicaux, d'images, de PDF, ...
sr_
@sr_ exactement, tout comme Git LFS. Il semble qu'il n'y ait pas de système de contrôle de version adapté à ce type de cas d'utilisation tout en ayant également un système distribué comme base (comme Git).
Marc J. Schmidt le
5

Je ne connais aucun outil qui essaie de stocker des différences de fichiers binaires pour le contrôle de version, mais il convient de noter que Git ne le fait pas même pour les fichiers texte. Git stocke les fichiers sous forme d'objets blob et effectue une différence entre eux quand il en a besoin.

Si vous cherchez à contrôler la version de quelque chose comme des documents Photoshop / Illustrator, GridIron Flow pourrait faire l'affaire pour vous. Si vous essayez de les maintenir synchronisés entre les machines, Dropbox ou Rsync peuvent le gérer, mais ils ne feront pas de différence intelligente.

coreyward
la source
1
Extrait du livre de la communauté git ( book.git-scm.com/7_how_git_stores_objects.html ): "Pour économiser cet espace, Git utilise le packfile. C'est un format où Git enregistrera uniquement la partie qui a changé dans le deuxième fichier , avec un pointeur vers le fichier auquel il est similaire. "
Wayne Conrad
2
Ouais, c'est si / quand vous exécutez git gcpour faire le ramasse-miettes. De la même page: "Puisque Git stocke chaque version de chaque fichier comme un objet séparé, cela peut devenir assez inefficace. Imaginez avoir un fichier de plusieurs milliers de lignes et changer une seule ligne. Git stockera le deuxième fichier dans son intégralité, ce qui est un énorme gaspillage d'espace. "
coreyward
2
Fair 'nuff. git fait gc automatiquement de temps en temps, au moins pour le projet pour lequel je l'utilise. Je ne sais pas quelle métrique il utilise pour décider quand s'exécuter - peut-être qu'il y a des arbres qui ne déclencheraient jamais (ou rarement) gc.
Wayne Conrad
1
Depuis la page de manuel de git gc: "Les utilisateurs sont encouragés à exécuter cette tâche régulièrement dans chaque référentiel pour maintenir une bonne utilisation de l'espace disque et de bonnes performances d'exploitation. Certaines commandes git peuvent exécuter automatiquement git gc; voir l'indicateur --auto ci-dessous pour plus de détails . "
Jacob Akkerboom
1
@KennyEvitt Il y en a une tonne maintenant. Abstract en est un, et Kactus en est un autre qui utilise git dans les coulisses.
coreyward
4

Eh bien git est bon avec les binaires. Mais il ne gérera pas les binaires comme les fichiers texte. C'est comme si vous vouliez fusionner des fichiers binaires. Je veux dire, un diff sur un jpeg ne vous retournera jamais rien. Git fonctionne très bien avec les fichiers texte et probablement aussi mauvais que toutes les autres solutions avec des fichiers binaires!

Loïc Faure-Lacroix
la source
2

si vous voulez une solution pour la gestion des versions, vous pouvez envisager git-lfs qui a un pointeur léger vers votre fichier.

cela signifie que lorsque vous clonez votre dépôt, il ne télécharge pas toutes les versions, mais uniquement celle qui est extraite.

Voici un joli tutoriel sur la façon de l'utiliser

danfromisrael
la source