Panduan Migrasi Lore VCS untuk Mengatasi Tagihan Git LFS yang Membengkak dan Konflik Aset Unreal
Saat proyek berkembang, Git LFS berubah menjadi bencana. Memperbaiki beberapa baris kode sumber memang cepat, tetapi ketika aset seni berukuran gigabita mulai bercampur, ikon jam pasir akan berputar selama puluhan detik setiap kali Anda melakukan commit. Karena struktur LFS yang tidak efisien—yaitu menyalin dan menumpuk file berukuran besar secara utuh—kapasitas penyimpanan dengan cepat melampaui terabita dan tagihan penggunaan bandwidth pun melonjak dengan angka yang mengerikan.
Lore, yang dirilis oleh Epic Games sebagai open source, memprioritaskan penanganan file biner. Dengan menggunakan metode FastCDC yang memecah file menjadi blok-blok untuk menghilangkan duplikasi, Lore secara drastis mengurangi ukuran paket dan bandwidth transmisi. Berikut adalah panduan praktis migrasi dan optimasi Lore yang dapat langsung diterapkan oleh tim kecil sekalipun, bahkan tanpa staf spesialis DevOps.
1. Migrasi Bertahap dari Git LFS ke Lore
Anda tidak perlu membuang riwayat commit kode sumber yang sudah terkumpul di repositori Git yang ada. Strategi hibrida, di mana kode ringan tetap berada di Git sementara aset biner yang berat dipindahkan ke repositori Lore, adalah pendekatan yang paling realistis.
Skrip di bawah ini mengidentifikasi daftar file yang dilacak oleh Git LFS, membuat struktur direktori yang serupa, dan memverifikasi hash SHA-256 dari salinan file untuk memastikan data dipindahkan ke Lore tanpa ada yang hilang.
`bash
#!/usr/bin/env bash
set -euo pipefail
GIT_REPO_DIR="HOME/projects/my−game−git"LOREREPODIR="HOME/projects/my-game-lore"
LORE_SERVER_URL="lore://127.0.0.1:41337/my-project"
echo "[1/5] Inisialisasi repositori Lore dan binding remote..."
if [ ! -d "LOREREPODIR"];thenmkdir−p"LORE_REPO_DIR"
cd "LOREREPODIR"lorerepositorycreate"LORE_SERVER_URL"
else
cd "$LORE_REPO_DIR"
fi
echo "[2/5] Mengumpulkan daftar file yang dilacak Git LFS..."
cd "GITREPODIR"LFSFILES=(git lfs ls-files -n | grep -E ".(uasset|umap|fbx|png|psd)$" || true)
if [ -z "$LFS_FILES" ]; then
echo "Tidak ada file LFS untuk dimigrasi."
exit 0
fi
echo "[3/5] Menyalin file dan membuat manifest untuk verifikasi..."
echo "LFSFILES"∣whileread−rfilepath;doif[−f"filepath" ]; then
dest_dir="LOREREPODIR/(dirname "filepath")"mkdir−p"dest_dir"
cp -p "filepath""LORE_REPO_DIR/filepath"sourcehash=(openssl dgst -sha256 "$filepath" | awk '{print 2}')
echo "filepath:sourcehash">>"LORE_REPO_DIR/.lore_migration_manifest"
fi
done
echo "[4/5] Menghapus LFS dari Git dan staging ke Lore..."
cd "GITREPODIR"echo"LFS_FILES" | while read -r filepath; do
git rm --cached "$filepath"
done
sed -i.bak -E 's/filter=lfs diff=lfs merge=lfs//g' .gitattributes
cd "LOREREPODIR"echo"LFS_FILES" | while read -r filepath; do
lore stage "$filepath"
done
lore commit -m "Migration: Transfer heavy assets from Git LFS to Lore"
lore push
echo "[5/5] Verifikasi integritas data..."
lore repository verify state
lore repository verify fragment
if [ -f ".lore_migration_manifest" ]; then
migration_errors=0
while IFS=":" read -r file sha; do
if [ -f "file"];thencurrenthash=(openssl dgst -sha256 "$file" | awk '{print 2}')
if [ "sha" != "$current_hash" ]; then
echo "File korup terdeteksi: file"migrationerrors=((migration_errors + 1))
fi
fi
done < .lore_migration_manifest
if [ $migration_errors -eq 0 ]; then
echo "Migrasi selesai. Seluruh data telah dipulihkan dengan integritas 100%."
rm .lore_migration_manifest
else
echo "Verifikasi gagal: $migration_errors file memiliki masalah integritas."
exit 1
fi
fi
`
Buka terminal dan simpan konten di atas sebagai migrate.sh. Berikan izin eksekusi dengan perintah chmod +x migrate.sh, lalu jalankan setelah menyesuaikan variabel sesuai jalur lokal Anda.
Setelah proses ini selesai, penggunaan penyimpanan LFS di cloud jarak jauh akan langsung berkurang. Berdasarkan studi kasus internal Epic Games, teknologi penghapusan duplikasi tingkat blok ini dapat menghemat biaya pemeliharaan infrastruktur hingga 50%.
2. Menerapkan On-demand Hydration di Pipeline CI/CD
Pipeline yang mengunduh ratusan gigabita aset game utuh setiap siklus build adalah musuh utama kartu jaringan dan I/O disk. Lore mendukung On-demand Hydration (pemulihan sesuai permintaan) berbasis sistem file virtual untuk mempercepat waktu build.
Pada tahap clone awal, hanya rantai struktur metadata dan pohon direktori yang disalin sebagai shell. Ketika compiler membaca aset sebenarnya selama proses Cook, hanya potongan biner (binary chunk) yang diperlukan yang akan di-stream secara dinamis dan diisi ke disk.
`yaml
name: Game Project On-Demand Production Build
on:
push:
branches: [ release-candidate ]
env:
LORE_SERVER: "lore://10.0.1.50:41337/game-depot"
SHARED_STORE_PATH: "/var/lib/lore_shared_chunk_store"
WORKSPACE_PATH: "game_build_workspace"
jobs:
assemble-assets:
runs-on: self-hosted
steps:
- name: Persiapkan Persistent Shared Store
run: |
if [ ! -d "env.SHAREDSTOREPATH"];thensudomkdir−p"{{ env.SHARED_STORE_PATH }}"
sudo chmod 777 "env.SHAREDSTOREPATH"loreshared−storecreate"{{ env.SHARED_STORE_PATH }}"
fi
- name: Sparse Bare Clone melalui Shared Cache
run: |
lore clone \
--bare \
--use-shared-store \
--shared-store-path "${{ env.SHARED_STORE_PATH }}" \
"${{ env.LORE_SERVER }}" \
"${{ env.WORKSPACE_PATH }}"
- name: Mengecualikan sumber sinematik yang tidak perlu melalui filter tampilan
run: |
cd "${{ env.WORKSPACE_PATH }}"
echo "+ /SourceCode/" > .lore/view
echo "+ /Config/" >> .lore/view
echo "+ /Content/Core_Assets/" >> .lore/view
echo "- /Content/Cinematic_RAW/" >> .lore/view
- name: Sinkronisasi hanya chunk yang diperlukan ke disk lokal
run: |
cd "${{ env.WORKSPACE_PATH }}"
lore sync
- name: Menjalankan Unreal Engine Cooker
run: |
cd "${{ env.WORKSPACE_PATH }}"
./RunUAT.sh BuildCookRun \
-project="$(pwd)/GameProject.uproject" \
-platform=Win64 \
-clientconfig=Development \
-cook -stage -pak -archive
`
Menyediakan penyimpanan cache permanen seperti /var/lib/lore_shared_chunk_store di server build akan memaksimalkan efektivitas. Dengan perintah lore clone --bare, Anda hanya menarik informasi indeks dengan cepat, lalu menggunakan file filter .lore/view untuk menyimpan jalur yang benar-benar dibutuhkan sebelum menjalankan lore sync. Dengan struktur ini, trafik yang dikirim ke node build berkurang lebih dari 85% dan total waktu build terpangkas sekitar 30%.
3. Mencegah Konflik Aset dengan Sistem Penguncian File
Aset biner seperti .uasset atau file peta level di Unreal Engine tidak dapat digabungkan (merge) secara otomatis di branch utama seperti kode teks. Jika dua artis mengedit aset yang sama secara bersamaan, artis yang melakukan push terakhir dapat menimpa pekerjaan sebelumnya atau merusak lini masa.
Lore menyediakan fitur penguncian (Lock) yang melakukan kontrol eksklusif berdasarkan ledger yang tidak dapat diubah (immutable) pada server jarak jauh.
`bash
Meminta izin edit tunggal untuk file model karakter biner tertentu
lore lock acquire Content/Characters/HeroMesh.uasset --branch main
Memeriksa status kepemilikan kunci sumber daya di bawah folder tertentu
lore lock status Content/Characters/HeroMesh.uasset
Mencari semua file yang dikunci oleh pekerja tertentu di repositori jarak jauh
lore lock query --branch main --owner developer_artist_03
Mengembalikan hak akses setelah pekerjaan selesai dan di-push
lore lock release Content/Characters/HeroMesh.uasset --branch main
`
Buat aturan agar artis wajib mengambil kunci dengan perintah lore lock acquire sebelum menyentuh file. Setelah revisi selesai dan commit serta push berhasil dicerminkan ke server jarak jauh, gunakan lore lock release untuk membuka kunci agar dapat diteruskan ke pekerja berikutnya. Jika perencana atau artis merasa canggung menggunakan perintah terminal, Anda dapat mengintegrasikan jalur tersebut ke alat GUI desktop seperti Anchorpoint, sehingga penguncian dapat dilakukan hanya dengan klik kanan mouse.
4. Panduan Tuning Cache Berdasarkan Spesifikasi Perangkat Keras
Pengaturan klien harus disesuaikan dengan spesifikasi lingkungan kerja untuk menghindari kemacetan I/O file.
Tuning Klien Lokal Berdasarkan Spesifikasi PC Pekerja
- Sistem Performa Tinggi (NVMe SSD, RAM 32GB atau lebih, CPU multi-core): Izinkan operasi berbasis pemetaan memori (memory map) melalui teknik pemetaan memori virtual OS. Tingkatkan jumlah thread download paralel untuk menghilangkan latensi sinkronisasi dan tetapkan periode retensi cache disk yang lebih lama.
- Sistem Standar (SATA SSD atau HDD, RAM 16GB atau kurang): Matikan metode pemetaan memori untuk mencegah crash mesin akibat kehabisan memori. Aktifkan flag
--direct-file-write dan --direct-file-io untuk penulisan langsung ke disk, serta perpanjang interval jadwal garbage collection untuk mencegah pengambilalihan disk yang tiba-tiba saat bekerja.
Analisis Performa Berdasarkan Pilihan Algoritma Kompresi
Merujuk pada keputusan arsitektur Lore (ADR-00016), menetapkan standar Zstandard Level 6 sebagai mesin kompresi default memberikan keseimbangan terbaik dari sisi efisiensi.
| Jenis Algoritma Kompresi |
Rasio Kompresi Data Akhir (%) |
Kecepatan Kompresi (MiB/s) |
Kecepatan Dekompresi (MiB/s) |
Portabilitas & Fitur |
| LZ4 Default |
47.6% |
718.7 |
2494.5 |
Cepat tapi boros kapasitas penyimpanan |
| Zstd Level 1 |
34.5% |
602.0 |
1363.1 |
Kompromi yang baik antara kecepatan & kapasitas |
| Zstd Level 6 (Direkomendasikan) |
28.9% |
136.5 |
1284.9 |
Efisiensi pemrosesan terbaik dibanding penghematan ruang |
| Oodle Kraken 3 (Fast) |
28.2% |
95.6 |
1413.1 |
Butuh pustaka eksklusif Oodle Epic Games |
| Oodle Kraken 6 (Default Lama) |
23.9% |
2.2 |
1312.6 |
Kecepatan sangat turun drastis saat migrasi skala GB |
Oodle Kraken Level 6 yang sering digunakan sebelumnya sering menjadi penyebab utama lamanya waktu menunggu commit sebelum artis pulang kantor, karena kecepatan pemrosesan kompresi selama serialisasi backend turun hingga 2.2 MiB/detik. Sebaliknya, Zstd Level 6 menghasilkan rasio kompresi yang mendekati Oodle Kraken 6, namun dengan kecepatan kompresi blok chunk lokal mencapai 136.5 MiB/detik, sekitar 62 kali lebih cepat. Jika Anda memiliki banyak cabang luar negeri atau pekerja jarak jauh dengan gangguan bandwidth, pertimbangkan untuk menyusun topologi server dua tingkat dengan node proxy edge cache di jaringan lokal.