Git

Git LFS

Git LFS
Git telah menjadi sistem kontrol versi de facto untuk pengembang perangkat lunak di seluruh dunia. Sistem kontrol versi sumber terbuka dan terdistribusi ini lebih cepat daripada pesaingnya. Mudah digunakan untuk percabangan dan penggabungan kode. Namun, ia memiliki masalah kinerja dengan file biner besar. Git Large File Storage (LFS) dikembangkan untuk mengatasi masalah ini.

Masalah File Besar di Git

Secara tradisional, perusahaan dan institusi tertentu telah menjauh dari Git karena inefisiensi dalam penanganan file biner yang besar. Pengembang video game dan perusahaan media harus berurusan dengan tekstur kompleks, video full-motion, dan file audio berkualitas tinggi. Lembaga penelitian harus melacak kumpulan data besar yang dapat berukuran gigabyte atau terabyte. Git mengalami kesulitan dalam memelihara file-file besar ini.

Untuk memahami masalahnya, kita perlu melihat bagaimana Git melacak file. Setiap kali ada komit, Git membuat simpul objek dengan penunjuk ke induknya atau banyak induknya. Model data Git dikenal sebagai grafik asiklik terarah (DAG). Model DAG memastikan hubungan orang tua-ke-anak tidak pernah dapat membentuk siklus apa pun.

Kami dapat memeriksa cara kerja bagian dalam model DAG. Berikut adalah contoh dari tiga komit dalam repositori:

$ git log --oneline
2beb263 Komit C: menambahkan gambar1.jpeg
866178e Komit B: tambahkan b.txt
d48dd8b Komit A: tambahkan a.txt

Di Komit A dan B, kami menambahkan file teks a.txt dan b.txt. Kemudian di Komit C, kami menambahkan file gambar bernama image1.jpeg. Kita dapat memvisualisasikan DAG sebagai berikut:

Komit C       Komit B        Komit A
2beb263   -->  866178e   -->    d48dd8b

Jika kita memeriksa komit terakhir dengan perintah berikut:

$ git file-cat -p 2beb263
pohon 7cc17ba5b041fb227b9ab5534d81bd836183a4e3
induk 866178e37df64d9f19fa77c00d5ba9d3d4fc68f5
penulis Zak H 1513259427 -0800
komiter Zak H 1513259427 -0800
Komit C: menambahkan gambar1.jpeg

Kita dapat melihat bahwa Commit C (2beb263) memiliki Commit B (866178e) sebagai induknya. Sekarang jika kita memeriksa objek pohon dari Commit C (7cc17ba), kita dapat melihat blob (objek besar biner):

$ git cat-file -p 7cc17ba
100644 gumpalan e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a.txt
100644 gumpalan e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    b.txt
100644 gumpalan a44a66f9e06a8faf324d3ff3e11c9fa6966bfb56    image1.jpeg

Kami dapat memeriksa ukuran gumpalan gambar:

$ git file-cat -s a44a66f9e
871680

Git melacak perubahan dalam struktur pohon ini. Mari kita membuat modifikasi pada gambar1.jpeg dan periksa riwayatnya:

$ git log --oneline
2e257db Komit D: gambar yang dimodifikasi1.jpeg
2beb263 Komit C: menambahkan gambar1.jpeg
866178e Komit B: tambahkan b.txt
d48dd8b Komit A: tambahkan a.txt

Jika kita memeriksa objek Commit D (2e257db):

$ git file-cat -p 2e257db
pohon 2405fad67610acf0f57b87af36f535c1f4f9ed0d
induk 2beb263523725e1e8f9d96083140a4a5cd30b651
penulis Zak H 1513272250 -0800
panitia Zak H 1513272250 -0800
Komit D: gambar yang dimodifikasi1.jpeg

Dan pohon (2405fad) di dalamnya:

$ git cat-file -p 2405fad
100644 gumpalan e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a.txt
100644 gumpalan e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    b.txt
100644 gumpalan cb4a0b67280a92412a81c60df36a15150e713095    image1.jpeg

Perhatikan bahwa hash SHA-1 untuk image1.jpeg telah berubah. Itu berarti telah membuat gumpalan baru untuk image1.jpeg. Kami dapat memeriksa ukuran gumpalan baru:

$ git cat-file -s cb4a0b6
1063696

Berikut adalah cara untuk memvisualisasikan struktur DAG di atas:

Komit D Komit C Komit B Komit A
| | | |
2e257db --> 2beb263 --> 866178e --> d48dd8b
| | | |
Pohon4 Pohon3 Pohon2 Pohon1
| | | |
Gumpalan Gumpalan Gumpalan Gumpalan

Setiap objek komit mempertahankan pohonnya sendiri. Gumpalan dipertahankan di dalam pohon itu. Git mengoptimalkan ruang dengan memastikannya hanya menyimpan perbedaan dan menggunakan kompresi untuk penyimpanan. Tetapi untuk perubahan file biner, Git harus menyimpan seluruh file dalam blob karena sulit untuk menentukan perbedaannya. Juga, file gambar, video, dan audio sudah dikompres. Akibatnya, untuk setiap contoh file biner yang dimodifikasi, pohon berakhir dengan gumpalan besar.

Mari kita pikirkan contoh di mana kita membuat banyak perubahan pada file gambar 100 MB.

Komit C  -->  Komit B  --> Komit A
| | |
Pohon3           Pohon2        Pohon1
| | |
Blob3           Blob2        Blob1
300 MB 200 MB 100 MB

