Diversion: A new source control seeking to reduce headache for game development

Note: This is not a sponsored post.

Diversion, still in Beta as of this writing, is a new git-like source control set up to support games, with a slight emphasis on Unreal Engine. It can be used in a variety of locations – in browser, via desktop app, via plugin (for Unreal and JetBrains) or through the command line.

Their website states their goal: “Version control in game development has always been a pain – and we’re serious about fixing it.”

Screenshot from Diversion’s game development page. August 2024.

In this post, I’ll go over the features, price, limitations and my thoughts on the tool, coming from a git heavy background, based on some light use of Diversion to get a feel for how it works.

Pricing

As of August 2024, Diversion offers a generous 100gb of free storage to 1-5 users of the platform. Once you exceed either that storage or number of users they have a tier of costs:

Users

  • 6-10 users: $12 USD/user per month
  • 11-30: $25 USD/user per month
  • 30+: Reach out to them

Storage

  • Each 100gb over the first 100: $10 USD/month

Student Pricing

  • Up to 10 users free, $10 USD per additional user per month

Be sure to check their pricing page for the most up to date costs.

A Git-like approach

Diversion’s Interactive Shell in CLI

Diversion uses syntax and terminology very similar to Git, along with many similar concepts.

The git-like influence is most obvious when you’re using their CLI – as with git, they use commands clone, init, status, diff which function akin to what you’d expect of git. Code is stored in repositories and you create branches off your main development branch to work on feature code without impacting others that you then merge back into the primary branch.

If you switch branches while there are pending changes, you can discard, merge to the new branch, or stash them.

Diversion’s interactive shell showing a diff for three text files.

Perforce influence

While Diversion primarily feels git-like to me, it does seem they take some influence from Perforce with their workspaces concept. I’ve used Perforce, but not extensively, so there may be additional inspiration from it of which I’m unaware.

For Diversion, a workspace is linked to a branch and serves as “a mechanism that allows each team member to keep their work synced across devices and with the cloud” (from their docs under Workspaces). The way this works in practice is that your workspace is in sync with the cloud at all times you’re online. Any change you make is then synced to the cloud to allow yourself and others to see if there are conflicts between different workspaces while development is ongoing.

Using Diversion

Screenshot of the web GUI after logging in with a new account

The Diversion team has given its users a variety of choices in how they want to interact with their source control:

  • Web based GUI
  • Desktop apps for Windows, Mac and Linux with a GUI nearly identical to web
  • Command line interface, including an interactive mode to show many of the commands available with auto-complete
  • Plugins for Unreal Engine and JetBrains IDEs
  • An API for you to develop your own client or custom integrations
Changed, deleted, and added files in the Desktop UI.

Bonus features for Github users

If you’re currently using Git for your source control needs, the Diversion team has created a seamless way to import from Github to Diversion using their Diversion Sync github app.

When migrating from Github, you can opt-in to bidirectional sync, which pushes updated files to both Diversion AND your git repo, including git-lfs storage as long as git-lfs is on Github.

Screenshot of the Git import GUI from the Desktop app.

To test the integration, I imported my Unreal Test Automation sample project from Github. Its a barebones project just to showcase how to use the Unreal Functional testing plugin, as discussed in my previous post on the topic.

After importing, it took me to the commit history view with the latest commit selected. You can see the starter content I’d removed after having accidentally from my git history.

View of the workspace, showing commit history (center) and changed files (left).

Its a simple project, but my changes were migrated successfully, including my commit history.

CI/CD Integration

Diversion provides the standard API key integration with CI/CD. Their setup steps are straightforward, requiring only that you have an API key, you store it in secrets, store a USER_POOL_CLIENT_ID provided in their docs and setup the build step for installing and authenticating diversion, then downloading the repo. For convenience, they provide an example of the build step for both Mac/Linux and Windows in their docs.

Limitations

