Pregunta

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:

  1. Copie los archivos binarios a mano.
    • Pro: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.
  2. Gestionarlos todos con git.
    • Pro:Elimina la posibilidad de 'olvidarse' de copiar un archivo importante
    • Contra:Infla el repositorio y disminuye la flexibilidad para administrar el código base y los pagos, clones, etc.tomará bastante tiempo.
  3. Repositorios separados.
    • Pro: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 simpleza 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?

También:¿Alguien tiene experiencia con múltiples 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.

¿Fue útil?

Solución

Si el programa no funcionará sin los archivos Parece que dividir en partes un acuerdo de recompra por separado es una mala idea. Tenemos grandes conjuntos de pruebas que se rompen en un acuerdo de recompra por separado, pero los archivos son verdaderamente "auxiliares".

Sin embargo, puede ser capaz de gestionar los archivos en un acuerdo de recompra por separado y luego usar git-submodule a tirar de ellos en su proyecto de una manera sana. Por lo tanto, usted todavía tiene la historia completa de toda su fuente, pero, como yo lo entiendo, usted sólo tiene la revisión correspondiente de su submódulo imágenes. La instalación git-submodule debería ayudar a mantener la versión correcta del código en línea con la versión correcta de las imágenes.

Esto es una buena introducción rel="noreferrer"> href="http://alx.github.io/gitbook/5_submodules.html" libro.

Otros consejos

git-anexo recientemente que me parece impresionante. Fue diseñado para la gestión de archivos de gran tamaño de manera eficiente. Yo lo uso para mis colecciones de fotos / música (etc.). El desarrollo de git-anexo es muy activo. El contenido de los archivos se puede quitar desde el repositorio Git, sólo la jerarquía de árbol es seguido por Git (a través de enlaces simbólicos). Sin embargo, para obtener el contenido del archivo, un segundo paso es necesario 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 gran documentación en el sitio web. Un paquete está disponible en Debian .

Otra solución, desde abril de 2015 es Git grande Almacenamiento del archivo (LFS) (por GitHub).

Utiliza git-LFS (ver < a href = "https://git-lfs.github.com/" rel = "noreferrer"> git-lfs.github.com ) y probado con un servidor de apoyo que: LFS-test-servidor :
Puede almacenar metadatos sólo en el repositorio git, y el archivo grande en otro lugar.

https://cloud.githubusercontent.com/assets/1319791/7051226/c4570828-ddf4-11e4-87eb -8fc165e5ece4.gif

Tener un vistazo a git BUP que es una extensión de Git para almacenar grandes archivos binarios con elegancia en un Git repositorio.

Lo que quiere tenerlo como un submódulo, pero que no tendrá que preocuparse por el repositorio se vuelve más difícil de manejar. Uno de sus casos de uso de la muestra es el almacenamiento de imágenes de VM en Git.

En realidad no he visto mejores tasas de compresión, pero mis repositorios no tienen realmente grandes binarios en ellos.

Su kilometraje puede variar.

También puede utilizar git grasa . Me gusta que sólo depende de la Python y rsync . También es compatible con el flujo de trabajo Git usual, con los siguientes comandos auto explicativas:

git fat init
git fat push
git fat pull

Además, es necesario comprobar en un archivo .gitfat en su repositorio y modificar sus .gitattributes para especificar las extensiones de archivo que desea git fat de manejar.

Se agrega un binario utilizando el git add normal, que a su vez invoca git fat basado en reglas gitattributes.

Por último, tiene la ventaja de que el lugar en el que realmente se almacenan los binarios puede ser compartido a través de repositorios y usuarios y es compatible con cualquier cosa rsync hace.

ACTUALIZACIÓN: No utilizar git en grasa si usted está utilizando un puente Git-SVN. Que va a terminar la eliminación de los archivos binarios de su repositorio Subversion. Sin embargo, si usted está utilizando un repositorio Git puro, funciona muy bien.

Usaría submódulos (como Pat Notz) o dos repositorios distintos.Si modifica sus archivos binarios con demasiada frecuencia, intentaría minimizar el impacto del enorme repositorio que limpia el historial:

Tuve un problema muy similar hace varios meses:~21 GB de archivos MP3, sin clasificar (nombres incorrectos, ID3 incorrectos, no sé si me gusta ese archivo MP3 o no...) y replicados en tres computadoras.

Utilicé una unidad de disco duro externa con el repositorio principal de Git y la cloné en cada computadora.Luego, comencé a clasificarlos de la forma habitual (empujando, tirando, fusionando...eliminando y cambiando el nombre muchas veces).

