¿Es bueno git con archivos binarios?

99

¿Es bueno git con archivos binarios?

Si tengo muchos archivos sin comprimir que se están modificando y muchos archivos comprimidos nunca (o casi nunca) se modifican, ¿git lo manejaría bien? Por ejemplo, si inserto o elimino el medio e inserto datos cerca del final, ¿lo notará como lo hace con el texto?

Si git no es bueno con archivos binarios, ¿qué herramienta debería considerar?

Trigonometría
fuente
1
muy bueno con binario - lo uso yo mismo
tekknolagi
Es algo cierto. Puedes poner tu / home bajo revisión de git y debería funcionar bastante bien.
Loïc Faure-Lacroix
1
Esto no está en el espíritu de la pregunta, que se notó claramente como una preocupación acerca de si los archivos binarios tenían diferencias en ellos (probablemente por problemas de rendimiento del repositorio). Sin embargo, no lo rechacé (y parece que quien lo hizo lo ha eliminado).
coreyward
1
Nota: ahora tiene git-lts, para almacenar sus binarios en otro lugar: stackoverflow.com/a/29530784/6309
VonC
1
¿Hincha la carpeta .git?
Nikhil

Respuestas:

48

Fuera de la caja, git puede agregar fácilmente archivos binarios a su índice y también almacenarlos de manera eficiente a menos que realice actualizaciones frecuentes en archivos grandes no comprimibles.

Los problemas comienzan cuando git necesita generar diferencias y fusiones: git no puede generar diferencias significativas ni fusionar archivos binarios de ninguna manera que tenga sentido. Entonces, todas las fusiones, rebases o selecciones que involucran un cambio en un archivo binario implicarán que realice una resolución manual de conflictos en ese archivo binario.

Debe decidir si los cambios en el archivo binario son lo suficientemente raros como para poder vivir con el trabajo manual adicional que causan en el flujo de trabajo normal de git que involucra fusiones, rebases, selecciones.

ndim
fuente
26
Debo señalar que los cambios en los archivos binarios no son un problema, hacer cambios en varios lugares y luego intentar fusionarlos sí lo es.
Winston Ewert
15
git puede generar diferencias significativas. Un diff creado con git diff --binarypodrá parchear archivos binarios.
CB Bailey
46

Además de otras respuestas.

  • Puede enviar una diferencia a un archivo binario utilizando el llamado formato de diferencia binaria . No es legible por humanos, y solo se puede aplicar si tiene una preimagen exacta en su repositorio, es decir, sin ningún problema.
    Un ejemplo:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • Puede usar textconv gitattribute para git diffmostrar diferencias legibles por humanos para archivos binarios o partes de archivos binarios. Por ejemplo, para archivos * .jpg puede haber una diferencia en la información EXIF, para los archivos PDF puede ser una diferencia entre su representación de texto (pdf2text o algo así).

HTH.

Jakub Narębski
fuente
5
¡Muchísimas gracias por enseñarme sobre gitattributes! Abre un nuevo mundo de posibilidades.
hermannloose
15

Si tiene archivos binarios realmente grandes, puede usar git-Annex para almacenar los datos fuera del repositorio. Consulte: http://git-annex.branchable.com/

John Gibb
fuente
6
Git-Annex es bastante maravilloso, pero probablemente más adecuado para archivos que no cambian con
tanta
@sr_ exactamente, también lo hace Git LFS. Parece que no existe un sistema de control de versiones adecuado para este tipo de casos de uso, mientras que también tiene un sistema distribuido como base (como Git).
Marc J. Schmidt
5

No conozco ninguna herramienta que intente almacenar diferencias de archivos binarios para el control de versiones, pero vale la pena señalar que Git no hace esto ni siquiera para archivos de texto. Git almacena archivos como blobs y hace una diferencia entre ellos cuando es necesario.

Si está buscando hacer un control de versiones en algo como documentos de Photoshop / Illustrator, GridIron Flow podría ser el truco para usted. Si está tratando de mantenerlos sincronizados entre máquinas, Dropbox o Rsync pueden manejarlo, pero no van a hacer diferencias inteligentes.

coreyward
fuente
1
Del libro de la comunidad de git ( book.git-scm.com/7_how_git_stores_objects.html ): "Para guardar ese espacio, Git utiliza el archivo de paquete. Este es un formato en el que Git solo guardará la parte que ha cambiado en el segundo archivo , con un puntero al archivo al que es similar ".
Wayne Conrad
2
Sí, eso es si / cuando corres git gcpara hacer la recolección de basura. De la misma página: "Dado que Git almacena cada versión de cada archivo como un objeto separado, puede volverse bastante ineficiente. Imagínese tener un archivo de varios miles de líneas y cambiar una sola línea. Git almacenará el segundo archivo en su totalidad, lo que es una gran pérdida de espacio ".
coreyward
2
Justo no. git hace gc automáticamente de vez en cuando, al menos para el proyecto para el que lo uso. No sé qué métrica usa para decidir cuándo ejecutar; tal vez haya árboles que nunca (o rara vez) activarían gc.
Wayne Conrad
1
De la página de manual de git gc: "Se anima a los usuarios a ejecutar esta tarea de forma regular dentro de cada repositorio para mantener una buena utilización del espacio en disco y un buen rendimiento operativo. Algunos comandos de git pueden ejecutar automáticamente git gc; consulte la marca --auto a continuación para obtener más detalles . "
Jacob Akkerboom
1
@KennyEvitt Ahora hay un montón. Abstract es uno, y Kactus es otro que usa git detrás de escena.
coreyward
4

Bueno, git es bueno con los binarios. Pero no manejará binarios como archivos de texto. Es como si quisieras fusionar archivos binarios. Quiero decir, una diferencia en un jpeg nunca te devolverá nada. Git funciona muy bien con archivos de texto y probablemente tan mal como cualquier otra solución con archivos binarios.

Loïc Faure-Lacroix
fuente
2

si desea una solución para el control de versiones, puede considerar git-lfs que tiene un puntero ligero a su archivo.

significa que cuando clona su repositorio, no descarga todas las versiones, sino solo la que está extraída.

Aquí hay un buen tutorial de cómo usarlo.

danfromisrael
fuente