คอมไพล์ดีกับไฟล์ไบนารีหรือไม่?


101

คอมไพล์ดีกับไฟล์ไบนารีหรือไม่?

หากฉันมีไฟล์ที่ไม่มีการบีบอัดจำนวนมากที่ถูกแก้ไขและไฟล์บีบอัดจำนวนมากไม่เคยแก้ไข (หรือแทบจะไม่เคยแก้ไขเลย) git จะจัดการได้ดีหรือไม่? ตัวอย่างเช่นถ้าฉันแทรกหรือลบตรงกลางและแทรกข้อมูลใกล้สุดมันจะสังเกตเห็นมันเหมือนกับข้อความ?

ถ้าคอมไพล์ไม่ดีกับไฟล์ไบนารีฉันจะพิจารณาใช้เครื่องมืออะไร?


1
ดีมากกับไบนารี - ฉันใช้เอง
tekknolagi

มันเป็นความจริง คุณสามารถวาง / home ของคุณภายใต้การแก้ไข git และมันควรจะทำงานได้ดี
Loïc Faure-Lacroix

1
สิ่งนี้ไม่ได้อยู่ในจิตวิญญาณของคำถามซึ่งระบุไว้อย่างชัดเจนว่ามีความกังวลว่าไฟล์ไบนารีได้ทำอะไรกับไฟล์เหล่านี้หรือไม่ (อาจเป็นเพราะเหตุผลด้านการขยายพื้นที่เก็บข้อมูลและประสิทธิภาพ) อย่างไรก็ตามฉันไม่ได้ลงคะแนน (และดูเหมือนว่าใครก็ตามที่ได้ลบมันออกไป)
coreyward

1
หมายเหตุ: ตอนนี้คุณมี git-lts เพื่อเก็บไบนารีของคุณไว้ที่อื่น: stackoverflow.com/a/29530784/6309
VonC

1
มันขยายโฟลเดอร์. git หรือไม่
Porcupine

คำตอบ:


50

git สามารถเพิ่มไฟล์ไบนารีลงในดัชนีได้อย่างง่ายดายนอกกรอบและยังจัดเก็บอย่างมีประสิทธิภาพเว้นแต่คุณจะทำการอัปเดตไฟล์ขนาดใหญ่ที่ไม่สามารถบีบอัดได้บ่อยๆ

ปัญหาเริ่มต้นเมื่อ git ต้องการสร้างความแตกต่างและผสาน: git ไม่สามารถสร้างความแตกต่างที่มีความหมายหรือรวมไฟล์ไบนารีในลักษณะใดก็ได้ที่สมเหตุสมผล ดังนั้นการรวม rebases หรือ cherrypicks ทั้งหมดที่เกี่ยวข้องกับการเปลี่ยนแปลงไฟล์ไบนารีจะเกี่ยวข้องกับการแก้ไขข้อขัดแย้งด้วยตนเองในไฟล์ไบนารีนั้น

คุณต้องตัดสินใจว่าการเปลี่ยนแปลงไฟล์ไบนารีนั้นหายากเพียงพอหรือไม่ที่คุณจะสามารถใช้งานได้ด้วยการทำงานแบบแมนนวลพิเศษที่ทำให้เกิดขึ้นในเวิร์กโฟลว์คอมไพล์ปกติที่เกี่ยวข้องกับการผสานการรีเบส


27
ฉันต้องชี้ให้เห็นว่าการเปลี่ยนแปลงไฟล์ไบนารีไม่ใช่ปัญหาทำการเปลี่ยนแปลงในหลาย ๆ ที่แล้วพยายามรวมเข้าด้วยกัน
Winston Ewert

15
git สามารถสร้างความแตกต่างที่มีความหมาย ความแตกต่างที่สร้างขึ้นgit diff --binaryจะสามารถแก้ไขไฟล์ไบนารีได้
CB Bailey

47

นอกเหนือจากคำตอบอื่น ๆ

  • คุณสามารถส่งไฟล์ Diff เป็นไบนารีโดยใช้รูปแบบที่เรียกว่าbinary diff มันไม่สามารถอ่านได้โดยมนุษย์และสามารถใช้ได้ก็ต่อเมื่อคุณมีภาพพรีอิมเมจที่แน่นอนในที่เก็บของคุณกล่าวคือไม่มีฟัซซ์
    ตัวอย่าง:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • คุณสามารถใช้textconv gitattributeเพื่อgit diffแสดงความแตกต่างที่มนุษย์อ่านได้สำหรับไฟล์ไบนารีหรือบางส่วนของไฟล์ไบนารี ตัวอย่างเช่นสำหรับไฟล์ * .jpg ข้อมูล EXIF ​​อาจแตกต่างกันสำหรับไฟล์ PDF อาจมีความแตกต่างระหว่างการแสดงข้อความ (pdf2text หรืออะไรทำนองนั้น)

HTH.


5
ขอบคุณมากสำหรับการสอนฉันเกี่ยวกับ gitattributes! เปิดโลกใหม่แห่งความเป็นไปได้
hermannloose

15

