2011-08-18 82 views
9

尋找不同源代碼管理系統如何區分(或檢測)文件類型(二進制文本或文本)的文章,文檔或直接瞭解。特別感興趣的是Git如何與Mercurial進行比較。流行的源代碼管理系統如何區分二進制文件和文本文件

看不明文: 文件的擴展名? 文件簽名或內容(即該文件是UTF8)? 混合的東西?

+0

Git和Mercurial都是開源的,您可以查看代碼並找出它們的功能。 –

+2

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

+0

Git部分可能出現過度本地化的http://stackoverflow.com/questions/6855712/git-treats-text-file-as-a-binary (untagged) –

回答

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

而且從混帳來源:

#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使得一個好點的是「還指出,如果它關心一個文件是文本VS唯一的地方。binary是用於擴展diff,用於合併,存儲格式不關心它。「

+0

+1爲git blob extract –

+0

很好的答案,謝謝。 – codenheim

+3

當翻譯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

Mercurial查找文件內容中出現的空字符(\ 0)。如果有一個,那麼該文件被視爲二進制文件。否則它被認爲是文本的,除非明確提及。

我想git使用相同的方法。

+2

另請注意,它關心的文件是文本還是二進制文件的唯一地方是用於dip diff和合並。存儲格式不關心它。 – tonfa

相關問題