流行的源代码控制系统如何区分二进制文件和文本文件

cod*_*eim 9 svn git version-control mercurial

寻找有关不同源控制系统如何区分(或检测)文件类型(二进制文本与文本)的文章,文档或直接知识.特别感兴趣的是Git如何与Mercurial合作.

他们看看:文件扩展名?文件签名或内容(即这个文件是UTF8)?各种各样的东西?

man*_*lds 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);
 }
Run Code Online (Sandbox Code Playgroud)

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

并且@tonfa提出了一个很好的观点,"还要注意,它关注文件与文本与二进制文件的唯一关系是用于diplaying diff,以及进行合并.存储格式并不关心它."

  • 当它转换crlf和lf(autocrlf)之间的行结尾时,Git区分文本和二进制.代码有一点不同:包含NUL字节的文件是二进制的.此外,包含超过1%ASCII控制字节的文件也被视为二进制文件.请参阅http://git.kernel.org/?p=git​​/git.git;a=blob;f=convert.c;hb=HEAD,函数`int is_binary`. (4认同)