2011-08-18 11 views
9

Ricerca di articoli, documentazione o conoscenza diretta di come diversi sistemi di controllo del codice sorgente differenziano (o rilevano) il tipo di file (binario rispetto al testo). Di particolare interesse è come Git lo fa contro Mercurial.Come i sistemi di controllo del codice sorgente diffondono i file binari da file di testo

Guardano: Estensioni file? Firme o contenuto di file (ad esempio, questo file è UTF8)? Un mix di cose?

+0

Sia Git che Mercurial sono open source, puoi guardare il codice e scoprire esattamente cosa fanno. –

+2

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

+0

possibile duplicato di http://stackoverflow.com/questions/6855712/git-treats-text-file-as-a-binary per la parte Git (senza tag) –

risposta

9

SVN:

La prima volta che aggiungere o importare un file in Subversion, il file viene esaminato per determinare se si tratta di un file binario. Attualmente, Subversion guarda solo i primi 1024 byte del file; se uno qualsiasi dei byte è zero, o se più del 15% non sono caratteri di stampa ASCII, allora Subversion chiama il file binario. Questa euristica potrebbe essere migliorata in futuro, comunque.

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

Git funziona in modo simile. Git di solito indovina correttamente se un blob contiene dati di testo o binari esaminando l'inizio del contenuto - Controlla ogni occorrenza di un byte zero (NUL "carattere") nei primi 8000 byte.

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

E da Git fonte:

#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

E @tonfa rende un buon punto che "Si noti inoltre che l'unico posto dove si prende cura di un file di testo di essere vs .binary è per la visualizzazione di diff e per l'unione, il formato di archiviazione non gli interessa ".

+0

+1 per l'estratto di git blob –

+0

Ottima risposta, grazie. – codenheim

+3

Git distingue tra testo e binario quando traduce le terminazioni di riga tra crlf e lf (autocrlf). Il codice è un po 'diverso: i file contenenti NUL byte sono binari. Inoltre, anche i file contenenti più di 1% di byte di controllo ASCII sono considerati binari. Vedi http://git.kernel.org/?p=git/git.git;a=blob;f=convert.c;hb=HEAD, funzione 'int is_binary'. –

4

Mercurial cerca alcune occorrenze del carattere nullo (\ 0) nel contenuto del file. Se ce n'è uno, il file viene considerato come binario. Altrimenti è considerato come testuale, a meno che non venga esplicitamente menzionato.

Immagino che git usi lo stesso approccio.

+2

Si noti inoltre che l'unico posto in cui si preoccupa che un file sia testo o binario sia per la visualizzazione delle differenze e per le operazioni di unione. Il formato di archiviazione non gli interessa. – tonfa

Problemi correlati