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):
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:
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:
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:
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.
Jawaban:
Anda dapat mengatur
textconv
opsi 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.
Lain kali Anda meminta diff pada file zip dalam repo, itu akan memanggil
unzip -v
versi dan diff teks yang dihasilkan.Contoh 2 :
Untuk file pdf Anda dapat menggunakan mis
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):sumber
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/config
file repositori atau~/.gitconfig
file global pribadi Anda , misalnya perintah hex diff menggunakanhexdump
:Selanjutnya, Anda perlu menggunakan file repositori
.gitattributes
untuk memberi tahu git file mana yang harus digunakan dengan perintah diff khusus ini:Seperti halnya
.gitignore
file,.gitattributes
file 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.
sumber
.gitattributes
global juga (untuk mengikuti[diff]
entri di global Anda.gitconfig
). Jika Anda membuat.gitattributes
lokal ke repo, maka pengguna harus mengubah.gitconfig
pengaturan 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.gitconfig
bawah[core]
tambahkanattributesfile = c:/users/<username>/.gitattributes
atau di mana pun Anda ingin menyimpannya jika Anda membuatnya global (perhatikan forwardslashes, bahkan di windows).Jika Anda ingin memaksa git untuk menampilkan file-file biner sebagai
--text
opsi penggunaan teks biasa seperti ini:sumber
Di atas adalah cara komprehensif untuk melakukannya .. namun, jika Anda hanya perlu melakukannya untuk beberapa file, metode berikut adalah apa yang saya gunakan:
Di sini saya menggunakan
vimdiff
tetapi Anda dapat menggunakan alat lain. Di atas dapat juga digabungkan menjadi skrip kecil jika Anda perlu melakukan ini berulang-ulang.sumber