2009-11-19 6 views
10

Pondría bajo control de versión una gran cantidad de datos, es decir, una estructura de directorios (con profundidad < = 5) con cientos de archivos con un tamaño de aproximadamente 500 Mb).Vale la pena administrar muchos archivos de más de 500 MB

Las cosas que necesito es un sistema que me ayude: - detectar si un reproductor de archivos se ha cambiado - para detectar si se han añadido archivos/eliminado - clonar el repositorio completo en otro lugar - para almacenar una "punto de control" y restaurarlo más tarde

No necesito sha1 para detectar cambios, algo más rápido es aceptable.

¿Vale la pena pagar por esto? ¿Hay una alternativa mejor?

Respuesta

10

Como mencioné en "What are the Git limits", Git no está hecho para administrar archivos grandes (o grandes archivos binarios para el caso).

Git sería necesaria si necesita:

  • saber qué ha cambiado en realidad dentro de un archivo. Pero para el nivel de directorio, las otras respuestas son mejores (Unison o rsynch)
  • mantener una estrecha proximidad (es decir, "mismo referencial") entre los datos de desarrollo y los recursos de gran tamaño. Tener solo un referencial ayudaría, pero necesitaría un tenedor de Git, como git-bigfiles para administrarlos de manera eficiente.

Nota: sigue usando Git, puede intentar this approach

Desafortunadamente, rsync no es realmente perfecto para nuestros propósitos bien.

  • En primer lugar, no es realmente un sistema de control de versiones. Si desea almacenar varias revisiones del archivo, debe realizar copias múltiples, lo cual es un desperdicio, o xdelta, lo que es tedioso (y potencialmente lento de reensamblar, y hace que sea difícil podar las versiones intermedias), o verifíquelas en git, que aún se derrite porque tus archivos son demasiado grandes.
  • Más rsync realmente no puede manejar el cambio de nombre de archivo correctamente - en absoluto.

bien, ¿qué pasa con otra idea: vamos a dividir el archivo en trozos, y comprobar cada uno de esos bloques en git separado.
Luego de compresión delta del GIT no tendrá demasiado para masticar a la vez, y sólo tenemos que enviar bloques modificados ...

Basado en gzip --rsyncable, con un POC available in this Git repo.

0

tal vez algo como rsync es mejor para sus necesidades (si lo que desea algunas copias de seguridad, sin concurrencia, fusionar, ramificación, etc.)

1

Unison File Synchroniser es una excelente herramienta para mantener múltiples copias de grandes archivos binarios. Hará todo lo que pida aparte de almacenar un punto de control, pero podría hacerlo con una copia de enlace permanente rsync.

1

Si estás en un sistema UNIX (probablemente son, ya que estás usando GIT):

  • Utilice un repositorio git para todas las cosas pequeñas.
  • Enlace simbólico de archivos grandes desde una sola carpeta "large_files" a las ubicaciones apropiadas dentro de su repositorio.
  • Realice una copia de seguridad de la carpeta large_files utilizando un sistema de copia de seguridad más tradicional que no sea de versiones, agréguelos todos en un archivo zip de vez en cuando si necesita pasarlos a otros.

De esta forma, obtendrá los beneficios de git, conservará la estructura de árbol que desee y los archivos de gran tamaño se copiarán en cualquier otro lugar, a pesar de parecer que todavía están dentro de la jerarquía de carpetas normal.

8

git-annex es una solución a este problema. En lugar de almacenar los datos de archivos grandes directamente en git, los almacena en un almacén de claves/valores. Los enlaces simbólicos a las claves se registran en git como un proxy para los archivos grandes reales.

http://git-annex.branchable.com