Git va bene con i file binari?


97

Git va bene con i file binari?

Se dovessi modificare molti file non compressi e molti file compressi mai (o quasi mai) modificati, git lo gestirà bene? Ad esempio, se inserisco o rimuovo il centro e inserisco i dati verso la fine lo noterà come fa con il testo?

Se git non funziona con i file binari, quale strumento potrei prendere in considerazione?


1
molto bravo con il binario - lo uso io stesso
tekknolagi

È piuttosto vero. Puoi mettere la tua / home sotto revisione git e dovrebbe funzionare abbastanza bene.
Loïc Faure-Lacroix

1
Questo non è nello spirito della domanda, che è stato chiaramente notato come preoccupato per il fatto che i file binari avessero diff fatto su di essi (probabilmente per motivi di gonfiaggio del repository e di prestazioni). Tuttavia, non l'ho sottovalutato (e sembra che chiunque lo abbia fatto da allora lo ha rimosso).
coreyward

1
Nota: ora avete git-LTS, per memorizzare i file binari altrove: stackoverflow.com/a/29530784/6309
VonC

1
Si gonfia la cartella .git?
Nikhil

Risposte:


47

Git può facilmente aggiungere file binari al suo indice e anche archiviarli in modo efficiente a meno che non si eseguano aggiornamenti frequenti su file non comprimibili di grandi dimensioni.

I problemi iniziano quando git deve generare differenze e unioni: git non può generare differenze significative o unire file binari in alcun modo che possa avere senso. Quindi tutti i merge, rebase o cherrypick che implicano una modifica a un file binario implicheranno la risoluzione manuale dei conflitti su quel file binario.

Devi decidere se le modifiche al file binario sono abbastanza rare da poter vivere con il lavoro manuale extra che causano nel normale flusso di lavoro git che coinvolge fusioni, rebase, cherrypicks.


26
Devo sottolineare che le modifiche ai file binari non sono un problema, apportare modifiche in più punti e quindi provare a unirle lo è.
Winston Ewert

15
git può generare differenze significative. Un diff creato con git diff --binarysarà in grado di applicare patch ai file binari.
CB Bailey

46

Oltre ad altre risposte.

  • È possibile inviare un diff a un file binario utilizzando il cosiddetto formato diff binario . Non è leggibile dall'uomo e può essere applicato solo se hai una preimage esatta nel tuo repository, cioè senza alcun fuzz.
    Un esempio:

    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
    
  • Puoi usare textconv gitattribute per git diffmostrare differenze leggibili dall'uomo per file binari o parti di file binari. Ad esempio per i file * .jpg può essere una differenza nelle informazioni EXIF, per i file PDF può essere una differenza tra la loro rappresentazione testuale (pdf2text o qualcosa di simile).

HTH.


5
Grazie mille per avermi insegnato su gitattributes! Apre un intero nuovo mondo di possibilità.
hermannloose

15

Se hai file binari molto grandi, puoi usare git-annex per archiviare i dati al di fuori del repository. Controlla: http://git-annex.branchable.com/


6
Git-annex è abbastanza meraviglioso, ma probabilmente più adatto per file che non cambiano molto spesso , ad esempio una raccolta di file musicali, immagini, PDF, ...
sr_

@sr_ esattamente, così fa Git LFS. Sembra che non ci sia un sistema di controllo della versione adatto a questo tipo di casi d'uso pur avendo come base un sistema distribuito (come Git).
Marc J. Schmidt

5

Non conosco alcuno strumento che provi a memorizzare le differenze di file binari per il controllo della versione, ma vale la pena notare che Git non lo fa nemmeno per i file di testo. Git archivia i file come BLOB e fa una differenza tra di loro quando necessario.

Se stai cercando di eseguire il controllo della versione su qualcosa come i documenti Photoshop / Illustrator, GridIron Flow potrebbe fare il trucco per te. Se stai cercando di mantenerli sincronizzati tra macchine, Dropbox o Rsync possono gestirlo, ma non faranno differenze intelligenti.


1
Dal git community book ( book.git-scm.com/7_how_git_stores_objects.html ): "Per risparmiare spazio, Git utilizza il packfile. Questo è un formato in cui Git salverà solo la parte che è stata modificata nel secondo file , con un puntatore al file a cui è simile. "
Wayne Conrad

2
Sì, è se / quando corri git gca fare la raccolta dei rifiuti. Dalla stessa pagina: "Poiché Git memorizza ogni versione di ogni file come un oggetto separato, può diventare piuttosto inefficiente. Immagina di avere un file lungo diverse migliaia di righe e di modificare una singola riga. Git memorizzerà il secondo file nella sua interezza, il che è un grande spreco di spazio. "
coreyward

2
Fair 'nuff. git fa automaticamente gc di tanto in tanto, almeno per il progetto per cui lo uso. Non so quale metrica usi per decidere quando eseguire - forse ci sono alberi che non attiveranno mai (o raramente) gc.
Wayne Conrad

1
Dalla pagina man di git gc: "Gli utenti sono incoraggiati a eseguire questa attività regolarmente all'interno di ogni repository per mantenere un buon utilizzo dello spazio su disco e buone prestazioni operative. Alcuni comandi git possono eseguire automaticamente git gc; vedere il flag --auto sotto per i dettagli . "
Jacob Akkerboom

1
@KennyEvitt Ce ne sono un sacco adesso. Abstract è uno, e Kactus è un altro che usa git dietro le quinte.
coreyward

3

Bene, git funziona bene con i binari. Ma non gestirà i binari come i file di testo. È come se volessi unire file binari. Voglio dire, un diff su un jpeg non ti restituirà mai nulla. Git funziona molto bene con i file di testo e probabilmente come ogni altra soluzione con i file binari!


2

se vuoi una soluzione per il controllo delle versioni potresti prendere in considerazione git-lfs che ha un puntatore leggero al tuo file.

significa che quando cloni il tuo repository non scarica tutte le versioni ma solo quella estratta.

Ecco un bel tutorial su come usarlo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.