Leitfaden zur Migration zu Lore VCS: Schluss mit Git LFS-Kostenschocks und Unreal-Asset-Konflikten
TuBrief 편집팀
2026년 7월 14일
0
Computing/Software원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
Wenn Projekte wachsen, wird Git LFS zum Albtraum. Ein paar Zeilen Quellcode zu korrigieren, geht in Sekunden, aber sobald Art-Assets im Gigabyte-Bereich hinzukommen, dreht sich bei jedem Commit minutenlang die Sanduhr. Aufgrund der schwerfälligen Struktur von LFS, das große Dateien kopiert und anhäuft, übersteigt die Repository-Größe schnell die Terabyte-Grenze und die Rechnung für die Bandbreitennutzung wird zum Schreckgespenst.
Lore, das von Epic Games als Open Source veröffentlicht wurde, behandelt Binärdateien als Priorität. Durch den Einsatz des FastCDC-Verfahrens, bei dem Dateien in Blöcke zerlegt und Dubletten entfernt werden, werden Paketgröße und Übertragungsbandbreite drastisch reduziert. Wir haben hier praxisnahe Migrations- und Optimierungsmethoden für Lore zusammengestellt, die auch kleine Teams ohne dediziertes DevOps-Personal sofort anwenden können.
Es ist nicht notwendig, die Commit-Historie des Quellcodes im bestehenden Git-Repository aufzugeben. Eine Hybridstrategie, bei der leichter Code in Git verbleibt und nur schwere Binär-Assets in ein Lore-Repository ausgelagert werden, ist realistisch.
Das folgende Skript identifiziert Dateien, die von Git LFS verfolgt wurden, erstellt eine symmetrische Verzeichnisstruktur und überträgt sie unter Abgleich der SHA-256-Hashes der Kopien verlustfrei zu Lore.
`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] Initialisierung des Lore-Repositorys und Remote-Bindung..."
if [ ! -d "LORE_REPO_DIR"
cd "LORE_SERVER_URL"
else
cd "$LORE_REPO_DIR"
fi
echo "[2/5] Sammeln der Git LFS-Dateiliste..."
cd "(git lfs ls-files -n | grep -E ".(uasset|umap|fbx|png|psd)$" || true)
if [ -z "$LFS_FILES" ]; then
echo "Keine LFS-Dateien zur Migration gefunden."
exit 0
fi
echo "[3/5] Kopieren der Dateien und Erstellung des Prüfmanifests..."
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] Entfernen von Git LFS und Staging in 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] Überprüfung der Datenintegrität..."
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 "Korrupte Datei erkannt: ((migration_errors + 1))
fi
fi
done < .lore_migration_manifest
if [ $migration_errors -eq 0 ]; then
echo "Migration abgeschlossen. Alle Daten wurden zu 100% integritätsgetreu wiederhergestellt."
rm .lore_migration_manifest
else
echo "Überprüfung fehlgeschlagen: $migration_errors Dateien weisen Integritätsprobleme auf."
exit 1
fi
fi
`
Öffnen Sie das Terminal und speichern Sie den obigen Inhalt als migrate.sh. Nachdem Sie die Datei mit chmod +x migrate.sh ausführbar gemacht haben, passen Sie die Variablen an Ihre lokalen Pfade an und führen Sie das Skript aus.
Nach Abschluss dieses Vorgangs reduziert sich die Speichernutzung Ihres Remote-Cloud-LFS sofort. Laut internen Implementierungsberichten von Epic Games können durch diese blockbasierte Dubletten-Entfernungstechnologie die Infrastrukturkosten um bis zu 50 % gesenkt werden.
Pipelines, die bei jedem Build-Zyklus hunderte Gigabyte an Spiel-Assets neu herunterladen, sind der Hauptgrund für überlastete Netzwerkkarten und Festplatten-E/A. Um die Build-Zeiten zu verkürzen, unterstützt Lore die sogenannte On-Demand Hydration (verzögerte Wiederherstellung) auf Basis eines virtuellen Dateisystems.
Beim ersten Klonen wird nur die Metadatenstruktur und der Verzeichnisbaum repliziert. Erst wenn der Compiler während des "Cook"-Prozesses tatsächlich Assets liest, werden die benötigten binären Chunks dynamisch gestreamt und auf die Festplatte geschrieben.
`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: Vorbereitung des Persistent Shared Store
run: |
if [ ! -d "{{ env.SHARED_STORE_PATH }}"
sudo chmod 777 "{{ env.SHARED_STORE_PATH }}"
fi
- name: Sparse Bare Clone via Shared Cache
run: |
lore clone \
--bare \
--use-shared-store \
--shared-store-path "${{ env.SHARED_STORE_PATH }}" \
"${{ env.LORE_SERVER }}" \
"${{ env.WORKSPACE_PATH }}"
- name: Ausschluss unnötiger Cinematic-Quellen mittels View-Filter
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: Synchronisation nur der essenziellen Chunks auf die lokale Festplatte
run: |
cd "${{ env.WORKSPACE_PATH }}"
lore sync
- name: Ausführung des Unreal Engine Cooker
run: |
cd "${{ env.WORKSPACE_PATH }}"
./RunUAT.sh BuildCookRun \
-project="$(pwd)/GameProject.uproject" \
-platform=Win64 \
-clientconfig=Development \
-cook -stage -pak -archive
`
Der Effekt wird maximiert, wenn Sie auf dem Build-Server einen permanenten Cache-Speicher wie /var/lib/lore_shared_chunk_store einrichten. Nach dem Abruf der Indexinformationen mittels lore clone --bare werden im .lore/view-Filter nur die notwendigen Pfade belassen und mit lore sync angewendet. Durch diese Struktur reduziert sich der Traffic zu den Build-Nodes um über 85 %. Die gesamte Build-Zeit verkürzt sich im Durchschnitt um ca. 30 %.
Binäre Assets wie .uasset-Dateien oder Level-Maps der Unreal Engine können nicht automatisch im Haupt-Branch zusammengeführt werden (wie Textcode). Wenn zwei Artists dasselbe Asset gleichzeitig bearbeiten, überschreibt derjenige, der später pusht, die Arbeit des anderen, oder die Zeitleiste wird beschädigt.
Lore bietet eine native Sperrfunktion (Lock), die auf Basis eines unveränderlichen Hauptbuchs (Ledger) auf dem Remote-Server eine exklusive Kontrolle ausübt.
`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
`
Es sollte die Regel etabliert werden, dass Artists vor der Bearbeitung einer Datei einen Lock mit lore lock acquire anfordern. Sobald die Bearbeitung abgeschlossen ist und Commit sowie Push erfolgreich auf den Server übertragen wurden, wird die Sperre mit lore lock release für den nächsten Bearbeiter freigegeben.
Falls Planer und Artists nicht mit Terminalbefehlen vertraut sind, können Sie GUI-Tools wie Anchorpoint anbinden, um diese Sperrbefehle per Rechtsklick auszuführen.
Um Engpässe bei der Dateiein- und -ausgabe zu vermeiden, sollten die Client-Einstellungen an die Hardware der Arbeitsumgebung angepasst werden.
--direct-file-write und --direct-file-io für direkte Schreibvorgänge und erhöhen Sie das Intervall der Garbage Collection, um plötzliche Schreibzugriffe während der Arbeit zu verhindern.Laut dem ADR-00016-Entscheidungsdokument der Lore-Architektur ist die Einstellung des Standards Zstandard Level 6 in Bezug auf die Effizienz am ausgewogensten.
| Kompressionsalgorithmus | Finale Datenkompressionsrate (%) | Kompressionsgeschwindigkeit (MiB/s) | Dekompressionsgeschwindigkeit (MiB/s) | Portabilität & Merkmale |
|---|---|---|---|---|
| LZ4 Default | 47,6% | 718,7 | 2494,5 | Schnell, aber hohe Speicherverschwendung |
| Zstd Level 1 | 34,5% | 602,0 | 1363,1 | Solider Kompromiss aus Geschwindigkeit und Platzersparnis |
| Zstd Level 6 (empfohlen) | 28,9% | 136,5 | 1284,9 | Beste Effizienz bei Platzersparnis |
| Oodle Kraken 3 (Fast) | 28,2% | 95,6 | 1413,1 | Erfordert Epic-exklusive Oodle-Bibliothek |
| Oodle Kraken 6 (bisher Standard) | 23,9% | 2,2 | 1312,6 | Massive Verlangsamung bei Migration im GB-Bereich |
Das bisher häufig verwendete Oodle Kraken Level 6 sank während der Backend-Serialisierung oft auf eine Geschwindigkeit von 2,2 MiB/s ab, was die Commit-Wartezeiten für Artists vor Feierabend massiv in die Länge zog.
Zstd Level 6 hingegen erreicht fast dieselben Kompressionsraten wie Oodle Kraken 6, ist aber bei der lokalen Chunk-Block-Komprimierung mit 136,5 MiB/s etwa 62-mal schneller. Wenn viele Auslandsniederlassungen oder Home-Office-Arbeitsplätze angebunden sind, sollten Sie den Aufbau einer 2-Ebenen-Server-Topologie mit Proxy-Edge-Cache-Nodes innerhalb des lokalen Netzwerks in Betracht ziehen.