2009-11-19 9 views
10

Vorrei mettere sotto controllo una grande quantità di dati, cioè una struttura di directory (con profondità < = 5) con centinaia di file con dimensioni di circa 500Mb).Vale la pena di gestire molti file più grandi di 500 MB

Le cose che ho bisogno è un sistema che mi aiutano: - per rilevare se un file è stato modificato - per rilevare se sono stati aggiunti file/rimosso - per clonare l'intero archivio in un'altra posizione - per memorizzare un "checkpoint" e ripristinarlo più tardi

Non ho bisogno di sha1 per il rilevamento di modifiche, qualcosa di più veloce è accettabile.

Vale la pena per questo? C'è un'alternativa migliore?

risposta

10

Come detto in "What are the Git limits", Git non è progettato per gestire file di grandi dimensioni (o file binari di grandi dimensioni).

Git sarebbe necessaria se è necessario:

  • sapere che cosa è effettivamente cambiato all'interno di un file. Ma per il livello di directory, le altre risposte sono migliori (Unison o rsynch)
  • mantenere una stretta prossimità (vale a dire "stesso referenziale") tra i dati di sviluppo e quelle grandi risorse. Avere solo un referenziale sarebbe d'aiuto, ma allora avresti bisogno di un fork di Git, come git-bigfiles per gestirli in modo efficiente.

Nota: ancora utilizzando Git, si può provare this approach

Purtroppo, rsync non è davvero perfetto per i nostri scopi sia.

  • Prima di tutto, non è proprio un sistema di controllo di versione. Se si desidera memorizzare revisioni multiple di file, è necessario eseguire più copie, che è uno spreco, o xdelta loro, che è noioso (e potenzialmente lento a rimontare, e rende difficile potare versioni intermedie), o il check-in git, che si scioglierà ancora perché i tuoi file sono troppo grandi.
  • Inoltre rsync davvero non in grado di gestire file di rinomina correttamente - a tutti.

Va bene, che dire di un'altra idea: cerchiamo di dividere il file in pezzi, e controllare ciascuno di questi blocchi in git separatamente.
Poi compressione delta del git non avrà troppo da masticare alla volta, e abbiamo solo inviare blocchi modificati ...

Basato su gzip --rsyncable, con un POC available in this Git repo.

0

Forse qualcosa di simile rsync è migliore per le vostre esigenze (se si desidera solo alcuni backup, senza concorrenza, merge, ramificazione ecc)

1

Unison File Synchroniser è un ottimo strumento per mantenere più copie di grandi file binari. Farà tutto ciò che chiederai oltre alla memorizzazione di un checkpoint, ma che potresti fare con una copia hardlink rsync.

1

Se siete su un sistema Unix (probabilmente sono, dal momento che si sta utilizzando git):

  • Utilizzare un repo git per tutte le piccole cose.
  • Symlink file di grandi dimensioni da una singola cartella "large_files" alle posizioni appropriate all'interno del repository.
  • Eseguire il backup della cartella large_files utilizzando un sistema di backup con versioni non tradizionali, raggruppandoli tutti in un file zip di volta in volta se è necessario passarli ad altri.

In questo modo, si ottengono i benefici di git, si mantiene qualunque struttura ad albero che si desidera, ei file di grandi dimensioni viene eseguito il backup altrove, pur apparendo di essere ancora all'interno della gerarchia di cartelle normale.

8

git-annex è una soluzione a questo problema. Anziché archiviare i dati di file di grandi dimensioni direttamente in git, li archivia in un archivio di chiavi/valori. I collegamenti simbolici alle chiavi vengono quindi controllati in git come proxy per i file di grandi dimensioni effettivi.

http://git-annex.branchable.com