TuBrief
구독 채널
비디오
커뮤니티

Panduan Migrasi Lore VCS untuk Mengatasi Tagihan Git LFS yang Membengkak dan Konflik Aset Unreal

TuBrief 편집팀
2026년 7월 14일
0
Computing/Software

원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.

Bahasa Indonesia한국어EnglishEspañol中文العربيةDeutschFrançaisPortuguêsहिन्दीРусский日本語

관련 영상

Git Tidak Bisa Menangani Game… Jadi Epic Membangun Lore7:44

Git Tidak Bisa Menangani Game… Jadi Epic Membangun Lore

Better Stack

커뮤니티의 다른 글

사내 시스템에 llm api 붙일 때 마주하는 현실적인 한계와 대응법

2026년 9월 13일

레거시 백엔드에 GPT-6 Astra 붙일 때 예산 승인과 보안 통과를 먼저 끝내는 법이 있습니다

2026년 9월 13일

에이전트끼리 대화하다 6천만 원 청구서가 나오는 이유

2026년 9월 13일

사내 RAG 벡터 검색에 Okta 권한 필터를 직접 거는 방법

2026년 9월 13일

브라우저 에이전트에게 내 구글 계정을 통째로 넘기면 안 되는 이유

2026년 9월 12일

Apple Won the AI Race

2026년 9월 12일

댓글 (0)

Log in to leave a comment

아직 작성된 글이 없습니다

© 2026 . All rights reserved.

TuBrief
구독 채널
비디오
커뮤니티
로그인

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-git" LORE_REPO_DIR="HOME/projects/my−game−git"LORER​EPOD​IR="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" ]; then mkdir -p "LORER​EPOD​IR"];thenmkdir−p"LORE_REPO_DIR"
cd "LOREREPODIR"lorerepositorycreate"LORE_REPO_DIR" lore repository create "LORER​EPOD​IR"lorerepositorycreate"LORE_SERVER_URL"
else
cd "$LORE_REPO_DIR"
fi

echo "[2/5] Mengumpulkan daftar file yang dilacak Git LFS..."
cd "GITREPODIR"LFSFILES=GIT_REPO_DIR" LFS_FILES=GITR​EPOD​IR"LFSF​ILES=(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"LFS_FILES" | while read -r filepath; do if [ -f "LFSF​ILES"∣whileread−rfilepath;doif[−f"filepath" ]; then
dest_dir="LOREREPODIR/LORE_REPO_DIR/LORER​EPOD​IR/(dirname "filepath")"mkdir−p"filepath")" mkdir -p "filepath")"mkdir−p"dest_dir"
cp -p "filepath""filepath" "filepath""LORE_REPO_DIR/filepath"sourcehash=filepath" source_hash=filepath"sourceh​ash=(openssl dgst -sha256 "$filepath" | awk '{print 2}') echo "filepath:sourcehash">>"source_hash" >> "sourceh​ash">>"LORE_REPO_DIR/.lore_migration_manifest"
fi
done

echo "[4/5] Menghapus LFS dari Git dan staging ke Lore..."
cd "GITREPODIR"echo"GIT_REPO_DIR" echo "GITR​EPOD​IR"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"LORE_REPO_DIR" echo "LORER​EPOD​IR"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=file" ]; then current_hash=file"];thencurrenth​ash=(openssl dgst -sha256 "$file" | awk '{print 2}') if [ "sha" != "$current_hash" ]; then
echo "File korup terdeteksi: file"migrationerrors=file" migration_errors=file"migratione​rrors=((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 }}" ]; then sudo mkdir -p "env.SHAREDS​TOREP​ATH"];thensudomkdir−p"{{ env.SHARED_STORE_PATH }}"
sudo chmod 777 "env.SHAREDSTOREPATH"loreshared−storecreate"{{ env.SHARED_STORE_PATH }}" lore shared-store create "env.SHAREDS​TOREP​ATH"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.