Mengelola dan menyimpan file besar di Git

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Git membantu menjaga jejak kode sumber Anda tetap kecil karena perbedaan antara versi mudah dipilih dan kode mudah dikompresi. File besar yang tidak dikompresi dengan baik dan yang berubah sepenuhnya antara versi (seperti biner) menyajikan masalah saat disimpan di repositori Git Anda. Performa cepat Git berasal dari kemampuannya untuk mengatasi dan beralih ke semua versi file dari penyimpanan lokalnya.

Jika Anda memiliki file besar yang tidak dapat dibatasi dalam repositori Anda (seperti biner), Anda menyimpan salinan lengkap file-file tersebut di repositori Anda setiap kali Anda melakukan perubahan pada file tersebut. Jika banyak versi file ini ada di repositori Anda, mereka secara dramatis meningkatkan waktu untuk memeriksa, cabang, mengambil, dan mengkloning kode Anda.

Jenis file apa yang harus Anda simpan di Git?

Menerapkan kode sumber, bukan dependensi

Saat tim Anda bekerja dengan editor dan alat untuk membuat dan memperbarui file, Anda harus memasukkan file-file ini ke dalam Git sehingga tim Anda dapat menikmati manfaat alur kerja Git. Jangan menerapkan jenis file lain ke dalam repositori Anda: misalnya, DLL, file pustaka, dan dependensi lain yang tidak dibuat tim Anda tetapi kode Anda bergantung pada. Kirimkan file-file ini melalui manajemen paket ke sistem Anda.

Manajemen paket menggabungkan dependensi Anda dan menginstal file pada sistem Anda saat Anda menyebarkan paket. Paket di-versi untuk memastikan bahwa kode yang diuji dalam satu lingkungan berjalan sama di lingkungan lain, selama lingkungan memiliki paket yang diinstal yang sama.

Jangan menerapkan output

Jangan menerapkan biner, log, output pelacakan, atau data diagnostik dari build dan pengujian Anda. Ini adalah output dari kode Anda, bukan kode sumber itu sendiri. Bagikan log dan lacak informasi dengan tim Anda melalui alat pelacakan item kerja atau melalui berbagi file tim.

Menyimpan sumber biner kecil yang jarang diperbarui di Git

File sumber biner yang jarang diperbarui memiliki relatif sedikit versi yang diterapkan. Mereka tidak memakan banyak ruang jika ukuran file mereka kecil. Gambar untuk web, ikon, dan aset seni lainnya yang lebih kecil dapat termasuk dalam kategori ini. Lebih baik menyimpan file-file ini di Git dengan sisa sumber Anda sehingga tim Anda dapat menggunakan alur kerja yang konsisten.

Penting

Bahkan biner kecil dapat menyebabkan masalah jika sering diperbarui. Misalnya, 100 perubahan pada file biner 100 KB menggunakan penyimpanan sebanyak 10 perubahan pada biner 1-MB. Karena frekuensi pembaruan, biner yang lebih kecil akan memperlambat performa percabangan lebih sering daripada biner besar.

Jangan menerapkan aset biner besar yang sering diperbarui

Git mengelola satu versi utama file dan kemudian hanya menyimpan perbedaan dari versi tersebut, dalam proses yang dikenal sebagai deltifikasi. Deltifikasi dan kompresi file memungkinkan Git untuk menyimpan seluruh riwayat kode Anda di repositori lokal Anda. Biner besar biasanya berubah sepenuhnya antara versi dan sering kali sudah dikompresi. File-file ini sulit dikelola Git karena perbedaan antara versi besar.

Git harus menyimpan seluruh konten setiap versi file dan mengalami kesulitan menghemat ruang melalui deltifikasi dan kompresi. Menyimpan versi lengkap file-file ini menyebabkan ukuran repositori meningkat dari waktu ke waktu. Peningkatan ukuran repo mengurangi performa percabangan, meningkatkan waktu kloning, dan memperluas persyaratan penyimpanan.

Strategi untuk bekerja dengan file sumber biner besar

  • Jangan menerapkan arsip data terkompresi. Lebih baik untuk membongkar file dan menerapkan sumber yang berbeda. Biarkan Git menangani pemadatan data di repositori Anda.
  • Hindari menerapkan kode yang dikompilasi dan dependensi biner lainnya. Terapkan sumber dan buat dependensi, atau gunakan solusi manajemen paket untuk membuat versi dan menyediakan file-file ini ke sistem Anda.
  • Simpan konfigurasi dan data terstruktur lainnya dalam format teks biasa yang berbeda, seperti JSON.