Setiap kali kita mengubah file, Git harus membuat gumpalan 100 MB. Jadi hanya setelah 3 komit, repositori Git adalah 300 MB. Anda dapat melihat bahwa ukuran repositori Git dapat dengan cepat meledak. Karena Git adalah kontrol versi terdistribusi, Anda akan mengunduh seluruh repositori ke instance lokal Anda dan banyak bekerja dengan cabang. Jadi gumpalan besar menjadi hambatan kinerja.

Git LFS memecahkan masalah dengan mengganti gumpalan dengan file penunjuk ringan (PF) dan membuat mekanisme untuk menyimpan gumpalan di tempat lain.

Komit C --> Komit B --> Komit A
| | |
Pohon3 Pohon2 Pohon1
| | |
PF3 PF2 PF1

Git secara lokal menyimpan gumpalan di cache Git LFS, dan dari jarak jauh akan menyimpannya di toko Git LFS di GitHub atau BitBucket.

PF1 --> Gumpalan1
PF2 --> Gumpalan2
PF3 --> Blob3

Sekarang ketika Anda berurusan dengan repositori Git, file PF ringan akan digunakan untuk operasi rutin routine. Gumpalan akan diambil hanya jika diperlukan. Misalnya, jika Anda checkout Komit C, maka Git LFS akan mencari pointer PF3 dan mengunduh Blob3. Jadi repositori kerja akan lebih ramping dan kinerjanya akan lebih baik. Anda tidak perlu khawatir tentang file pointer. Git LFS akan mengelolanya di belakang layar.

Menginstal dan Menjalankan Git LFS

Ada upaya sebelumnya untuk memecahkan masalah file besar Git. Tapi Git LFS berhasil karena mudah digunakan. Anda hanya perlu menginstal LFS dan memberi tahu file mana yang akan dilacak.

Anda dapat menginstal Git LFS menggunakan perintah berikut:

$ sudo apt-get install software-properties-common
$ curl -s https://packagecloud.io/install/repositori/github/git-lfs/script.deb.sh | sudo bash
$ sudo apt-get install git-lfs
$ git lfs instal

Setelah Anda menginstal Git LFS, Anda dapat melacak file yang Anda inginkan:

$ git lfs melacak "*.jpeg"
Pelacakan "*.jpeg"

Outputnya menunjukkan kepada Anda bahwa Git LFS melacak file JPEG JPEG. Saat Anda mulai melacak dengan LFS, Anda akan menemukan a .gitattributes yang akan memiliki entri yang menunjukkan file yang dilacak. Itu .gitattributes file menggunakan notasi yang sama seperti ..gitignore file. Berikut isi dari .gitattributes terlihat:

$ kucing .gitattributes
*.jpeg filter=lfs diff=lfs merge=lfs -teks

Anda juga dapat menemukan file mana yang dilacak menggunakan perintah berikut:

$ git lfs trek
Mencantumkan pola yang dilacak
*.jpeg (.gitatribut)

Jika Anda ingin berhenti melacak file, Anda dapat menggunakan perintah berikut:

$ git lfs untrack "*.jpeg"
Membatalkan pelacakan "*.jpeg"

Untuk operasi Git umum, Anda tidak perlu khawatir tentang LFS. Ini akan menangani semua tugas backend secara otomatis. Setelah Anda menyiapkan Git LFS, Anda dapat mengerjakan repositori seperti proyek lainnya.


Pelajaran lanjutan

Untuk topik lebih lanjut, lihat sumber daya berikut:

  • Memindahkan repositori Git LFS antar host
  • Menghapus file LFS Git Lokal
  • Menghapus file Git LFS jarak jauh dari server
  • Situs web Git LFS
  • Dokumentasi Git LFS

Referensi:

  • git-lfs.github.com: repo GitHub
  • github.com/git-lfs/git-lfs/tree/master/docs: Dokumentasi GitHub untuk Git LFS
  • atlassian.com/git/tutorials/git-lfs: Tutorial Atlassian
  • Youtube.com: Apa itu Git LFS?
  • Youtube.com: Melacak File Besar dengan Git LFS oleh Tim Pettersen, Atlassian
  • Youtube.com: Mengelola file besar di penyimpanan yang tepat dengan Git LFS, YouTube
  • Youtube.com: Penyimpanan File Besar Git - Cara Bekerja dengan File Besar, YouTube
  • askubuntu.com/questions/799341: cara menginstal-git-lfs-on-ubuntu-16-04
  • github.com/git-lfs/git-lfs/blob/master/INSTALASI.md: Panduan Instalasi
Cara Menggunakan Xdotool untuk Merangsang Klik Mouse dan Keystroke di Linux
Xdotool adalah alat baris perintah sumber terbuka dan gratis untuk mensimulasikan klik mouse dan penekanan tombol. Artikel ini akan membahas panduan s...
5 Produk Mouse Komputer Ergonomis Terbaik untuk Linux
Apakah penggunaan komputer yang lama menyebabkan rasa sakit di pergelangan tangan atau jari Anda?? Apakah Anda menderita persendian yang kaku dan teru...
Cara Mengubah Pengaturan Mouse dan Touchpad Menggunakan Xinput di Linux
Sebagian besar distribusi Linux dikirimkan dengan pustaka "libinput" secara default untuk menangani kejadian input pada sistem. Ini dapat memproses ke...