Al final, solo tenía ~6 GB de archivos MP3 y ~83 GB en el directorio .git.solía git-write-tree y git-commit-tree para crear una nueva confirmación, sin ancestros de confirmación, y comenzó una nueva rama que apunta a esa confirmación.El "registro de git" para esa rama solo mostró una confirmación.

Luego, eliminé la rama anterior, conservé solo la nueva rama, eliminé los registros de referencia y ejecuté "git prune":después de eso, mis carpetas .git pesaban solo ~6 GB...

Podrías "purgar" el enorme repositorio de vez en cuando de la misma manera:Tus "git clones" serán más rápidos.

En mi opinión, si es probable que modificar a menudo esos archivos de gran tamaño, o si va a hacer un montón de git clone o git checkout, entonces debe considerar seriamente el uso de otro repositorio Git (o tal vez otra manera de acceder a esos archivos ).

Pero si se trabaja como lo hacemos, y si los archivos binarios no se modifican a menudo, a continuación, el primer clon / check out a ser largo, pero después de que debería ser tan rápido como desee (teniendo en cuenta a los usuarios seguir usando la primera repositorio clonado que tenían).

La solución que me gustaría proponer se basa en ramas huérfanas y un ligero abuso del mecanismo de etiquetas, en adelante denominado *Almacenamiento binario de etiquetas huérfanas. (OTABS)

TL;DR 12-01-2017 Si puede usar LFS de github o algún otro tercero, por supuesto debería hacerlo.Si no puedes, sigue leyendo.Tenga cuidado, esta solución es un truco y debe tratarse como tal.

Propiedades deseables de OTABS

  • es un puro idiota y solo git solución: hace el trabajo sin ningún software de terceros (como git-annex) o infraestructura de terceros (como LFS de github).
  • almacena los archivos binarios eficientemente, es decir.no infla el historial de su repositorio.
  • git pull y git fetch, incluido git fetch --all aún son ancho de banda eficiente, es decir.No todos los binarios grandes se extraen del control remoto de forma predeterminada.
  • funciona en ventanas.
  • almacena todo en un repositorio único de git.
  • permite supresión de binarios obsoletos (a diferencia de bup).

Propiedades indeseables de OTABS

  • hace git clone potencialmente ineficiente (pero no necesariamente, dependiendo de su uso).Si implementa esta solución, es posible que deba recomendar a sus colegas que utilicen git clone -b master --single-branch <url> en lugar de git clone.Esto se debe a que git clone por defecto literalmente clona completo repositorio, incluidas cosas en las que normalmente no querrías desperdiciar tu ancho de banda, como confirmaciones sin referencia.Tomado de Entonces 4811434.
  • hace git fetch <remote> --tags el ancho de banda es ineficiente, pero no necesariamente el almacenamiento es ineficiente.Siempre puedes aconsejar a tus compañeros que no lo utilicen.
  • tendrás que utilizar periódicamente un git gc truco para limpiar su repositorio de cualquier archivo que ya no desee.
  • no es tan eficiente como bup o git-bigfiles.Pero es, respectivamente, más adecuado para lo que estás intentando hacer y más disponible en el mercado.Es probable que tenga problemas con cientos de miles de archivos pequeños o con archivos de un rango de gigabytes, pero siga leyendo para encontrar soluciones alternativas.

Agregar los archivos binarios

Antes de comenzar, asegúrese de haber confirmado todos los cambios, que su árbol de trabajo esté actualizado y que su índice no contenga ningún cambio no confirmado.Podría ser una buena idea enviar todas sus sucursales locales a su control remoto (github, etc.) en caso de que ocurra algún desastre.

  1. Crea una nueva rama huérfana. git checkout --orphan binaryStuff hará el truco.Esto produce una rama que está completamente desconectada de cualquier otra rama, y ​​la primera confirmación que realizará en esta rama no tendrá padre, lo que la convertirá en una confirmación raíz.
  2. Limpia tu índice usando git rm --cached * .gitignore.
  3. Respire hondo y elimine todo el árbol de trabajo usando rm -fr * .gitignore.Interno .git directorio permanecerá intacto, porque el * el comodín no coincide.
  4. Copie en su VeryBigBinary.exe o en su VeryHeavyDirectory/.
  5. Agréguelo y confírmelo.
  6. Ahora se vuelve complicado: si lo introduces en el control remoto como una rama, todos tus desarrolladores lo descargarán la próxima vez que lo invoquen. git fetch obstruyendo su conexión.Puedes evitar esto presionando una etiqueta en lugar de una rama.Esto aún puede afectar el ancho de banda y el almacenamiento del sistema de archivos de su colega si tiene la costumbre de escribir git fetch <remote> --tags, pero sigue leyendo para encontrar una solución.Siga adelante y git tag 1.0.0bin
  7. Inserta tu etiqueta de huérfano git push <remote> 1.0.0bin.
  8. Para que nunca presiones tu rama binaria por accidente, puedes eliminarla git branch -D binaryStuff.Su confirmación no se marcará para la recolección de basura porque hay una etiqueta huérfana que apunta a ella. 1.0.0bin es suficiente para mantenerlo vivo.