หากคุณมีไฟล์ไบนารีขนาดใหญ่มากคุณสามารถใช้ git-annex เพื่อจัดเก็บข้อมูลภายนอกที่เก็บได้ ตรวจสอบ: http://git-annex.branchable.com/


6
Git-annex นั้นยอดเยี่ยมมาก แต่น่าจะเหมาะกว่าสำหรับไฟล์ที่ไม่มีการเปลี่ยนแปลงบ่อยนักเช่นคอลเล็กชันไฟล์เพลงรูปภาพ PDF ...
sr_

@sr_ แน่นอน Git LFS ก็เช่นกัน ดูเหมือนว่าไม่มีระบบควบคุมเวอร์ชันที่เหมาะกับกรณีการใช้งานประเภทนี้ในขณะที่มีระบบกระจายเป็นฐาน (เช่น Git)
Marc J. Schmidt

5

ฉันไม่รู้เครื่องมือใด ๆ ที่พยายามจัดเก็บไฟล์ไบนารีที่แตกต่างกันสำหรับการควบคุมเวอร์ชัน แต่เป็นที่น่าสังเกตว่า Git ไม่ได้ทำสิ่งนี้แม้แต่กับไฟล์ข้อความ Git จัดเก็บไฟล์เป็น blobs และจะแตกต่างกันเมื่อต้องการ

หากคุณต้องการควบคุมเวอร์ชันในเอกสาร Photoshop / Illustrator GridIron Flowอาจช่วยคุณได้ หากคุณกำลังพยายามซิงค์ระหว่างเครื่อง Dropbox หรือ Rsync สามารถจัดการได้ แต่จะไม่ทำการกระจายข้อมูลอัจฉริยะ


1
จากสมุดชุมชน git ( book.git-scm.com/7_how_git_stores_objects.html ): "เพื่อประหยัดพื้นที่นั้น Git ใช้ packfile ซึ่งเป็นรูปแบบที่ Git จะบันทึกเฉพาะส่วนที่มีการเปลี่ยนแปลงในไฟล์ที่สอง โดยมีตัวชี้ไปที่ไฟล์จะคล้ายกับ "
Wayne Conrad

2
ใช่นั่นคือถ้า / เมื่อคุณวิ่งgit gcไปเก็บขยะ จากหน้าเดียวกัน: "เนื่องจาก Git เก็บไฟล์แต่ละเวอร์ชันเป็นออบเจ็กต์แยกกันจึงอาจไม่มีประสิทธิภาพเลยลองนึกภาพว่ามีไฟล์ยาวหลายพันบรรทัดและเปลี่ยนบรรทัดเดียว Git จะเก็บไฟล์ที่สองไว้อย่างครบถ้วนซึ่ง เป็นการเสียพื้นที่อย่างมาก "
coreyward

2
พอใช้ ' git ทำ gc โดยอัตโนมัติในขณะนี้อย่างน้อยสำหรับโครงการที่ฉันใช้สำหรับ ฉันไม่รู้ว่ามันใช้เมตริกอะไรในการตัดสินใจว่าจะเรียกใช้เมื่อใด - อาจมีต้นไม้ที่ไม่ (หรือแทบจะไม่) กระตุ้น gc
Wayne Conrad

1
จากหน้า man ของgit gc: "ขอแนะนำให้ผู้ใช้รันภารกิจนี้เป็นประจำภายในแต่ละที่เก็บเพื่อรักษาการใช้พื้นที่ดิสก์ที่ดีและประสิทธิภาพการทำงานที่ดีคำสั่ง git บางคำสั่งอาจเรียกใช้ git gc โดยอัตโนมัติโปรดดูแฟล็ก --auto ด้านล่างสำหรับรายละเอียด .”
Jacob Akkerboom

1
@KennyEvitt ตอนนี้มีตันแล้ว บทคัดย่อคือหนึ่งและแคคตัสเป็นอีกตัวหนึ่งที่ใช้คอมไพล์เบื้องหลัง
coreyward

4

คอมไพล์ดีกับไบนารี แต่จะไม่จัดการไบนารีเช่นไฟล์ข้อความ เหมือนกับว่าคุณต้องการรวมไฟล์ไบนารี ฉันหมายความว่าความแตกต่างของ jpeg จะไม่ส่งคืนอะไรให้คุณ Git ทำงานได้ดีกับไฟล์ข้อความและอาจแย่พอ ๆ กับโซลูชันอื่น ๆ ที่มีไฟล์ไบนารี!


2

หากคุณต้องการโซลูชันสำหรับการกำหนดเวอร์ชันคุณอาจต้องพิจารณาgit-lfsที่มีตัวชี้ที่มีน้ำหนักเบาไปยังไฟล์ของคุณ

หมายความว่าเมื่อคุณโคลน repo ของคุณจะไม่ดาวน์โหลดเวอร์ชันทั้งหมด แต่จะมีเพียงเวอร์ชันเดียวเท่านั้นที่เช็คเอาต์

นี่คือคำแนะนำที่ดีเกี่ยวกับวิธีการใช้งาน

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