Apa itu Git LFS?

Ketika Anda memiliki file sumber dengan perbedaan besar antara versi dan pembaruan yang sering, Anda dapat menggunakan Git Large File Storage (LFS) untuk mengelola jenis file ini. Git LFS adalah ekstensi untuk Git yang menyediakan data yang menjelaskan file besar dalam penerapan ke repositori Anda. Ini menyimpan konten file biner ke penyimpanan jarak jauh terpisah.

Saat Anda melakukan kloning dan beralih cabang di repositori Anda, Git LFS mengunduh versi yang benar dari penyimpanan jarak jauh tersebut. Alat pengembangan lokal Anda secara transparan bekerja dengan file seolah-olah mereka berkomitmen langsung ke repositori Anda.

Keuntungan

Manfaat Git LFS adalah tim Anda dapat menggunakan alur kerja Git end-to-end yang familier, apa pun file yang dibuat tim Anda. LFS menangani file besar untuk mencegahnya memengaruhi repositori keseluruhan. Selain itu, di versi 2.0, Git LFS mendukung penguncian file untuk membantu tim Anda mengerjakan aset besar yang tidak dapat dibedakan seperti video, suara, dan peta game.

Git LFS didukung sepenuhnya dan gratis di Layanan Azure DevOps. Untuk menggunakan LFS dengan Visual Studio, Anda memerlukan Visual Studio 2015 Update 2 atau yang lebih baru. Cukup ikuti instruksi untuk menginstal klien, menyiapkan pelacakan LFS untuk file di repositori lokal Anda, lalu dorong perubahan Anda ke Azure Repos.

Batasan

Git LFS memiliki beberapa kelemahan yang harus Anda pertimbangkan sebelum mengadopsinya:

  • Setiap klien Git yang digunakan tim Anda harus menginstal klien Git LFS dan memahami konfigurasi pelacakannya.
  • Jika klien Git LFS tidak diinstal dan dikonfigurasi dengan benar, Anda tidak akan melihat file biner yang dilakukan melalui Git LFS saat Anda mengkloning repositori Anda. Git akan mengunduh data yang menjelaskan file besar (yang dilakukan Git LFS ke repositori) dan bukan file biner. Menerapkan biner besar tanpa klien Git LFS yang diinstal akan mendorong biner ke repositori Anda.
  • Git tidak dapat menggabungkan perubahan dari dua versi berbeda file biner meskipun kedua versi memiliki induk yang sama. Jika dua orang mengerjakan file yang sama pada saat yang sama, mereka harus bekerja sama untuk merekonsiliasi perubahan mereka untuk menghindari penimpaan pekerjaan orang lain. Git LFS menyediakan penguncian file untuk membantu. Pengguna masih harus berhati-hati untuk selalu menarik salinan terbaru aset biner sebelum mulai bekerja.
  • Azure Repos saat ini tidak mendukung penggunaan Secure Shell (SSH) dalam repositori dengan file terlacak Git LFS.
  • Jika pengguna menyeret file biner melalui antarmuka web ke dalam repositori yang dikonfigurasi untuk Git LFS, biner berkomitmen untuk repositori --bukan pointer yang akan dilakukan melalui klien Git LFS.
  • Meskipun tidak ada pembatasan ukuran file yang ketat, ruang kosong server yang tersedia dan beban kerja saat ini dapat membatasi performa dan fungsionalitas.
  • Batas waktu untuk satu unggahan file adalah satu jam.

Format file

File yang ditulis ke dalam repositori Anda untuk file terlacak Git LFS memiliki beberapa baris dengan pasangan kunci/nilai pada setiap baris:

version https://git-lfs.github.com/spec/v1
oid a747cfbbef63fc0a3f5ffca332ae486ee7bf77c1d1b9b2de02e261ef97d085fe
size 4923023

Catatan

URL GitHub yang disertakan untuk nilai versi hanya menentukan jenis file penunjuk LFS. Ini bukan tautan ke file biner Anda.

Masalah umum

Jika Anda menggunakan versi LFS yang lebih lama dari 2.4.0 dengan Azure DevOps Server, langkah penyiapan tambahan diperlukan untuk mengautentikasi melalui NTLM alih-alih Kerberos. Langkah ini tidak lagi diperlukan pada LFS 2.4.0, dan kami sangat menyarankan Anda meningkatkan.