Como posso diferenciar arquivos binários no git?


28

Para diferenciar arquivos binários no git, presumo que precise configurar um difftool.

O difftools funciona? Como você coloca os parâmetros?


Que tipo de saída você espera obter de uma ferramenta diff de um arquivo binário? Que tipo de arquivo binário é esse? É algo que pode ser renderizado em um formato de texto e depois comparado?
precisa saber é o seguinte

Respostas:


22

Você pode definir uma textconvopção de configuração para um tipo de arquivo. Consulte "Executando diferenças de texto de arquivos binários" em gitattributes (5) . O que você deve usar depende do tipo de arquivo.

Exemplo 1 :

Digamos que você queira diferenciar o conteúdo dos arquivos zip. Nesse caso, você deve colocar o seguinte no arquivo $ GIT_DIR / config ou $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

Da próxima vez que você solicitar uma comparação em um arquivo zip em um repositório, ele unzip -vacessará a versão e o texto resultante.

Exemplo 2 :

Para arquivos pdf, você pode usar, por exemplo pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Exemplo 3 :

Se não houver um utilitário de informações específico para um tipo de arquivo, você pode, por exemplo, utilizá-lo hexdump(vem com FreeBSD e OSX, também disponível no Linux):

[diff "bin"]
    textconv = hexdump -v -C

Eu poderia diferenciá-lo em hexadecimal. Eu ficaria feliz em saber quantos bytes são diferentes ou em quais posições os bytes diferem. Acabei usando o Hex Fiend clonando meu repositório git para que eu pudesse conferir as duas versões do arquivo, porque não conseguia descobrir como fazer com que o git iniciasse o programa.
precisa saber é o seguinte

@NickRetallack: veja exemplos adicionados.
Roland Smith

2
Eu adicionei o Exemplo 3 à minha configuração do git, mas quando eu faço o "git diff", ele ainda me dá a mesma mensagem curta: "Arquivos binários a / file eb / file differ" "
Nick Retallack

1
Se você quiser usar libmagic, você tem que olhar para o código-fonte git para ver se isso funciona ...
Roland Smith

5
Eu finalmente consegui isso para trabalho, após a adição * .bin diff = bin aos meus .gitattributes
Justin Rowe

11

A resposta de Roland Smith foi útil, mas atualmente está incompleta (veja os comentários) - há duas partes nisso.

Você pode definir um novo comando diff no .git/configarquivo do seu repositório ou no seu ~/.gitconfigarquivo global pessoal , por exemplo, um comando hex diff usando hexdump:

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

Em seguida, você precisa usar o .gitattributesarquivo do repositório para informar ao git quais arquivos devem ser usados ​​com este comando diff especial:

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

Como o .gitignorearquivo, o .gitattributesarquivo deve ser verificado em seu repositório.

No meu caso, tenho várias extensões de arquivo diferentes que quero tratar como binárias (por exemplo, evite conversões de final de linha se estiver usando git no Windows) e também vejo diferenças através de hexdump:

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

Consulte também https://github.com/resin-io/etcher/pull/1367 para obter outro exemplo de definição de um comando diff hexdump para uso com arquivos de imagem.


Você também pode definir o .gitattributesglobalmente (para acompanhar as [diff]entradas no seu global .gitconfig). Se você criar o .gitattributeslocal para o repositório, o usuário precisará modificar suas .gitconfigconfigurações de repositório local porque, por motivos de segurança, eles não serão enviados ao controle remoto. De qualquer maneira, cada usuário precisa atualizar seus arquivos / configurações locais de alguma forma para ativar esse comportamento. Em .gitconfigsub [core]add attributesfile = c:/users/<username>/.gitattributesou onde você quiser armazená-lo, se você o tornar global (observe as barras para frente, mesmo nas janelas).
LightCC 01/11

10

Se você deseja forçar o git a mostrar a diferença de arquivos binários como uma diferença de texto sem formatação, use a seguinte --textopção:

git diff --text

-1

As opções acima são maneiras abrangentes de fazer isso. No entanto, se você só precisar fazer isso com alguns arquivos, o seguinte método é o que eu uso:

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

Aqui estou usando, vimdiffmas você pode usar qualquer outra ferramenta. O descrito acima também pode ser combinado em um pequeno script se você precisar fazer isso repetidamente.


Isso parece ter descartado as alterações no meu arquivo (e criado um arquivo vazio onde eu queria que a versão comprometida estivesse).
Erhannis 6/12/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.