ฉันจะกระจายไฟล์ไบนารีในคอมไพล์ได้อย่างไร?


28

เพื่อที่จะ diff ไฟล์ไบนารีในคอมไพล์ฉันคิดว่าฉันต้องตั้งค่า difftool

สิ่งที่แตกต่างกันในการทำงาน? คุณใส่พารามิเตอร์อย่างไร?


คุณต้องการเอาท์พุทประเภทใดจากเครื่องมือ diff ของไฟล์ไบนารี่ นี่คือไฟล์ไบนารีอะไร เป็นสิ่งที่สามารถแสดงผลในรูปแบบข้อความแล้วเปรียบเทียบได้หรือไม่
Zoredache

คำตอบ:


22

คุณสามารถตั้งค่าtextconvตัวเลือกการกำหนดค่าสำหรับชนิดไฟล์ โปรดดูที่ "การแสดง diffs ข้อความของไฟล์ไบนารี" ในgitattributes (5) สิ่งที่คุณควรใช้ขึ้นอยู่กับประเภทของไฟล์

ตัวอย่างที่ 1 :

สมมติว่าคุณต้องการกระจายเนื้อหาของไฟล์ zip ในกรณีดังกล่าวคุณควรใส่สิ่งต่อไปนี้ในไฟล์ $ GIT_DIR / config หรือ $ HOME / .gitconfig

[diff "zip"]
    textconv = unzip -v

ครั้งต่อไปที่คุณขอ diff บนไฟล์ zip ใน repo มันจะเรียกunzip -vทั้งสองเวอร์ชั่นและ diff ข้อความที่เกิดขึ้น

ตัวอย่างที่ 2 :

สำหรับไฟล์ pdf คุณสามารถใช้เช่นpdfinfo;

[diff "pdf"]
    textconv = pdfinfo

ตัวอย่างที่ 3 :

หากไม่มียูทิลิตี้ข้อมูลเฉพาะสำหรับประเภทไฟล์คุณสามารถใช้เช่นhexdump(มาพร้อมกับ FreeBSD และ OSX พร้อมใช้งานบน Linux):

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

ฉันสามารถกระจายมันในฐานสิบหก ฉันมีความสุขมากพอที่จะรู้ว่ามีกี่ไบต์ที่แตกต่างกันหรือตำแหน่งใดที่ไบต์ต่างกัน ฉันลงเอยด้วยการใช้ Hex Fiend โดยการโคลนที่เก็บ git ของฉันเพื่อที่ฉันจะได้ตรวจสอบไฟล์ทั้งสองรุ่นเพราะฉันไม่สามารถหาวิธีที่จะได้ git เพื่อเปิดโปรแกรม
Nick Retallack

@NickRetallack: ดูตัวอย่างที่เพิ่มเข้ามา
Roland Smith เมื่อ

2
ฉันเพิ่มตัวอย่างที่ 3 ในการตั้งค่า git ของฉัน แต่เมื่อฉันทำ "git diff" มันก็แค่ให้ข้อความสั้น ๆ กับฉันเหมือนกัน: "ไฟล์ไบนารี a / ไฟล์และ b / ไฟล์ต่างกัน"
Nick Retallack

1
หากคุณต้องการใช้ libmagic คุณจะต้องดูซอร์สโค้ด git เพื่อดูว่าใช้งานได้หรือไม่ ...
Roland Smith

5
ในที่สุดฉันก็สามารถใช้งานได้หลังจากเพิ่ม * .bin diff = bin ไปยัง. gitattributes ของฉัน
Justin Rowe

11

คำตอบจาก Roland Smith มีประโยชน์ แต่ในปัจจุบันไม่สมบูรณ์ (ดูความคิดเห็น) - มีสองส่วน

คุณสามารถกำหนดคำสั่ง diff ใหม่ใน.git/configไฟล์ของที่เก็บหรือ~/.gitconfigไฟล์โกลบอลส่วนบุคคลของคุณตัวอย่างเช่นคำสั่ง hex diff โดยใช้hexdump:

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

ถัดไปคุณต้องใช้.gitattributesไฟล์ของที่เก็บเพื่อบอก git ว่าควรใช้ไฟล์ใดกับคำสั่ง diff พิเศษนี้:

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

เช่นเดียวกับ.gitignoreไฟล์.gitattributesไฟล์ควรถูกตรวจสอบในที่เก็บของคุณ

ในกรณีของฉันฉันมีนามสกุลไฟล์ต่าง ๆ ที่ฉันต้องการใช้เป็นไบนารี่ (เช่นหลีกเลี่ยงการแปลงบรรทัดที่ลงท้ายด้วยการใช้ git บน Windows) และเห็นความแตกต่างผ่านhexdump:

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

ดูเพิ่มเติมที่https://github.com/resin-io/etcher/pull/1367สำหรับตัวอย่างอื่นที่กำหนดคำสั่ง hexdump diff สำหรับใช้กับไฟล์รูปภาพ


คุณสามารถตั้งค่า.gitattributesโกลบอลได้เช่นกัน (ไปพร้อมกับ[diff]รายการในโกลบอลของคุณ.gitconfig) หากคุณกำหนด.gitattributesให้โลโกเป็น repo ผู้ใช้จะต้องแก้ไข.gitconfigการตั้งค่า repo ในพื้นที่ของเขาเพราะเหตุผลด้านความปลอดภัยที่จะไม่ถูกผลักไปยังรีโมต ไม่ว่าจะด้วยวิธีใดผู้ใช้แต่ละคนต้องอัปเดตไฟล์ภายในเครื่อง / กำหนดค่าเพื่อเปิดใช้งานลักษณะการทำงานนี้ ใน.gitconfigภายใต้การ[core]เพิ่มattributesfile = c:/users/<username>/.gitattributesหรือทุกที่ที่คุณต้องการที่จะเก็บไว้ถ้าคุณทำมันทั่วโลก (ทราบ forwardslashes แม้ใน Windows)
LightCC

10

หากคุณต้องการบังคับให้คอมไพล์แสดงไฟล์ไบนารีต่างกันเป็น--textตัวเลือกการใช้ข้อความธรรมดาต่างๆ ดังนี้:

git diff --text

-1

ข้างต้นเป็นวิธีการที่ครอบคลุมในการทำ .. อย่างไรก็ตามถ้าคุณเพียงแค่ต้องทำบางไฟล์วิธีต่อไปนี้คือสิ่งที่ฉันใช้:

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

ที่นี่ฉันใช้vimdiffแต่คุณสามารถใช้เครื่องมืออื่น ๆ ข้างต้นสามารถรวมกันเป็นสคริปต์ขนาดเล็กหากคุณต้องการทำเช่นนี้ซ้ำแล้วซ้ำอีก


สิ่งนี้ดูเหมือนจะยกเลิกการเปลี่ยนแปลงในไฟล์ของฉัน (และสร้างไฟล์ว่างที่ฉันต้องการให้เวอร์ชันที่คอมมิทชันกำหนดไว้)
Erhannis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.