2011-01-15 30 views
64

¿Está bien con archivos binarios?¿Está bien con archivos binarios?

Si tengo una gran cantidad de archivos descomprimidos que se modifican, y muchos archivos comprimidos que nunca (o casi nunca) modificaron, ¿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 los archivos binarios, lo herramienta podría considerar?

+0

muy bueno con binario - lo uso yo mismo – tekknolagi

+0

Es un poco cierto. Puedes poner tu/home bajo revisión git y debería funcionar bastante bien. –

+0

Esto no está en el espíritu de la pregunta, que se señaló claramente como si estuviese preocupado por si los archivos binarios tenían diff en ellos (probablemente por hinchamiento del repositorio y por razones de rendimiento). Sin embargo, no lo rechacé (y parece que quien lo hizo lo eliminó). – coreyward

Respuesta

2

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

4

no sé de ninguna herramienta que tratan de almacenar las diferenciaciones de archivos binarios para el control de versiones, pero vale la pena señalar que Git no hace esto, incluso para archivos de texto. Git almacena archivos como blobs, y hace una diferencia entre ellos cuando es necesario.

Si está buscando hacer control de versiones en algo así como documentos de Photoshop/Illustrator, GridIron Flow podría hacer el truco para usted. Si intenta mantenerlos sincronizados entre las máquinas, Dropbox o Rsync pueden manejarlo, pero no van a hacer una diferencia inteligente.

+1

del libro de la comunidad git (http://book.git-scm.com/7_how_git_stores_objects. html): "Para ahorrar espacio, Git utiliza el archivo packet. Este es un formato en el que Git solo guardará la parte que ha cambiado en el segundo archivo, con un puntero al archivo similar". –

+2

Sí, eso es si/cuándo ejecutas 'git gc' para hacer la recolección de basura. Desde la misma página: "Dado que Git almacena cada versión de cada archivo como un objeto separado, puede volverse bastante ineficiente. Imagine tener un archivo de varios miles de líneas de largo y cambiar una sola línea. Git almacenará el segundo archivo en su totalidad, lo cual es una gran pérdida de espacio ". – coreyward

+2

Fair 'nuff. 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) desencadenarían gc. –

28

Fuera de la caja, git puede agregar fácilmente archivos binarios a su índice, y almacenarlos en una forma eficiente a menos que hacer cambios frecuentes en grandes archivos uncompressable.

Los problemas comienzan cuando git necesita generar diferencias y fusiones: git no puede generar diferencias significativas, o fusionar archivos binarios de cualquier manera que pueda tener sentido. Entonces, todas las fusiones, rebases o cherrypicks que impliquen un cambio a un archivo binario implicarán que usted haga una resolución de conflicto manual en ese archivo binario.

Debe decidir si los cambios del archivo binario son lo suficientemente poco frecuentes como para que pueda vivir con el trabajo manual adicional que causan en el flujo de trabajo de git normal que implica fusiones, rebases, cherrypicks.

+14

Tendría que señalar que los cambios en los archivos binarios no son un problema, hacer cambios en varios lugares y luego tratar de fusionarlos. –

+10

git puede generar diferencias significativas. Un diff creado con 'git diff --binary' podrá parchar archivos binarios. –

34

Además de otras respuestas.

  • Puede enviar un diff de archivo binario utilizando el denominado diff binario formato. No es legible por el ser humano, y solo se puede aplicar si tiene una preimagen exacta en su repositorio, es decir, sin ningún tipo de fuzz.
    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)[email protected]{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`[email protected] 
    [email protected]=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX 
    
  • Puede utilizar textconvgitattribute tener git diff espectáculo diff legible para los archivos binarios, o partes de los archivos binarios. Por ejemplo, para los archivos * .jpg puede ser 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.

+3

¡Muchas gracias por enseñarme acerca de los atributos de gita! Abre un nuevo mundo de posibilidades. – hermannloose

11

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

+2

Git-annex es bastante maravilloso, pero probablemente es más adecuado para archivos que * no cambian con tanta frecuencia *, p. una colección de archivos de música, imágenes, archivos PDF, ... –

+0

Como ese tipo dijo: ¡Git-annex es maravilloso! – dotancohen