2011-08-18 16 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の重複可能性 –

答えて

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も注意してください」という良い点を作ること、それはファイルが対テキストであることを気に唯一の場所バイナリはdiffをdiplayし、マージするためのものです。ストレージフォーマットは気にしません。

+0

git blob抽出物のための+1 –

+0

すばらしい答え、ありがとう。 – codenheim

+3

gitは、行の終わりをcrlfとlf(autocrlf)の間で変換するときに、テキストとバイナリを区別します。コードには少し違いがあります: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

また、テキストとバイナリのファイルを気にする唯一の場所は、差分の表示とマージのためです。記憶形式はそれを気にしません。 – tonfa