Comprobando el archivo binario

  1. ¿Cómo puedo (o mis colegas) registrar VeryBigBinary.exe en el árbol de trabajo actual?Si su rama de trabajo actual es, por ejemplo, maestra, simplemente puede git checkout 1.0.0bin -- VeryBigBinary.exe.
  2. Esto fallará si no tienes la etiqueta de huérfano. 1.0.0bin descargado, en cuyo caso tendrás que git fetch <remote> 1.0.0bin antemano.
  3. Puedes agregar el VeryBigBinary.exe en tu maestría .gitignore, para que nadie en tu equipo contamine la historia principal del proyecto con el binario por accidente.

Eliminar completamente el archivo binario

Si decide purgar completamente VeryBigBinary.exe de su repositorio local, su repositorio remoto y los repositorios de sus colegas, simplemente puede:

  1. Eliminar la etiqueta huérfana en el control remoto git push <remote> :refs/tags/1.0.0bin
  2. Eliminar la etiqueta huérfana localmente (elimina todas las demás etiquetas sin referencia) git tag -l | xargs git tag -d && git fetch --tags.Tomado de Entonces 1841341 con ligera modificación.
  3. Utilice un truco de git gc para eliminar localmente su confirmación ahora sin referencia. git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@".También eliminará todas las demás confirmaciones sin referencia.Tomado de Entonces 1904860
  4. Si es posible, repite el truco de git gc en el control remoto.Es posible si usted mismo aloja su repositorio y puede que no sea posible con algunos proveedores de git, como github o en algunos entornos corporativos.Si está alojando con un proveedor que no le brinda acceso ssh al control remoto, déjelo así.Es posible que la infraestructura de su proveedor limpie su confirmación sin referencia a su debido tiempo.Si se encuentra en un entorno corporativo, puede aconsejar a su departamento de TI que ejecute un trabajo cron que recolecte basura en su control remoto una vez por semana aproximadamente.Si lo hacen o no, no tendrá ningún impacto en su equipo en términos de ancho de banda y almacenamiento, siempre y cuando aconseje a sus colegas que siempre git clone -b master --single-branch <url> en lugar de git clone.
  5. Todos sus colegas que quieran deshacerse de las etiquetas huérfanas obsoletas solo necesitan aplicar los pasos 2 y 3.
  6. Luego puede repetir los pasos 1-8 de Agregar los archivos binarios para crear una nueva etiqueta huérfana 2.0.0bin.Si le preocupa que sus colegas escriban git fetch <remote> --tags en realidad puedes nombrarlo de nuevo 1.0.0bin.Esto asegurará que la próxima vez que obtengan todas las etiquetas, las antiguas 1.0.0bin no se hará referencia a ellos y se marcará para la posterior recolección de basura (usando el paso 3).Cuando intentas sobrescribir una etiqueta en el control remoto tienes que usar -f como esto: git push -f <remote> <tagname>

