2011-08-18 10 views
9

Buscando artículos, documentación o conocimiento directo de cómo los diferentes sistemas de control de origen diferencian (o detectan) el tipo de archivo (binario vs. texto). De particular interés es cómo Git lo hace frente a Mercurial.¿Cómo distinguen los sistemas de control de fuente populares los archivos binarios de los archivos de texto

¿Miran en: extensiones de archivo? Firmas de archivos o contenido (es decir, ¿es este archivo UTF8)? ¿Una mezcla de cosas?

+0

Tanto Git como Mercurial son de código abierto, puedes mirar el código y descubrir exactamente lo que hacen. –

+2

http://mercurial.selenic.com/wiki/BinaryFiles – crowne

+0

posible duplicado del http://stackoverflow.com/questions/6855712/git-treats-text-file-as-a-binary demasiado localizado para la parte de Git (sin etiquetar) –

Respuesta

9

SVN:

La primera vez que agregar o importar un archivo en Subversion, el archivo es examinado para determinar si se trata de un archivo binario. Actualmente, Subversion solo mira los primeros 1024 bytes del archivo; si alguno de los bytes es cero, o si más del 15% no son caracteres de impresión ASCII, Subversion llama al archivo binario. Sin embargo, esta heurística podría mejorarse en el futuro.

http://subversion.apache.org/faq.html#binary-files

Git funciona de una manera similar. Por lo general, Git adivina correctamente si un blob contiene texto o datos binarios al examinar el comienzo del contenido. Comprueba si se produce un byte cero (NUL "carácter") en los primeros 8000 bytes.

http://git-scm.com/docs/gitattributes

Y a partir de Git fuente:

#define FIRST_FEW_BYTES 8000 
int buffer_is_binary(const char *ptr, unsigned long size) 
{ 
     if (FIRST_FEW_BYTES < size) 
       size = FIRST_FEW_BYTES; 
     return !!memchr(ptr, 0, size); 
} 

http://git.kernel.org/?p=git/git.git;a=blob;f=xdiff-interface.c;h=0e2c169227ad29b5bf546c6c1b97e1a1d8ed7409;hb=HEAD

Y @tonfa hace un buen punto de que "también en cuenta que el único lugar en el que se preocupa por ser un archivo de texto vs. .binary es para mostrar diff, y para hacer fusiones. El formato de almacenamiento no se preocupa por eso ".

+0

+1 para el extracto de blobs git –

+0

Excelente respuesta, gracias. – codenheim

+3

Git hace una distinción entre texto y binario cuando traduce terminaciones de línea entre crlf y lf (autocrlf). El código allí es un poco diferente: los archivos que contienen bytes NUL son binarios. Además, los archivos que contienen más de 1 por ciento de bytes de control ASCII también se consideran binarios. Ver http://git.kernel.org/?p=git/git.git;a=blob;f=convert.c;hb=HEAD, function 'int is_binary'. –

4

Mercurial busca alguna ocurrencia del carácter nulo (\ 0) en el contenido del archivo. Si hay uno, entonces el archivo se considera binario. De lo contrario, se considera textual, a menos que se mencione explícitamente.

Creo que git usa el mismo enfoque.

+2

También tenga en cuenta que el único lugar donde le importa que un archivo sea texto vs. binario es para mostrar diferencias y para realizar fusiones. El formato de almacenamiento no se preocupa por eso. – tonfa

Cuestiones relacionadas