¿Cómo diferencian los sistemas de control de fuente populares los files binarys de los files de text?

Buscando artículos, documentation o conocimiento directo sobre cómo los diferentes sistemas de control de fonts diferencian (o detectan) el tipo de file (binary vs. text). De particular interés es cómo Git lo hace frente a Mercurial.

¿Miran: extensiones de files? Firmas de files o contenido (es decir, ¿este es el file UTF8)? Una mezcla de cosas?

SVN:

Cuando primero agrega o importa un file en Subversion, el file se examina para determinar si se trata de un file binary. Actualmente, Subversion solo mira los primeros 1024 bytes del file; si alguno de los bytes es cero, o si más del 15% no son caracteres de printing ASCII, Subversion llama al file binary. Sin embargo, esta heurística podría mejorarse en el futuro.

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

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

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

Y de la fuente de Git:

#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 comentario que "También tenga en count que el único lugar donde le importa que un file sea text vs. binary es para mostrar diferencias y hacer fusiones. El formatting de almacenamiento no se preocupa por eso".

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

Creo que git usa el mismo enfoque.