How to manage version control for your MU Online server's configuration
Structure a version control system for your MU Online server's configuration using Git, branch conventions, and a changelog — so you can revert changes safely and coordinate your team without overwriting each other's work.
MU Online server configuration changes all the time: drop rates, skill cooldowns, seasonal events, new items, class balancing. Without a version control system, every change is a silent risk — a file edited incorrectly, with no recent backup, can crash the server or break the economy without anyone
MU Online server configuration changes all the time: drop rates, skill cooldowns, seasonal events, new items, class balancing. Without a version control system, every change is a silent risk — a file edited incorrectly, with no recent backup, can crash the server or break the economy without anyone knowing exactly what changed or how to revert it. This tutorial shows how to structure your server's configuration version control using Git, commit and branch conventions, and a changelog workflow that lets your team work in parallel without stepping on each other's work.
Why version server configuration
A typical MU server has dozens of configuration files scattered around (drop rates, skills, events, items, NPCs, spawns), often edited by more than one person — the owner, an events GM, a script developer. Without version control, the only way to know "what changed since yesterday" is to manually compare files or rely on the memory of whoever made the edit. With Git, every change is recorded with author, date, reason (commit message), and exact diff — and reverting a problematic change becomes a matter of seconds, not rebuilding everything from scratch from an old backup.
What to version and what not to version
| File type | Version in Git? | Reason |
|---|---|---|
| Drop, skill, item configuration (.txt/.ini/.xml) | Yes | Plain text, changes frequently, needs history |
| Event scripts (Lua, JS, etc.) | Yes | Code directly benefits from version control |
| Database (accounts, characters, in-game items) | No | Changes every second in production, doesn't fit text diffs |
| Large binary files (client, BMD, textures) | No (or Git LFS) | Size and change frequency make plain Git impractical |
| Secrets (database passwords, API keys, tokens) | No (never in plain text) | Security leak risk; use environment variables or a secrets manager |
Step 1 — Structure the configuration repository
Create a dedicated repository (separate from the emulator's source code, if possible) just for the configuration your team edits frequently. A typical folder structure:
mu-config/
├── gameserver/
│ ├── drop-rates.ini
│ ├── skill-cooldown.txt
│ └── item-list.xml
├── events/
│ ├── devil-square.ini
│ └── blood-castle.ini
├── changelog/
│ └── CHANGELOG.md
└── README.md
Step 2 — Initialize Git and define .gitignore
cd mu-config
git init
git add .
git commit -m "Initial versioned configuration"
In .gitignore, exclude any file that contains secrets or volatile data:
*.log
*password*
*secret*
database-credentials.ini
Step 3 — Define a commit message convention
A simple convention avoids vague messages like "tweaks" or "fix." Suggested pattern:
| Prefix | Use | Example |
|---|---|---|
feat: | New configuration/system | feat: add level 5 socket configuration |
fix: | Configuration bug fix | fix: correct Dark Knight stun cooldown |
balance: | Balancing adjustment | balance: reduce Excellent item drop rate by 15% |
event: | Seasonal event configuration | event: enable double rates for the July Devil Square |
revert: | Reverting a previous change | revert: restore Berserker cooldown to previous value |
Step 4 — Branching strategy
For servers with a team (more than one person editing configuration), a simple branch strategy works better than unnecessary complexity:
main— stable configuration, what's currently running in production.staging— changes tested on a test server, awaiting approval to go to production.feature/change-name— short-lived branches for a specific change (e.g.,feature/new-halloween-event).
The flow: create the feature branch, edit and test it in a test environment, open a merge/pull request into staging, validate it, and only then merge into main and apply it to the production server.
Step 5 — Automate configuration deployment
Once a change is approved on main, ideally you have a script (or a simple CI pipeline) that copies the versioned files to the GameServer's actual directory and restarts the affected service, avoiding error-prone manual copying:
#!/bin/bash
# deploy-config.sh
git pull origin main
cp gameserver/*.ini /srv/muserver/Data/
cp gameserver/*.txt /srv/muserver/Data/
systemctl restart muserver-gameserver
echo "Configuration deployed: $(git rev-parse --short HEAD)"
Step 6 — Keep a readable changelog for the community
Besides Git's technical history, maintain a CHANGELOG.md written in player-facing language, for posting on social media and the server's website:
## [2024-06-10]
- Reduced Excellent item drop rate by 15% (economy balancing).
- Fixed Dark Knight Stun cooldown (it was 3s below configured value).
- Added special weekend event with double rates.
Step 7 — Reverting a problematic change
If a published configuration breaks something (economy, balancing, or even server boot), Git lets you revert quickly:
git log --oneline -- gameserver/drop-rates.ini
git revert <problematic-commit-hash>
./deploy-config.sh
This restores the file to its previous state without losing the history of the attempt (the revert commit stays recorded, explaining the reason).
Step 8 — Control team access and permissions
Not every GM or collaborator should have direct merge permission on main. Use protected branch permissions (available on GitHub, GitLab, and Gitea) requiring review from at least one other person before any merge to production — this prevents a poorly calculated balancing change from going live without a second set of eyes.
Common errors and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Nobody knows what changed in the last week | No version control or vague commits | Adopt a commit convention and require a changelog |
| A secret (database password) leaked into the repository | Credentials file committed by mistake | Remove it from history with git filter-repo, rotate the password immediately |
| Deployment applied the wrong configuration | Manual deployment without confirming branch/commit | Automate deployment and always check the hash before applying |
| Two GMs overwrote each other's configuration | Direct editing without branch/PR | Require a branch and review before merging to main |
| Revert didn't fix the problem | Problematic change was spread across more than one file | Review the full commit diff, not just the suspected file |
Configuration versioning checklist
- Dedicated Git repository for configuration created.
.gitignoreconfigured to exclude secrets and logs.- Commit message convention defined and documented.
- Branching strategy (main/staging/feature) adopted by the team.
- Automated deployment script tested.
- Readable changelog maintained for the community.
- Production branch protected with required review.
- Revert process tested at least once in a test environment.
With version control structured, your team gains confidence to test balancing changes without fear of irreversibly breaking production. If you're still setting up the server's basic infrastructure, check out the MU Online server creation tutorial before applying this versioning workflow.
Frequently asked questions
Do I need advanced Git knowledge to version server configuration?
No. Basic usage (add, commit, push, branch, revert) already covers 90% of a MU server's needs. Advanced commands like interactive rebase are rarely needed for this kind of project.
Should I version the database along with the configuration files?
Not directly. Databases change constantly with the game in production (accounts, characters, items) and don't fit well into Git. Only version static configuration files and keep separate, scheduled backups of the database.
How do I revert a configuration that broke the server?
If you versioned it with Git, just use 'git revert' or check out the last stable commit for that specific file, restart the affected service, and confirm things are back to normal. Without version control, you depend on manual backups, which tend to be outdated.
Where should I host the configuration repository — public GitHub, private, or self-hosted?
Always in a private repository, whether on GitHub, GitLab, or a self-hosted Gitea instance. MU Online server configuration files often contain sensitive information (database passwords, keys, IPs) that should never be public.
Is it worth using separate branches for each event or season?
Yes, especially if you do seasonal balancing tests. A branch per season/event lets you test isolated changes and only merge into the main branch once approved, without risking the stable production configuration.