Bagaimana saya bisa membedakan file biner di git?

28

Untuk membuat file biner berbeda di git, saya berasumsi saya harus menyiapkan difftool.

Apa yang bekerja dengan difftools? Bagaimana Anda memasukkan parameter?

Nick Retallack
sumber
Output apa yang Anda harapkan dari alat diff file biner? File biner macam apa ini? Apakah ini sesuatu yang dapat dirender ke format teks dan kemudian dibandingkan?
Zoredache

Jawaban:

22

Anda dapat mengatur textconvopsi konfigurasi untuk tipe file. Lihat "Melakukan perbedaan teks dari file biner" di gitattributes (5) . Apa yang harus Anda gunakan tergantung pada jenis file.

Contoh 1 :

Katakanlah Anda ingin membedakan konten file zip. Dalam hal ini Anda harus meletakkan yang berikut dalam $ GIT_DIR / file config atau $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

Lain kali Anda meminta diff pada file zip dalam repo, itu akan memanggil unzip -vversi dan diff teks yang dihasilkan.

Contoh 2 :

Untuk file pdf Anda dapat menggunakan mis pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Contoh 3 :

Jika tidak ada utilitas informasi spesifik untuk tipe file, Anda dapat menggunakan misalnya hexdump(dilengkapi dengan FreeBSD dan OSX, juga tersedia di Linux):

[diff "bin"]
    textconv = hexdump -v -C
Roland Smith
sumber
Saya bisa diff dalam hex. Saya akan cukup senang mengetahui berapa banyak byte berbeda, atau pada posisi apa byte berbeda. Saya akhirnya menggunakan Hex Fiend dengan mengkloning repositori git saya sehingga saya bisa memeriksa kedua versi file tersebut, karena saya tidak tahu cara mendapatkan git untuk meluncurkan program.
Nick Retallack
@NickRetallack: lihat contoh yang ditambahkan.
Roland Smith
2
Saya menambahkan Contoh 3 ke konfigurasi git saya, tetapi ketika saya melakukan "git diff" itu masih memberi saya pesan singkat yang sama: "File biner a / file dan b / file berbeda"
Nick Retallack
1
Jika Anda ingin menggunakan libmagic, Anda harus melihat ke dalam kode sumber git untuk melihat apakah itu berfungsi ...
Roland Smith
5
Saya akhirnya berhasil, setelah menambahkan * .bin diff = bin ke .gitattributes saya
Justin Rowe
11

Jawaban dari Roland Smith sangat membantu tetapi saat ini tidak lengkap (lihat komentar) - ada dua bagian untuk ini.

Anda dapat mendefinisikan perintah diff baru di .git/configfile repositori atau ~/.gitconfigfile global pribadi Anda , misalnya perintah hex diff menggunakan hexdump:

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

Selanjutnya, Anda perlu menggunakan file repositori .gitattributesuntuk memberi tahu git file mana yang harus digunakan dengan perintah diff khusus ini:

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

Seperti halnya .gitignorefile, .gitattributesfile tersebut harus diperiksa ke dalam repositori Anda.

Dalam kasus saya, saya memiliki beberapa ekstensi file yang berbeda yang ingin saya perlakukan sebagai biner (mis. Hindari konversi akhir baris jika menggunakan git pada Windows), dan lihat juga perbedaannya melalui hexdump:

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

Lihat juga https://github.com/resin-io/etcher/pull/1367 untuk contoh lain mendefinisikan perintah hexdump diff untuk digunakan dengan file gambar.

peterjc
sumber
Anda dapat mengatur .gitattributesglobal juga (untuk mengikuti [diff]entri di global Anda .gitconfig). Jika Anda membuat .gitattributeslokal ke repo, maka pengguna harus mengubah .gitconfigpengaturan repo lokalnya karena alasan keamanan mereka tidak akan didorong ke remote. Bagaimanapun, setiap pengguna harus memperbarui file / konfigurasi lokal mereka untuk mengaktifkan perilaku ini. Di .gitconfigbawah [core]tambahkan attributesfile = c:/users/<username>/.gitattributesatau di mana pun Anda ingin menyimpannya jika Anda membuatnya global (perhatikan forwardslashes, bahkan di windows).
LightCC
10

Jika Anda ingin memaksa git untuk menampilkan file-file biner sebagai --textopsi penggunaan teks biasa seperti ini:

git diff --text
chestozo
sumber
-1

Di atas adalah cara komprehensif untuk melakukannya .. namun, jika Anda hanya perlu melakukannya untuk beberapa file, metode berikut adalah apa yang saya gunakan:

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

Di sini saya menggunakan vimdifftetapi Anda dapat menggunakan alat lain. Di atas dapat juga digabungkan menjadi skrip kecil jika Anda perlu melakukan ini berulang-ulang.

alpha_989
sumber
Tampaknya ini telah menghapus perubahan pada file saya (dan membuat file kosong di mana saya ingin versi yang berkomitmen untuk menjadi).
Erhannis