Ottimizza un repository git, contenente file binari di grandi dimensioni


21

Il nostro progetto è di circa 11 GB, 10 dei quali sono dati binari (immagini .png). Di conseguenza, a git diffo git statusoperazioni richiedono più di un minuto. Fortunatamente tutti i file di dati sono separati in una cartella con il nome meraviglioso data. L'assegnazione è "Evita di comprimere, diffondere e altre operazioni costose su file binari".

  • È stato considerato di suddividere il progetto in due repository. Quindi datasarebbe un repository esterno, che viene verificato dal repository del codice sorgente principale. È stato deciso che il sovraccarico di mantenere sincronizzati i repository sarebbe stato eccessivo, specialmente per gli artisti che lavorano con i file di dati.

  • Dire esplicitamente a git che quei file sono binari , sono stati considerati esclusi i file dai diff , ma quelli sembrano solo una soluzione parziale alla domanda.

Sento che gli attributi git sono la soluzione, ma come? O esiste un'architettura migliore di un repo monolitico?


1
La prima grande domanda qui è quanto sono importanti quei file di dati. Il tuo programma ha bisogno di tutte quelle immagini disponibili per fare qualcosa di utile o può cavarsela con un piccolo sottoinsieme durante lo sviluppo / test tipico?
Ixrec,

@Ixrec, le immagini sono in realtà più importanti del codice sorgente. Devono essere tutti presenti e i checksum .png vengono controllati sempre per file corrotti.
Vorac,

1
Perché questa domanda non è in overflow dello stack? Il Q. Sembra esattamente adatto ad esso.
spirc

@spirc questa domanda si trova a cavallo tra "aiuto con uno strumento software" che è in argomento in SO e "strategia di controllo della versione" che è in argomento qui. Dato che non sta chiedendo quale comando git eseguire per fare qualcosa, non è chiaramente sul lato SO della linea, quindi ho votato per lasciarlo aperto qui.

@Snowman grazie per la risposta. In quale voce dell'elenco argomenti si adatta? programmers.stackexchange.com/help/on-topic
spirc

Risposte:


18

Puoi usare git-lfs o strumenti simili (git-fat, git-annex, ecc.). Tali strumenti sostanzialmente sostituiscono i file binari nel tuo repository con piccoli file di testo con hash e memorizzano i dati binari effettivi in ​​modo non git, come una condivisione di rete.

Rende diff e tutto superveloce come vengono confrontati solo gli hash ed è - almeno per git-lfs - trasparente per l'utente (dopo l'installazione una volta).

Afaik git-lfs è supportato da github, gitlab, VisualStudio ed è open source.


2
Hai provato a usare git-lfs un progetto con molti gigabyte di risorse con un team misto di sviluppatori / artisti? Sono interessato a sapere se le persone usano git-lfs per progetti come giochi e animazioni. Dal momento che è ancora abbastanza nuovo al momento della scrittura. Dalla mia esperienza personale, la barriera di accesso a git per utenti meno tecnici è già molto alta, quindi avere un ulteriore livello per la gestione dei file al di sopra di esso - può essere difficile da usare per le persone a meno che non siano già a proprio agio con git.
ideasman42

Spiacente, solo per circa 1 GB di dati. Ma git-lfs non dovrebbe aggiungere ulteriori passaggi per gli utenti finali, dovrebbe essere completamente trasparente.
Kat0r

Questa sembra essere la risposta corretta, se sorgono alcuni problemi durante l'integrazione, riporterò qui. Quindi la procedura di installazione deve essere completata solo una volta sul server e non su ciascun computer client?
Vorac,

Inoltre, è necessario installare anche un componente aggiuntivo per piccoli client, controllare la pagina di github. Ma dovrebbe essere facile da implementare con una politica di gruppo / più semplice di qualsiasi alternativa.
Kat0r

1

Utilizza i repository GIT e SVN

Se i file binari possono essere separati logicamente dall'origine, potresti considerare di usare git per i file di testo e un DVCS non come sovversione per i file binari.

Un progetto su cui lavoro lo fa poiché abbiamo molti GB per le librerie per compilate (per le dipendenze OSX / Win32), che dobbiamo tenere sotto controllo.


D'altra parte, se si dispone di utenti non tecnici, l'utilizzo di due sistemi di controllo della versione può essere problematico. Tuttavia, se gli artisti non stanno lavorando al codice, è possibile fornire uno script per eseguire l'aggiornamento e utilizzare sovversione per eseguire il commit di risorse binarie.

Usa SVN (con git svn)

Mentre questo compromesso non è sempre così bello per gli sviluppatori che sono abituati ad usare git normale, potresti usare SVN per il repository principale e gli sviluppatori possono usare gli git svnstrumenti.

Questo rende un po 'più lavoro per gli sviluppatori che usano git, ma significa per tutti coloro che non hanno familiarità con DVCS (o VCS in generale): possono usare il semplice modello di SVN senza dover usare più sistemi di controllo di versione complessi.


Anche git-lfs è un'opzione, ma non l'ho usata, quindi non posso parlare di quanto funzioni.

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.