I’ve observed a few limitations with using Diversion, but it’s important to note that it is in active development so these may change in the future.

  1. No ability to rename repos. This is not typically a big deal, but I ran into a bug (since fixed) that de-synced my local repo from the remote. I didn’t notice this de-sync until after I had made a number of changes I was trying to commit. My first instinct to resolve this was to rename the remote and create a new remote repo off my local, but was unable to do so.
  2. No ability to link a local diversion folder to a remote repo. You need to clone from remote or initialize locally which will also trigger the creation of a linked remote repo. So if you initialize a local diversion folder and want to link it to an existing remote repo, you can’t sync the two on your own like you can with git’s remote add command.
  3. Initializing a new local repo automatically creates a remote repo and links. Sometimes I want to work on something locally before I decide if I want to push to remote source control. Occasionally, I might be working offline and want to set up a local repo to do my commits until I have internet again. Diversion does not support this process.
  4. Repos are private by default and there is no way to make them public. If you’re like me and want to create public repos for others to access as part of tutorials or other knowledge sharing, Diversion is not your solution.
  5. Doesn’t play well with offline development. Because creating local repos automatically create remote ones, if you try to create one offline it will fail silently. Running commands like checking the status, branching, or even diffing will also fail if you’re not online.
  6. Permissions are limited. There are only four roles available, and no way to define specifically what they do or create new ones. This is probably fine for most people, but having more granular control would be nice, especially for larger teams.
  7. Conflicts are still difficult to work with. For now, you get a purple icon to indicate that there’s a merge conflict between a file you’re working on and one a teammate is working on. As typical with Binary files, it’s not easy to see what the conflict is.
  8. No git bisect equivalent. Perhaps underused even in git repos, I’ve always loved this feature in helping narrow down the commit that broke something. Its not a big deal, but would be nice to have something similar.

Roadmap

As this product is still in beta, the team has released a public roadmap for upcoming features. Their roadmap is even open to suggestions.

Some currently planned features on the roadmap:

  • Granular permissions (which would address limitation #6 above)
  • File locking (which would help address limitation #7 above)
  • Branch visualization
  • Sync progress bar
  • Improved JetBrains plugin
  • Import from Perforce
  • Local caching
  • Deeper CI Integration
  • Webhooks
  • More plugins: Visual Studio, VSCode, Godot, etc.
  • More file type support in the preview/diff windows in their UI tools

Support and Troubleshooting

The Diversion team has an active Discord where you can easily report issues and get responses from the developers. They respond within hours, help triage issues and will pop on a call with people if needed to resolve them. They’ve gotten some quick turnaround fixes as well. All in all, their support is fantastic right now.

If Discord isn’t your thing, you can also email them (address found in the web/desktop app) or submit tickets directly from their apps as well as the interactive shell.

Thoughts on Diversion

Its great that the Diversion team is trying to solve the problem of source control in games. While Git is easy to use once you understand the basics, the need for git-lfs and cost of storing the large files associated with games can ramp up quickly. For Perforce, the industry standard, setting it up can be a headache and its interface is clunky and outdated. Having a new contender to provide a better experience is great, and I look forward to seeing how they eventually address the biggest issue of merge conflicts of binary files.

How does it shape up right now? I think this will depend on your team size, workflow, and network connectivity.

As an independent solo developer, I find that Diversion is the best solution for me – I have a low cost, cloud based source control with direct access to devs if I run into issues via their discord where they typically respond within hours. I enjoy the git-like nature without having to worry about the cost of using git-lfs, managing a Perforce, or paying for third-party Perforce hosting.

I think for larger teams, trying to manage conflicts will be the crux of whether you decide to go forward or not. You’re not getting a diff out of using Diversion with binary files, and lose (for now) the ability to lock the file. You might want to wait until the file lock feature is rolled out. But even if it doesn’t suit your needs right now, it’s well worth following to see what improvements they make in the coming months – they may eventually live up to their state goal.