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):
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:
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:
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:
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.
Respostas:
Você pode definir uma
textconv
opçã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.
Da próxima vez que você solicitar uma comparação em um arquivo zip em um repositório, ele
unzip -v
acessará a versão e o texto resultante.Exemplo 2 :
Para arquivos pdf, você pode usar, por exemplo
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):fonte
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/config
arquivo do seu repositório ou no seu~/.gitconfig
arquivo global pessoal , por exemplo, um comando hex diff usandohexdump
:Em seguida, você precisa usar o
.gitattributes
arquivo do repositório para informar ao git quais arquivos devem ser usados com este comando diff especial:Como o
.gitignore
arquivo, o.gitattributes
arquivo 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.
fonte
.gitattributes
globalmente (para acompanhar as[diff]
entradas no seu global.gitconfig
). Se você criar o.gitattributes
local para o repositório, o usuário precisará modificar suas.gitconfig
configuraçõ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.gitconfig
sub[core]
addattributesfile = c:/users/<username>/.gitattributes
ou onde você quiser armazená-lo, se você o tornar global (observe as barras para frente, mesmo nas janelas).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
--text
opção:fonte
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:
Aqui estou usando,
vimdiff
mas você pode usar qualquer outra ferramenta. O descrito acima também pode ser combinado em um pequeno script se você precisar fazer isso repetidamente.fonte