Administrar archivos binarios grandes con Git
Estoy buscando opiniones sobre cómo manejar archivos binarios grandes de los que depende mi código fuente (aplicación web). Actualmente estamos discutiendo varias alternativas:
- Copie los archivos binarios a mano.
- Ventaja: No estoy seguro.
- Contra: Estoy firmemente en contra de esto, ya que aumenta la probabilidad de errores al configurar un sitio nuevo o migrar el antiguo. Se acumula otro obstáculo que superar.
- Administrelos todos con Git .
- Ventaja: Elimina la posibilidad de "olvidar" copiar un archivo importante
- Contra: Infla el repositorio y disminuye la flexibilidad para administrar el código base y los checkouts, clones, etc. llevarán bastante tiempo.
- Repositorios separados.
- Ventaja: verificar/clonar el código fuente es más rápido que nunca y las imágenes se archivan correctamente en su propio repositorio.
- Contra: Elimina la simplicidad de tener el único repositorio Git en el proyecto. Seguramente introduce algunas otras cosas en las que no había pensado.
¿Cuáles son sus experiencias/pensamientos al respecto?
Además: ¿Alguien tiene experiencia con varios repositorios de Git y su gestión en un solo proyecto?
Los archivos son imágenes para un programa que genera archivos PDF con esos archivos. Los archivos no cambiarán muy a menudo (como ocurre en años), pero son muy relevantes para un programa. El programa no funcionará sin los archivos.
Descubrí git-annex recientemente, lo cual me parece increíble. Fue diseñado para administrar archivos grandes de manera eficiente. Lo uso para mis colecciones de fotos/música (etc.). El desarrollo de git-annex es muy activo. El contenido de los archivos se puede eliminar del repositorio de Git, Git solo rastrea la jerarquía del árbol (a través de enlaces simbólicos). Sin embargo, para obtener el contenido del archivo, es necesario un segundo paso después de tirar/empujar, por ejemplo:
$ git annex add mybigfile
$ git commit -m'add mybigfile'
$ git push myremote
$ git annex copy --to myremote mybigfile ## This command copies the actual content to myremote
$ git annex drop mybigfile ## Remove content from local repo
...
$ git annex get mybigfile ## Retrieve the content
## or to specify the remote from which to get:
$ git annex copy --from myremote mybigfile
Hay muchos comandos disponibles y hay una excelente documentación en el sitio web. Hay un paquete disponible en Debian .
Si el programa no funciona sin los archivos, parece que dividirlos en un repositorio separado es una mala idea. Tenemos grandes conjuntos de pruebas que dividimos en un repositorio separado, pero esos son archivos verdaderamente "auxiliares".
Sin embargo, es posible que pueda administrar los archivos en un repositorio separado y luego usarlos git-submodule
para incorporarlos a su proyecto de manera sensata. Por lo tanto, aún tendría el historial completo de todas sus fuentes pero, según tengo entendido, solo tendría una revisión relevante de su submódulo de imágenes. La git-submodule
instalación debería ayudarle a mantener la versión correcta del código en línea con la versión correcta de las imágenes.
Aquí hay una buena introducción a los submódulos de Git Book.
Otra solución, desde abril de 2015, es Git Large File Storage (LFS) (de GitHub).
Utiliza git-lfs (consulte git-lfs.github.com ) y se prueba con un servidor que lo admite: lfs-test-server :
puede almacenar metadatos solo en el repositorio de git y el archivo grande en otro lugar.
Eche un vistazo a git bup , que es una extensión de Git para almacenar de forma inteligente archivos binarios grandes en un repositorio de Git.
Querrá tenerlo como un submódulo, pero no tendrá que preocuparse de que el repositorio se vuelva difícil de manejar. Uno de sus casos de uso de muestra es almacenar imágenes de VM en Git.
En realidad, no he visto mejores tasas de compresión, pero mis repositorios no tienen archivos binarios realmente grandes.
Su experiencia puede ser diferente.
También puedes usar git-fat . Me gusta que solo depende del stock Python y rsync
. También es compatible con el flujo de trabajo habitual de Git, con los siguientes comandos que se explican por sí mismos:
git fat init
git fat push
git fat pull
Además, debe registrar un archivo .gitfat en su repositorio y modificar sus atributos .gitfat para especificar las extensiones de archivo que desea git fat
administrar.
Agrega un binario usando normal git add
, que a su vez invoca git fat
según sus reglas de gitattributes.
Finalmente, tiene la ventaja de que la ubicación donde se almacenan realmente los archivos binarios se puede compartir entre repositorios y usuarios y admite cualquier cosa rsync
.
ACTUALIZACIÓN: No use git-fat si está usando un puente Git-SVN. Terminará eliminando los archivos binarios de su repositorio de Subversion. Sin embargo, si estás utilizando un repositorio Git puro, funciona a la perfección.