寻找有关不同源控制系统如何区分(或检测)文件类型(二进制文本与文本)的文章,文档或直接知识。特别感兴趣的是Git如何与Mercurial合作。
他们看看: 文件扩展名? 文件签名或内容(即这个文件是UTF8)? 各种各样的东西?
答案 0 :(得分:9)
SVN:
首次向Subversion添加或导入文件时,将检查该文件以确定它是否为二进制文件。目前,Subversion只查看文件的前1024个字节;如果任何字节为零,或者如果超过15%不是ASCII打印字符,则Subversion调用文件二进制文件。但是,这种启发式方法在未来可能会有所改进。
http://subversion.apache.org/faq.html#binary-files
Git以类似的方式工作。 Git通常通过检查内容的开头来正确猜测blob是否包含文本或二进制数据 - 它检查前8000字节中是否出现零字节(NUL“字符”)。
http://git-scm.com/docs/gitattributes
来自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);
}
并且@tonfa提出了一个很好的观点,“另外请注意,它关注文件与文本与二进制文件的唯一关系是用于diplaying diff和进行合并。存储格式并不关心它。” / p>
答案 1 :(得分:4)
Mercurial会查找文件内容中出现的空字符(\ 0)。如果有,则该文件被视为二进制文件。除非明确提及,否则它被视为文本。
我猜git使用相同的方法。