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

时间:2011-08-18 16:20:41

标签: git svn version-control mercurial

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

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

2 个答案:

答案 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);
 }

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

并且@tonfa提出了一个很好的观点,“另外请注意,它关注文件与文本与二进制文件的唯一关系是用于diplaying diff和进行合并。存储格式并不关心它。” / p>

答案 1 :(得分:4)

Mercurial会查找文件内容中出现的空字符(\ 0)。如果有,则该文件被视为二进制文件。除非明确提及,否则它被视为文本。

我猜git使用相同的方法。