尋找不同源代碼管理系統如何區分(或檢測)文件類型(二進制文本或文本)的文章,文檔或直接瞭解。特別感興趣的是Git如何與Mercurial進行比較。流行的源代碼管理系統如何區分二進制文件和文本文件
看不明文: 文件的擴展名? 文件簽名或內容(即該文件是UTF8)? 混合的東西?
尋找不同源代碼管理系統如何區分(或檢測)文件類型(二進制文本或文本)的文章,文檔或直接瞭解。特別感興趣的是Git如何與Mercurial進行比較。流行的源代碼管理系統如何區分二進制文件和文本文件
看不明文: 文件的擴展名? 文件簽名或內容(即該文件是UTF8)? 混合的東西?
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);
}
而且@tonfa使得一個好點的是「還指出,如果它關心一個文件是文本VS唯一的地方。binary是用於擴展diff,用於合併,存儲格式不關心它。「
+1爲git blob extract –
很好的答案,謝謝。 – codenheim
當翻譯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'。 –
Mercurial查找文件內容中出現的空字符(\ 0)。如果有一個,那麼該文件被視爲二進制文件。否則它被認爲是文本的,除非明確提及。
我想git使用相同的方法。
另請注意,它關心的文件是文本還是二進制文件的唯一地方是用於dip diff和合並。存儲格式不關心它。 – tonfa
Git和Mercurial都是開源的,您可以查看代碼並找出它們的功能。 –
http://mercurial.selenic.com/wiki/BinaryFiles – crowne
Git部分可能出現過度本地化的http://stackoverflow.com/questions/6855712/git-treats-text-file-as-a-binary (untagged) –