Come posso diff file binari in Git?


28

Per diffondere file binari in git, suppongo di dover impostare un difftool.

Cosa funzionano i difftools? Come si inseriscono i parametri?


Che tipo di output ti aspetti di ottenere da uno strumento diff di un file binario? Che tipo di file binario è questo? È qualcosa che può essere reso in un formato di testo e quindi confrontato?
Zoredache,

Risposte:


22

È possibile impostare textconvun'opzione di configurazione per un tipo di file. Vedere "Esecuzione di diff di testo di file binari" in gitattributes (5) . Quello che dovresti usare dipende dal tipo di file.

Esempio 1 :

Supponiamo che tu voglia diffondere il contenuto dei file zip. In tal caso, inserire quanto segue nel file $ GIT_DIR / config o $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

La prossima volta che chiedi un diff su un file zip in un repository, chiamerà unzip -vsu entrambe le versioni e diff il testo risultante.

Esempio 2 :

Per i file pdf è possibile utilizzare ad esempio pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Esempio 3 :

Se non esiste un'utilità di informazione specifica per un tipo di file, puoi ad esempio usare hexdump(viene fornito con FreeBSD e OSX, disponibile anche su Linux):

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

Potrei differirlo in esadecimale. Sarei abbastanza felice solo sapendo quanti byte sono diversi o in quali posizioni differiscono i byte. Ho finito per usare Hex Fiend clonando il mio repository git in modo da poter controllare entrambe le versioni del file, perché non riuscivo a capire come ottenere git per avviare il programma.
Nick Retallack,

@NickRetallack: vedi esempi aggiunti.
Roland Smith,

2
Ho aggiunto l'esempio 3 alla mia configurazione di git, ma quando faccio "git diff" mi dà ancora lo stesso breve messaggio: "I file binari a / file e b / file differiscono"
Nick Retallack

1
Se vuoi usare libmagic, dovrai esaminare il codice sorgente di git per vedere se funziona ...
Roland Smith

5
Finalmente sono riuscito a farlo funzionare, dopo aver aggiunto * .bin diff = bin al mio .gitattributes
Justin Rowe

11

La risposta di Roland Smith è stata utile ma al momento è incompleta (vedere i commenti): ci sono due parti in questo.

Puoi definire un nuovo comando diff nel .git/configfile del tuo repository o nel tuo ~/.gitconfigfile globale personale , ad esempio un comando diff esadecimale usando hexdump:

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

Successivamente, devi usare il .gitattributesfile del repository per dire a git quali file dovrebbero essere usati con questo speciale comando diff:

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

Come il .gitignorefile, il .gitattributesfile deve essere archiviato nel repository.

Nel mio caso ho diverse estensioni di file che voglio trattare come binarie (ad esempio, evitare conversioni di fine riga se si utilizza git su Windows) e vedere anche eventuali differenze tramite hexdump:

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

Vedi anche https://github.com/resin-io/etcher/pull/1367 per un altro esempio che definisce un comando diff hexdump da usare con i file di immagine.


Puoi anche impostare il .gitattributesglobale (per andare con le [diff]voci nel tuo globale .gitconfig). Se si effettua il .gitattributeslocale sul repository, l'utente dovrà modificare le .gitconfigimpostazioni del repository locale perché per motivi di sicurezza non verranno trasferite sul telecomando. Ad ogni modo, ogni utente deve aggiornare i propri file / configurazioni locali in qualche modo per abilitare questo comportamento. In .gitconfigsotto [core]aggiungi attributesfile = c:/users/<username>/.gitattributeso dove vuoi memorizzarlo se lo rendi globale (nota le ciglia, anche in Windows).
LightCC

10

Se vuoi forzare git a mostrare i file binari diff come diff di testo normale usa l' --textopzione in questo modo:

git diff --text

-1

Quanto sopra sono modi completi per farlo .. tuttavia, se hai solo bisogno di farlo per alcuni file, il seguente metodo è quello che uso:

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

Qui sto usando vimdiffma puoi usare qualsiasi altro strumento. Quanto sopra può anche essere combinato in un piccolo script se è necessario farlo più e più volte.


Questo sembra aver scartato le modifiche al mio file (e creato un file vuoto dove volevo che fosse la versione impegnata).
Erhannis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.