Epílogo

  • OTABS no toca su maestro ni ninguna otra rama de código fuente/desarrollo.Los hashes de confirmación, todo el historial y el tamaño pequeño de estas ramas no se ven afectados.Si ya ha inflado su historial de código fuente con archivos binarios, tendrá que limpiarlo como un trabajo separado. este guión podría ser útil.

  • Confirmado para funcionar en Windows con git-bash.

  • Es una buena idea aplicar un conjunto de trics estándar para hacer que el almacenamiento de archivos binarios sea más eficiente.funcionamiento frecuente de git gc (sin ningún argumento adicional) hace que git optimice el almacenamiento subyacente de sus archivos mediante el uso de deltas binarios.Sin embargo, si es poco probable que sus archivos se mantengan similares de una confirmación a otra, puede desactivar los deltas binarios por completo.Además, como no tiene sentido comprimir archivos ya comprimidos o cifrados, como .zip, .jpg o .crypt, git le permite desactivar la compresión del almacenamiento subyacente.Desafortunadamente, es una configuración de todo o nada que también afecta su código fuente.

  • Es posible que desee crear secuencias de comandos de partes de OTABS para permitir un uso más rápido.En particular, los pasos de secuencia de comandos 2-3 de Eliminar completamente archivos binarios en una update git hook podría proporcionar una semántica convincente pero quizás peligrosa para git fetch ("buscar y eliminar todo lo que esté desactualizado").

  • Es posible que desee omitir el paso 4 de Eliminar completamente archivos binarios para mantener un historial completo de todos los cambios binarios en el control remoto a costa de la inflación del repositorio central.Los repositorios locales seguirán siendo eficientes con el tiempo.

  • En el mundo Java es posible combinar esta solución con maven --offline para crear una compilación fuera de línea reproducible almacenada completamente en su control de versiones (es más fácil con maven que con gradle).En el mundo de Golang, es factible aprovechar esta solución para administrar su GOPATH en lugar de go get.En el mundo Python, es posible combinar esto con virtualenv para producir un entorno de desarrollo autónomo sin depender de servidores PyPi para cada compilación desde cero.

  • Si sus archivos binarios cambian con mucha frecuencia, como los artefactos de compilación, podría ser una buena idea crear una solución que almacene las 5 versiones más recientes de los artefactos en las etiquetas huérfanas. monday_bin, tuesday_bin, ..., friday_bin, y también una etiqueta huérfana para cada versión. 1.7.8bin 2.0.0bin, etc.Puedes rotar el weekday_bin y eliminar archivos binarios antiguos diariamente.De esta manera obtienes lo mejor de dos mundos:te quedas con el completo historial de su código fuente, pero solo el importante historial de sus dependencias binarias.También es muy fácil obtener los archivos binarios para una etiqueta determinada. sin obteniendo el código fuente completo con toda su historia: git init && git remote add <name> <url> && git fetch <name> <tag> debería hacerlo por ti.

SVN parece manejar deltas binarios más eficiente que Git.

he tenido que decidir sobre un sistema de control de versiones de documentos (archivos JPEG, archivos PDF y archivos .odt). Acabo de probar la adición de un archivo JPEG y girándolo 90 grados cuatro veces (para comprobar la eficacia de los deltas binarios). repositorio de Git creció 400%. repositorio de subversion creció sólo un 11%.

Así que parece que SVN es mucho más eficiente con archivos binarios.

Así que mi elección es para el código fuente de Git y SVN para archivos binarios como documentación.

git clone --filter de Git 2.19 + clones poco profundas

Esta nueva opción con el tiempo podría llegar a ser la solución definitiva al problema de archivos binarios, si los desarrolladores de Git y GitHub y hacer que el usuario lo suficientemente amable (que posiblemente todavía no han alcanzado para submódulos por ejemplo).

Permite para buscar solamente en realidad los archivos y directorios que desea para el servidor, y se introdujo junto con un protocolo de extensión a distancia.

Con esto, podríamos hacer primero un clon sin profundidad, y luego automatizar la que blobs a buscar con el sistema de construcción para cada tipo de construcción.

Hay incluso ya una --filter=blob:limit<size> que permite limitar el tamaño máximo de gota a buscar.

he proporcionado un ejemplo detallado de cómo mínimo la función se parece a: ¿Cómo clonar un subdirectorio única de un repositorio Git?

  

Busco opinión de cómo manejar grandes archivos binarios en los que mi código fuente (aplicación web) es dependiente. ¿Cuáles son sus experiencias / pensamientos con respecto a esto?

Yo personalmente he encontrado con errores de sincronización con Git con algunos de mis anfitriones nube una vez que mis aplicaciones web binarios de datos muescas encima de la marca de 3 GB . Consideré BFT Repo Limpiador en el momento, pero se sentía como un truco. Desde entonces he empezado a sólo mantener archivos fuera del ámbito de Git, en lugar aprovechando herramientas construidas como Amazon S3 para la gestión de archivos, control de versiones y copias de seguridad.

  

¿Alguien tiene experiencia con múltiples repositorios Git y gestionarlos en un proyecto?

Sí. temas Hugo son administrados principalmente de esta manera. Es un poco kudgy, pero hace el trabajo.


Mi sugerencia es que elegir la herramienta adecuada para el trabajo . Si es para una empresa y estás gestión de su línea de código en GitHub pagar el dinero y el uso de Git-LFS. De lo contrario podría explorar más opciones creativas como descentralizado blockchain .

Las opciones adicionales a considerar incluyen Minio y s3cmd .

Tener un vistazo a camlistore . En realidad no es basado en Git, pero me resulta más apropiado para lo que tiene que hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top