Panduan Migrasi Lore VCS untuk Mengatasi Tagihan Git LFS yang Membengkak dan Konflik Aset Unreal
TuBrief 편집팀
2026년 7월 14일
0
Computing/Software원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
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.
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-lore"
LORE_SERVER_URL="lore://127.0.0.1:41337/my-project"
echo "[1/5] Inisialisasi repositori Lore dan binding remote..."
if [ ! -d "LORE_REPO_DIR"
cd "LORE_SERVER_URL"
else
cd "$LORE_REPO_DIR"
fi
echo "[2/5] Mengumpulkan daftar file yang dilacak Git LFS..."
cd "(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 "filepath" ]; then
dest_dir="(dirname "dest_dir"
cp -p "LORE_REPO_DIR/(openssl dgst -sha256 "$filepath" | awk '{print 2}')
echo "filepath:LORE_REPO_DIR/.lore_migration_manifest"
fi
done
echo "[4/5] Menghapus LFS dari Git dan staging ke Lore..."
cd "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 "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 "(openssl dgst -sha256 "$file" | awk '{print 2}')
if [ "sha" != "$current_hash" ]; then
echo "File korup terdeteksi: ((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%.
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.SHARED_STORE_PATH }}"
sudo chmod 777 "{{ 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%.
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
lore lock acquire Content/Characters/HeroMesh.uasset --branch main
lore lock status Content/Characters/HeroMesh.uasset
lore lock query --branch main --owner developer_artist_03
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.
Pengaturan klien harus disesuaikan dengan spesifikasi lingkungan kerja untuk menghindari kemacetan I/O file.
--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.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.