Quick answer: Git stores every version of every file forever — fine for code, ruinous for binaries, where each PSD tweak adds the full file size to history. LFS fixes it by storing binaries outside the repo with lightweight pointers inside. Adopt it at project start if your game has meaningful art/audio assets; retrofitting onto a bloated repo is the painful version.
Git stores every version of every file forever — fine for code, ruinous for binaries, where each PSD tweak adds the full file size to history. LFS fixes it by storing binaries outside the repo with lightweight pointers inside. Adopt it at project start if your game has meaningful art/audio assets; retrofitting onto a bloated repo is the painful version. That's the short version — the sections below get into the how, the why, and the mistakes worth dodging.
Why binaries break normal Git
Git's efficiency comes from diffing text; binaries don't diff, so every saved change to a 50MB texture stores another 50MB in history — permanently, for everyone who ever clones. A year of art iteration produces multi-gigabyte clones, glacial operations, and hosting limits exceeded. The repo doesn't gradually slow; it crosses a threshold and becomes a daily complaint.
LFS replaces each tracked binary in history with a tiny pointer file and fetches only the versions you actually check out — clone sizes and speeds return to sanity.
Setup is ten minutes at project start
Install LFS, run git lfs install once per machine, then declare patterns: git lfs track "*.png" "*.wav" "*.psd" "*.fbx" and friends. The patterns live in .gitattributes — commit it first, before any assets arrive, because files added before tracking stay in normal Git history forever (migration tools exist but rewrite history, which is team-disruptive surgery).
Decide the boundary deliberately: source art (PSDs, project files) and large audio belong in LFS; tiny icons and engine text assets don't need it. When in doubt, anything over a megabyte that doesn't diff as text is an LFS candidate.
The quota reality and the alternatives
LFS hosting is metered: GitHub's free tier includes modest storage and bandwidth, with paid packs beyond. Small teams rarely hit limits; asset-heavy teams should price the tiers or consider self-hosted remotes. Bandwidth burns fastest from CI pipelines cloning repeatedly — cache clones in CI and the quota lasts.
If your project is overwhelmingly binary (heavy 3D, film-adjacent), that's the signal to evaluate Perforce or other game-industry VCS instead — but for typical indie scale, Git plus LFS is the well-trodden, free-tier-friendly path.
Your future self is a stranger — leave notes
Six months from now you will not remember why that magic number is 0.73 or which scene is safe to delete. Project knowledge that lives only in your head evaporates on contact with a break, a jam, or a day job crunch.
Keep one running NOTES file: decisions made, things that look unused but aren't, how to do the fiddly release steps. Five minutes of writing per week buys you days of re-discovery later.
Boring tools are a superpower
Every hour spent fighting your own pipeline is an hour not spent on the game. The goal of tooling isn't sophistication — it's that builds, backups, and versioning become so boring you forget they exist. Set them up once, automate them, and let them run.
The test is simple: if your machine died tonight, how long until you're working again? If the answer is 'an hour', your tooling is good. If it's 'I'd lose a week', fix that before adding any feature.
Close the loop with real players
Advice gets you to a sensible starting point; only real player behavior tells you if it worked. Ship the change, then watch what actually happens — the reports that come in, the errors that spike or vanish, the place sessions end.
Make that loop short. When a player can report a bug in ten seconds and you see it with logs attached, you stop guessing what to fix next. Tight feedback loops are the closest thing indie development has to a cheat code.
Putting it to work
Don't try to act on all of this at once. Pick the one change that costs you the least and pays the most this week, do it, and see what actually happens before reaching for the next.
Most of this rewards steadiness over intensity. A small improvement made every week, checked against how real players respond, outruns any single burst of effort — in this corner of game development and every other one.
If your machine died tonight, you should be working again by morning. Build toward that.