Como Verificar se um Arquivo é Binário no Git

GitBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como determinar se um arquivo é considerado binário pelo Git. Exploraremos dois métodos: usando o comando git diff --numstat para observar como o Git resume as alterações e utilizando o comando padrão do Linux file para identificar o tipo de arquivo. Ao final deste laboratório, você entenderá como o Git distingue entre arquivos de texto e binários e como verificar essa distinção por conta própria.

Usar git diff --numstat para Verificar

Nesta etapa, exploraremos como usar git diff --numstat para entender as alterações entre diferentes versões de seus arquivos. Este comando fornece um resumo das alterações, mostrando o número de linhas adicionadas e excluídas para cada arquivo.

Primeiro, vamos garantir que estamos no diretório do nosso projeto. Abra seu terminal e navegue até o diretório my-time-machine:

cd ~/project/my-time-machine

Agora, vamos fazer uma alteração no nosso arquivo message.txt. Adicionaremos uma nova linha a ele:

echo "Hello, Past Me" >> message.txt

O operador >> anexa o texto ao arquivo existente, em vez de sobrescrevê-lo.

Vamos verificar o status do nosso repositório novamente:

git status

Você deve ver que message.txt foi modificado:

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   message.txt

no changes added to commit but untracked files present (use "git add" to track)

Agora, vamos usar git diff --numstat para ver o resumo das alterações que fizemos:

git diff --numstat

A saída deve ser semelhante a esta:

1       0       message.txt

Esta saída nos diz que em message.txt, 1 linha foi adicionada e 0 linhas foram excluídas. Esta é uma maneira concisa de ver o impacto geral de suas alterações em vários arquivos.

Entender git diff --numstat é útil quando você deseja uma visão geral rápida de quanto um arquivo foi alterado sem ver o conteúdo exato das alterações. É particularmente útil ao revisar alterações feitas por outras pessoas ou quando você deseja ver a escala das modificações em seu próprio trabalho.

Executar o Comando file no Arquivo

Nesta etapa, aprenderemos sobre o comando file, uma ferramenta útil no Linux que informa o tipo de um arquivo. Isso é importante porque o Git lida com arquivos de texto e arquivos binários de maneira diferente.

Primeiro, certifique-se de estar no diretório do seu projeto:

cd ~/project/my-time-machine

Agora, vamos usar o comando file no nosso arquivo message.txt:

file message.txt

Você deve ver uma saída semelhante a esta:

message.txt: ASCII text

Isso nos diz que message.txt é um arquivo de texto. O Git foi projetado para funcionar muito bem com arquivos de texto porque pode rastrear facilmente as alterações linha por linha.

E quanto a outros tipos de arquivos? Vamos criar um arquivo binário simples. Podemos usar o comando head para pegar os primeiros bytes de um arquivo do sistema e redirecioná-los para um novo arquivo em nosso projeto. Por exemplo, vamos criar um pequeno arquivo "binário" a partir do executável /bin/ls:

head -c 1024 /bin/ls > binary_file

Este comando pega os primeiros 1024 bytes do arquivo /bin/ls e o salva como binary_file no seu diretório atual.

Agora, vamos usar o comando file neste novo arquivo:

file binary_file

A saída será diferente, indicando que é um arquivo binário. Pode ser algo parecido com isto:

binary_file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, BuildID[sha1]=..., stripped

Esta saída confirma que binary_file não é um arquivo de texto simples. O Git trata os arquivos binários de maneira diferente porque não pode determinar facilmente as alterações linha por linha. Em vez disso, ele normalmente armazena o arquivo binário inteiro para cada versão.

Compreender a diferença entre arquivos de texto e binários é crucial ao trabalhar com o Git, especialmente ao lidar com arquivos como imagens, programas compilados ou arquivos compactados. Os poderosos recursos de diffing e merging do Git são projetados principalmente para arquivos de texto.

Testar Arquivos de Texto vs. Binários

Nesta etapa, veremos como o Git lida com as alterações em arquivos de texto versus arquivos binários. Isso destacará por que os recursos de diffing do Git são projetados principalmente para texto.

Primeiro, certifique-se de estar no diretório do seu projeto:

cd ~/project/my-time-machine

Já temos nosso message.txt (arquivo de texto) e binary_file. Vamos fazer outra alteração em message.txt:

echo "Another line for the future" >> message.txt

Agora, vamos adicionar ambos os arquivos à área de staging e confirmá-los (commit). Primeiro, adicione os arquivos:

git add message.txt binary_file

Verifique o status para confirmar que ambos os arquivos estão na área de staging:

git status

Você deve ver ambos os arquivos listados em "Changes to be committed":

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   message.txt
        new file:   binary_file

Agora, vamos confirmar (commit) essas alterações:

git commit -m "Add binary file and update message"

Você verá a saída confirmando o commit, incluindo as alterações em ambos os arquivos:

[master ...] Add binary file and update message
 2 files changed, 2 insertions(+)
 create mode 100644 binary_file

Agora, vamos fazer uma pequena alteração no binary_file. Podemos anexar um único byte a ele:

echo -n "a" >> binary_file

A flag -n impede que o echo adicione um caractere de nova linha.

Verifique o status novamente:

git status

O Git mostrará que binary_file foi modificado:

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   binary_file

no changes added to commit but untracked files present (use "git add" to track)

Agora, vamos tentar ver a diferença usando git diff:

git diff

Em vez de mostrar as alterações linha por linha, o Git provavelmente informará que o arquivo binário difere:

warning: LF will be replaced by CRLF in binary_file.
The file has no newline at the end of the file.
diff --git a/binary_file b/binary_file
index ... ...
Binary files a/binary_file and b/binary_file differ

Esta saída mostra claramente que o Git não tenta mostrar as alterações detalhadas dentro do arquivo binário. Ele simplesmente afirma que os arquivos são diferentes. Esta é uma diferença fundamental na forma como o Git lida com arquivos de texto versus binários. Para arquivos de texto, o Git pode mostrar exatamente quais linhas foram adicionadas, removidas ou modificadas. Para arquivos binários, ele só pode informar que uma alteração ocorreu.

Esta etapa demonstra por que as poderosas ferramentas de diffing e merging do Git são mais eficazes com conteúdo baseado em texto, o que é comum em código-fonte e arquivos de configuração.

Resumo

Neste laboratório, aprendemos como determinar se um arquivo é binário no Git. Exploramos dois métodos principais. Primeiro, usamos o comando git diff --numstat para examinar as alterações entre as versões dos arquivos, observando como ele resume as adições e exclusões, o que pode indicar indiretamente a natureza do arquivo com base na escala das alterações.

Em segundo lugar, aprendemos sobre o comando file, um utilitário Linux padrão, e como usá-lo para identificar diretamente o tipo de um arquivo, distinguindo entre formatos de texto e binários. Essa abordagem direta é crucial porque o tratamento de arquivos binários pelo Git difere significativamente dos arquivos de texto.