2011-08-18 33 views
9

Tìm kiếm các bài viết, tài liệu hoặc kiến ​​thức đầu thẳng về cách các hệ thống kiểm soát nguồn khác nhau (hoặc phát hiện) loại tệp (nhị phân so với văn bản). Quan tâm đặc biệt là làm thế nào Git hiện nó vs Mercurial.Làm thế nào để các hệ thống kiểm soát nguồn phổ biến phân biệt các tệp nhị phân từ các tệp văn bản

Họ có xem: Phần mở rộng tệp không? Chữ ký hoặc nội dung tệp (ví dụ: tệp này là UTF8)? Một sự pha trộn của sự vật?

+0

Cả Git lẫn Mercurial đều là nguồn mở, bạn có thể xem mã và tìm hiểu chính xác những gì họ làm. –

+2

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

+0

bản sao có thể có của http://stackoverflow.com/questions/6855712/git-treats-text-file-as-a-binary được địa phương hóa quá mức cho phần Git (không được gắn thẻ) –

Trả lời

9

SVN:

Khi lần đầu tiên bạn thêm hoặc nhập tệp vào Subversion, tệp được kiểm tra để xác định đó có phải là tệp nhị phân hay không. Hiện tại, Subversion chỉ xem xét 1024 byte đầu tiên của tệp; nếu bất kỳ byte nào bằng 0 hoặc nếu nhiều hơn 15% không phải là ký tự in ASCII, thì Subversion gọi tệp nhị phân. Điều này có thể được cải thiện trong tương lai, tuy nhiên.

http://subversion.apache.org/faq.html#binary-files

Git hoạt động theo cách tương tự. Git thường đoán chính xác liệu một blob có chứa dữ liệu văn bản hoặc nhị phân hay không bằng cách kiểm tra phần đầu của nội dung - Nó kiểm tra bất kỳ sự xuất hiện nào của byte không (NUL "ký tự") trong 8000 byte đầu tiên.

http://git-scm.com/docs/gitattributes

Và từ Git nguồn:

#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

Và @tonfa làm cho một điểm tốt mà "Cũng lưu ý rằng nơi duy nhất nó quan tâm đến một tập tin văn bản được vs nhị phân là dành cho sự khác biệt về ngoại giao, và để thực hiện việc hợp nhất. Định dạng lưu trữ không quan tâm đến nó. "

+0

+1 cho trích xuất git blob –

+0

Câu trả lời hay, cảm ơn. – codenheim

+3

Git phân biệt giữa văn bản và nhị phân khi nó dịch kết thúc dòng giữa crlf và lf (autocrlf). Mã có một chút khác nhau: Các tệp chứa byte NUL là nhị phân. Ngoài ra, các tệp có chứa hơn 1 phần trăm byte kiểm soát ASCII cũng được coi là nhị phân. Xem http://git.kernel.org/?p=git/git.git;a=blob;f=convert.c;hb=HEAD, hàm 'int is_binary'. –

4

Hình ảnh của Mercurial cho một số lần xuất hiện của ký tự null (\ 0) trong nội dung của tệp. Nếu có, thì tệp được coi là nhị phân. Nếu không, nó được coi là văn bản, trừ khi được đề cập một cách rõ ràng.

Tôi đoán git sử dụng cùng một cách tiếp cận.

+2

Cũng lưu ý rằng nơi duy nhất mà nó quan tâm về một tệp là văn bản so với nhị phân là dành cho khác biệt ngoại giao và để thực hiện hợp nhất. Định dạng lưu trữ không quan tâm đến nó. – tonfa

Các vấn đề liên quan