2009-12-15 16 views
12

Attualmente sto iniziando a utilizzare git per il mio sistema di controllo versione, tuttavia faccio un bel po 'di sviluppo web/di gioco che richiede naturalmente immagini (dati binari) da memorizzare. Quindi, se la mia comprensione è corretta se commetto un'immagine e cambia 100 volte, se prendo una nuova copia di quel repository proverò fondamentalmente tutte le 100 revisioni di quel file binario?Dati git e binari

Non si tratta di un problema con repo di grandi dimensioni in cui le immagini cambiano regolarmente non sarebbe il recupero iniziale del repository diventare piuttosto grande? Qualcuno ha avuto problemi con questo nel mondo reale? Ho visto alcune alternative, ad esempio, usando i sottomoduli e mantenendo le immagini in un repository separato, ma questo mantiene solo il codebase più piccolo, il repository delle immagini sarebbe ancora enorme. Fondamentalmente mi sto chiedendo se c'è una bella soluzione a questo.

+1

Questa è una limitazione di progettazione di git. È stato scritto per fare bene una cosa: gestire l'albero dei sorgenti di Linux, che è praticamente tutto in chiaro. Git è tutto basato su differenze e fusioni, cose che in realtà non si applicano alle immagini.Se i file multimediali sono molto grandi o modificati di frequente, è meglio utilizzare un meccanismo diverso per archiviare la cronologia di tali file e, se non si sta realmente collaborando al codice o si creano molti rami, è possibile che sia meglio spento non usare affatto git. – user57368

+2

git gestirà i file binari e il sistema che usa per * memorizzare * delta si basa sul contenuto binario (le differenze di testo che vedi nelle patch sono calcolate al volo, non una rappresentazione di ciò che è memorizzato). Detto questo, xdelta per le immagini compresse non è in grado di ridurre molto lo spazio richiesto. È possibile salvare tutte le immagini come XPM o BMP: p – araqnid

risposta

7

Non chiamerei quel "checkout", ma sì, la prima volta che si preleva il repository, a condizione che i dati binari siano enormi e incomprimibili sarà quello che è: enorme. E sì, dal momento che la legge sulla conservazione è ancora in vigore, la sua suddivisione in moduli non ti farà risparmiare spazio e tempo nella prima estrazione del repository.

Una possibile soluzione utilizza ancora il repository separato e l'opzione --depth quando viene tirata. I repository poco profondi hanno alcune limitazioni, ma non ricordo esattamente cosa, dal momento che non l'ho mai usato. Controlla i documenti. La parola chiave è "superficiale".

Edit: Da git-clone(1):

Un repository superficiale ha un certo numero di limitazioni (non si può clonare o prendere da esso, né spingere dal nè in esso), ma è adeguata se si sono solo interessati alla storia recente di un grande progetto con una lunga storia e vorrebbe inviare correzioni come patch .

+1

Interessante se si tiene a mente la citazione del documento precedente, sembra quasi che un vcs non distribuito potrebbe essere migliore per i dati binari, in quanto si perde un sacco dei vantaggi dell'uso di git quando occuparsi comunque di dati binari. – Jamie

+1

Sì, ma si può ancora prendere il dolore di recuperare un enorme repository una volta. Inoltre, è possibile utilizzare repository non-git separato per i dati binari. Ma dato che amo davvero git (anche se all'inizio ero scettico - tutto ciò che scrive Linus sarà lodato), suggerirei di separare i dati binari e ... beh, trattandoli separatamente ;-) –

2

Sfortunatamente git non è stato creato per la memorizzazione di dati binari. Dato che è distribuito, estrarrai tutte le versioni di tutti i file ogni volta che lo cloni. Diventa inoltre ridicolmente difficile eliminare i file binari di grandi dimensioni dal tuo repository di codice. Maggiori informazioni su questo qui: (http://www.somethingorothersoft.com/2009/09/08/the-definitive-step-by-step-guide-on-how-to-delete-a-directory-permanently-from-git-on-widnows-for-dumbasses-like-myself/).

Si consiglia di provare, ma mantenere i file binari separatamente dal codice (cioè utilizzando i sottomoduli). In tal caso, se non funziona per te, puoi utilizzare un'altra soluzione senza riscrivere l'intera cronologia del tuo repository principale.

2

Quello che faccio è rendere le directory ignorate/non tracciate delle immagini e quindi sincronizzare le directory/directory di immagini usando altri sistemi non-git (o semplicemente copiare manualmente le modifiche alla directory dell'immagine una volta, quando parli di un sacco di immagini che non è necessario mantenere completamente sincronizzate).