Apakah git bagus dengan file biner?

99

Apakah git bagus dengan file biner?

Jika saya memiliki banyak file terkompresi yang dimodifikasi, dan banyak file terkompresi tidak pernah (atau hampir tidak pernah) diubah, apakah git akan menanganinya dengan baik? Misalnya, jika saya menyisipkan atau menghapus bagian tengah dan menyisipkan data di dekat bagian akhir, ia akan menyadarinya seperti halnya dengan teks?

Jika git tidak cocok dengan file biner, alat apa yang dapat saya pertimbangkan?

Trigonometri
sumber
1
sangat baik dengan biner - saya menggunakannya sendiri
tekknolagi
Itu benar. Anda dapat meletakkan / home Anda di bawah revisi git dan seharusnya bekerja dengan cukup baik.
Loïc Faure-Lacroix
1
Ini bukan inti dari pertanyaan, yang dengan jelas dicatat sebagai perhatian tentang apakah file biner telah dilakukan diff pada mereka (mungkin karena pembengkakan repositori dan alasan kinerja). Namun, saya tidak meremehkannya (dan tampaknya siapa pun yang melakukannya telah menghapusnya).
coreyward
1
Catatan: Anda sekarang memiliki git-lts, untuk menyimpan binari Anda di tempat lain: stackoverflow.com/a/29530784/6309
VonC
1
Apakah itu membengkak folder .git?
Nikhil

Jawaban:

48

Di luar kotak, git dapat dengan mudah menambahkan file biner ke indeksnya, dan juga menyimpannya dengan cara yang efisien kecuali jika Anda sering melakukan pembaruan pada file besar yang tidak dapat dikompresi.

Masalahnya dimulai ketika git perlu menghasilkan diff dan merge: git tidak dapat menghasilkan diff yang berarti, atau menggabungkan file biner dengan cara apa pun yang masuk akal. Jadi semua gabungan, rebases atau cherrypicks yang melibatkan perubahan ke file biner akan melibatkan Anda membuat resolusi konflik manual pada file biner itu.

Anda perlu memutuskan apakah perubahan file biner cukup langka sehingga Anda dapat hidup dengan pekerjaan manual tambahan yang mereka sebabkan dalam alur kerja git normal yang melibatkan penggabungan, rebas, cherrypicks.

ndim
sumber
26
Saya harus menunjukkan bahwa perubahan file biner bukanlah masalah, membuat perubahan di banyak tempat dan kemudian mencoba menggabungkannya.
Winston Ewert
15
git dapat menghasilkan perbedaan yang berarti. Sebuah diff yang dibuat dengan git diff --binaryakan dapat menambal file biner.
CB Bailey
46

Selain jawaban lainnya.

  • Anda dapat mengirim diff ke file biner menggunakan apa yang disebut format binary diff . Ini tidak dapat dibaca manusia, dan hanya dapat diterapkan jika Anda memiliki preimage yang tepat dalam repositori Anda, yaitu tanpa fuzz.
    Sebuah contoh:

    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
    
  • Anda dapat menggunakan textconv gitattribute untuk git diffmenunjukkan diff yang dapat dibaca manusia untuk file biner, atau bagian dari file biner. Misalnya untuk file * .jpg bisa jadi perbedaan informasi EXIF, untuk file PDF bisa jadi perbedaan representasi teksnya (pdf2text atau semacamnya).

HTH.

Jakub Narębski
sumber
5
Terima kasih banyak telah mengajari saya tentang gitattributes! Membuka dunia kemungkinan baru.
hermannloose
15

Jika Anda memiliki file biner yang sangat besar, Anda dapat menggunakan git-annex untuk menyimpan data di luar repositori. Lihat: http://git-annex.branchable.com/

John Gibb
sumber
6
Git-annex cukup bagus, tetapi mungkin lebih cocok untuk file yang tidak terlalu sering berubah , misalnya kumpulan file musik, gambar, PDF, ...
sr_
@sr_ tepatnya, begitu pula Git LFS. Tampaknya tidak ada sistem kontrol versi yang cocok untuk jenis kasus penggunaan ini sementara juga memiliki sistem terdistribusi sebagai basis (seperti Git).
Marc J. Schmidt
5

Saya tidak tahu alat apa pun yang mencoba menyimpan diff file biner untuk kontrol versi, tetapi perlu dicatat bahwa Git tidak melakukan ini bahkan untuk file teks. Git menyimpan file sebagai blob, dan Git melakukan perbedaan di antara file-file tersebut jika diperlukan.

Jika Anda ingin melakukan kontrol versi pada sesuatu seperti dokumen Photoshop / Illustrator, GridIron Flow mungkin bisa membantu Anda. Jika Anda mencoba untuk membuatnya tetap sinkron antar mesin, Dropbox atau Rsync dapat menanganinya, tetapi mereka tidak akan melakukan diff cerdas.

ke inti
sumber
1
Dari buku komunitas git ( book.git-scm.com/7_how_git_stores_objects.html ): "Untuk menghemat ruang tersebut, Git menggunakan file paket. Ini adalah format di mana Git hanya akan menyimpan bagian yang telah diubah di file kedua , dengan penunjuk ke file yang mirip dengannya. "
Wayne Conrad
2
Ya, itulah jika Anda menjalankan git gcuntuk melakukan pengumpulan sampah. Dari halaman yang sama: "Karena Git menyimpan setiap versi dari setiap file sebagai objek terpisah, ini bisa menjadi sangat tidak efisien. Bayangkan memiliki file yang panjangnya beberapa ribu baris dan mengubah satu baris. Git akan menyimpan file kedua secara keseluruhan, yang mana adalah pemborosan besar ruang. "
coreyward
2
Lumayan. git terkadang melakukan gc secara otomatis, setidaknya untuk proyek yang saya gunakan. Saya tidak tahu metrik apa yang digunakan untuk memutuskan kapan harus menjalankan - mungkin ada pohon yang tidak akan pernah (atau jarang) memicu gc.
Wayne Conrad
1
Dari halaman manual git gc: "Pengguna didorong untuk menjalankan tugas ini secara teratur dalam setiap repositori untuk mempertahankan pemanfaatan ruang disk yang baik dan kinerja operasi yang baik. Beberapa perintah git dapat secara otomatis menjalankan git gc; lihat tanda --auto di bawah untuk detailnya . "
Jacob Akkerboom
1
@Kennae Ada satu ton sekarang. Abstrak adalah satu, dan Kactus adalah yang lain yang menggunakan git di belakang layar.
coreyward
4

Yah, git bagus dengan binari. Tapi itu tidak akan menangani binari seperti file teks. Ini seperti Anda ingin menggabungkan file biner. Maksud saya, perbedaan di jpeg tidak akan pernah mengembalikan apa pun kepada Anda. Git bekerja sangat baik dengan file teks dan mungkin seburuk solusi lainnya dengan file biner!

Loïc Faure-Lacroix
sumber
2

jika Anda menginginkan solusi untuk pembuatan versi, Anda mungkin ingin mempertimbangkan git-lfs yang memiliki penunjuk ringan ke file Anda.

itu berarti ketika Anda mengkloning repo Anda, itu tidak mengunduh semua versi tetapi hanya yang diperiksa.

Berikut tutorial bagus tentang cara menggunakannya

danfromisrael
sumber