<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Diversion</title>
    <description>The latest articles on DEV Community by Diversion (@diversion).</description>
    <link>https://dev.to/diversion</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5455%2Fc7edd224-bad1-4d21-91a1-fdab1d3e7091.jpeg</url>
      <title>DEV Community: Diversion</title>
      <link>https://dev.to/diversion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diversion"/>
    <language>en</language>
    <item>
      <title>The compounding effect of version control performance</title>
      <dc:creator>Sasha Medvedovsky</dc:creator>
      <pubDate>Thu, 11 Sep 2025 14:18:20 +0000</pubDate>
      <link>https://dev.to/diversion/the-compounding-effect-of-version-control-performance-1383</link>
      <guid>https://dev.to/diversion/the-compounding-effect-of-version-control-performance-1383</guid>
      <description>&lt;p&gt;&lt;em&gt;By: Pablo Santos Luaces&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As software developers we tend to focus on the latest, shiniest new feature and often take for granted the core value of our product. &lt;/p&gt;

&lt;p&gt;I remember the surprise when visiting a customer and asking their team what they liked better about the product: every morning it syncs much faster than the previous version control. It wasn’t the latest change in the UI, the super advanced merge feature we just added. It was the speed. I took it for granted. I considered it something that of course was important but that has been there for years. And it was the real key thing.&lt;/p&gt;

&lt;p&gt;And something often overlooked about speed is how it compounds and impacts productivity in ways that are initially not considered.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Diversion performance boost
&lt;/h2&gt;

&lt;p&gt;During the last few months the team at Diversion has dramatically improved the speed of the product. They swarmed together to respond to the requirements of much larger customers. When you have to handle millions and millions of files in the head of the repo, the rivets start to pop.&lt;/p&gt;

&lt;p&gt;To some extent, these teams need some performance to just operate. But in Diversion they have not only matched but vastly outperformed the version control they are replacing. And this creates new opportunities.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  The compounding effect of speed
&lt;/h2&gt;

&lt;p&gt;An improvement in the speed of your daily version control operations, sync or submit, for instance, makes you wait less. &lt;/p&gt;

&lt;p&gt;Every operation that takes more than just a few seconds makes you switch context, go to X or Insta or whatever, then ruin your flow.&lt;/p&gt;

&lt;p&gt;So, if an operation goes down from, let’s say, 30 seconds to 10, the impact is not only 20 seconds times the number of operations per day, it is much more. The threshold between less than 10 seconds and more than 20 provokes minutes of time wasted browsing the internet, going to Slack to chat while you wait, etc.&lt;/p&gt;

&lt;p&gt;But there is more: when an operation is not painfully slow, it creates new opportunities that go beyond saving time and into real workflow changes.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast branching changes the game
&lt;/h2&gt;

&lt;p&gt;Take the branching example. One of the most used version control systems in the gaming industry can’t branch in a performant way as soon as the depots grow too large. Taking 5-20 minutes to create a branch makes it an event, something to be planned, considered, feared. It is not something you do lightly. And then entire workflows are shaped around that limitation (which is something very, very common in the gaming industry).&lt;/p&gt;

&lt;p&gt;Now, suddenly your branching time goes from 5 minutes to 20 ms like it happens with Diversion. The naïve way to think about it is: ok, we create 1 branch a month, so we’re only saving 5 minutes a month, it is definitely not worth the change.&lt;/p&gt;

&lt;p&gt;Obviously the impact is way different: suddenly the team can create as many branches as they want. If you want to work on a new ticket, you can go and create a branch for it, lightly, no planning, no approvals, because branches suddenly become an instrument of productivity, not a release event. You can use branches to develop tasks and they can be timely merged, but the review process will be driven by the branch (something Git users take for granted but many game teams do not because Git can’t handle the sizes of their binaries fluently).&lt;/p&gt;

&lt;p&gt;Same can happen with release branches, experiment branches, ideas, etc. Fast branching opens up improvements that go beyond the current workflow.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Art and code in a single repo erases artificial complexity
&lt;/h2&gt;

&lt;p&gt;And branching is just one example, but the same happens with the ability to handle code and art, no matter the size, in the same repo. Do you simply accept the extra complexity of dealing with code in one repo and art in a second one because the system that manages code is not good with big assets, and the one that deals with large binaries doesn’t offer the features programmers demand?&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Like a friend of mine always says for their data analytics platform: speed matters. It matters a lot. It does not just remove blockers, it creates whole new opportunities when you can suddenly perform operations that you accepted to be costly in almost no time.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  About the Author
&lt;/h2&gt;

&lt;p&gt;Pablo Santos Luaces is the founder and former CTO of Plastic SCM, SemanticMerge, and Gmaster. An accomplished programmer specializing in version control and merge technologies, he now shares his insights on these topics through writing and speaking, including on his Medium page.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>versioncontrol</category>
      <category>gamedev</category>
      <category>unity3d</category>
    </item>
    <item>
      <title>A step-by-step guide to versioning a Godot game project with Diversion</title>
      <dc:creator>Mina Pêcheux</dc:creator>
      <pubDate>Tue, 19 Dec 2023 09:17:14 +0000</pubDate>
      <link>https://dev.to/diversion/a-step-by-step-guide-to-versioning-a-godot-game-project-with-diversion-3i3h</link>
      <guid>https://dev.to/diversion/a-step-by-step-guide-to-versioning-a-godot-game-project-with-diversion-3i3h</guid>
      <description>&lt;p&gt;Whether you’re a long-time open-source game dev or an enthusiastic Godot newcomer, you probably know that getting used to a sound and robust workflow is an essential skill for any kind of software developer.&lt;/p&gt;

&lt;p&gt;And, in particular, having a way of keeping track of your project’s progress is a really cool and often necessary thing to set up early on. Which is why, over the years, the game dev community has become more and more interested in version control for game projects.&lt;/p&gt;

&lt;p&gt;In fact, in Godot, there are some built-in tools using one of the go-to VCS solutions, Git…&lt;/p&gt;

&lt;p&gt;But, as we’ve discussed in several articles before, some of those “old timers” in the VCS worlds aren’t really the best fit for games, because those are complex multimedia projects. And so, as time went by, various alternative projects started to grow to offer new and more suited version control tools to game devs.&lt;/p&gt;

&lt;p&gt;Among which: Diversion, a cloud-native VCS that is meant to enable game creators to work quickly, with nice real-time collaborative dev, and an easy-to-use interface.&lt;/p&gt;

&lt;p&gt;So, in this tutorial, we’ll explore the basics of using &lt;a href="https://www.diversion.dev/"&gt;Diversion&lt;/a&gt; to version a Godot project, from setting up an account to actually committing updated work, tracking your progress in the online web app, and even doing more advanced tasks like creating branches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring the Diversion version control tool
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A quick note on Diversion’s pricing system
&lt;/h3&gt;

&lt;p&gt;Like most of the cloud-based versioning tools, Diversion’s pricing works with tiers, and you can keep with the free one until you’ve reached the thresholds… which here, are actually pretty sweet!&lt;/p&gt;

&lt;p&gt;Indeed, as shown on the pricing page, with a completely &lt;strong&gt;Free&lt;/strong&gt; tier account, you can have 10 repositories, 100GB of storage and 10 collaborators - and you can use virtually all features of the tool:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KoUd9APZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ycy44do55vgcgs52ljwj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KoUd9APZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ycy44do55vgcgs52ljwj.png" alt="diversion-pricing" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, if you need to scale up, you can switch to the &lt;strong&gt;Team&lt;/strong&gt; or the &lt;strong&gt;Enterprise&lt;/strong&gt; tier, depending on your needs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Also, it’s important to remember that Diversion is still in beta. So, it’s already quite promising - and there’s even more coming! In particular, integrations with CI/CD solutions or Git are on their way, to make it even easier to integrate Diversion in your usual workflow.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating your account
&lt;/h3&gt;

&lt;p&gt;Alright so - let’s say for now you want to explore the tool, and you’re fine with the (loose) limitations of the &lt;strong&gt;Free&lt;/strong&gt; tier. Then, first things first, to get started using Diversion, you’ll need to create a new account :)&lt;/p&gt;

&lt;p&gt;It’s actually very easy! All you need to do is go to &lt;a href="https://www.diversion.dev/"&gt;Diversion’s website&lt;/a&gt; and, in the top-right corner, click on the &lt;strong&gt;Login&lt;/strong&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pMW06vyZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bpt08wepb81dd9c2ibbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pMW06vyZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bpt08wepb81dd9c2ibbu.png" alt="diversion-sign-up" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will bring you to the login form, where you can also sign up for a new account by using the &lt;strong&gt;Sign up&lt;/strong&gt; call-to-action at the bottom:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6sgrStsL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3tn4dm83yny5g06knr6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6sgrStsL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3tn4dm83yny5g06knr6a.png" alt="diversion-sign-up2" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s where you’ll be able to enter your new Diversion account info (username, email, password) or choose to sign up using a Google account, and then you’ll simply need to confirm with the unique code sent to your email address:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FE7gQYZ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zr6mukksnw1wv5yxz5su.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FE7gQYZ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zr6mukksnw1wv5yxz5su.png" alt="diversion-sign-up3" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that’s it! At this point, you’ll have your Diversion account, and you’ll be auto-redirected to the welcome page with a step-by-step onboarding wizard (the following screenshot shows just the first step of this wizard):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kKOxtuaF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/81a7x8ymfseppoey6n5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kKOxtuaF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/81a7x8ymfseppoey6n5k.png" alt="diversion-startup-wizard" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This wizard walks you through the base steps for installing the Diversion command-line tool (&lt;code&gt;dv&lt;/code&gt;), configuring it to use your new account, and using it to initialise or update a Diversion version control repository.&lt;/p&gt;

&lt;p&gt;So, now that we have access to the tool, let’s see how to actually set it up on our computer and use it for our own projects…&lt;/p&gt;

&lt;h3&gt;
  
  
  A quick peek at the Diversion CLI tool
&lt;/h3&gt;

&lt;p&gt;Before talking about mixing Diversion with Godot, we need to start by installing and preparing our Diversion CLI. To do this, we simply have to use the CURL download URL provided on the welcome page.&lt;/p&gt;

&lt;p&gt;This depends a bit on your OS. You’ll find all the necessary details in the quickstarting guide - but typically, for my Mac, I can use the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -sL https://get.diversion.dev/unix | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it’s done, we can simply open a new terminal (or re-source the current one to take the changes into account), and we’ll have a brand new &lt;code&gt;dv&lt;/code&gt; tool we can use to init or inspect a Diversion repo.&lt;/p&gt;

&lt;p&gt;For example, to check that all went well, just call &lt;code&gt;dv help&lt;/code&gt; - you should get a detailed list of all the available commands, with neat (and even coloured!) instructions that show you a lot of nice tricks for using this CLI tool:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U2bdcIn4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qch2grxyl00uoay40h4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U2bdcIn4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qch2grxyl00uoay40h4d.png" alt="diversion-cli-help" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll notice that there are actually a good deal of commands you can play with to create, update, reset or share your repo contents.&lt;/p&gt;

&lt;p&gt;By the way a nice thing is that you can use all of those in interactive mode by first typing &lt;code&gt;dv&lt;/code&gt; in your console to enter a new Diversion CLI context, and then use those commands without the dv prefix at the beginning. Plus, this gives you really cool bonus helpers like a command menu, and autocomplete!&lt;/p&gt;

&lt;p&gt;And if you’re a bit familiar with the famous Git VCS, you’ll also see that many of those commands are super similar. So, basically, if in doubt, you can usually start by “mimicking” your &lt;code&gt;git [X]&lt;/code&gt; command with &lt;code&gt;dv [X]&lt;/code&gt;, and there is a good chance that it will work directly :)&lt;/p&gt;

&lt;p&gt;Though, because Diversion is first-and-foremost a collab dev cloud-based version control tool, there’s also many additional utilities for working with other teammates, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dv status -sync-only&lt;/code&gt; or &lt;code&gt;dv status -wait&lt;/code&gt;: Compared to the simple git status command, Diversion lets you enforce the sync has happened if you want by using &lt;code&gt;dv status -wait&lt;/code&gt;. This way, you’re sure that you’re seeing the latest changes in your repo at any moment!&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dv invite&lt;/code&gt;: It allows you to invite a new collaborator to the repo by passing in their email. Note that you can also specify the level of access you want to give them by adding an additional &lt;code&gt;&amp;lt;access&amp;gt;&lt;/code&gt; option:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dv invite &amp;lt;email&amp;gt; –-access WRITE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dv invite &amp;lt;email&amp;gt; –-access READ&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dv invite &amp;lt;email&amp;gt; –-access ADMIN&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dv share&lt;/code&gt;: It shares your repo with one or more other Diversion usernames, either in read-only mode (default) or in read/write mode if you add the &lt;code&gt;–-rw&lt;/code&gt; option at the end. The users are referenced by their usernames, and you can pass a list of space-separated usernames if you want: &lt;code&gt;dv share &amp;lt;user1&amp;gt; &amp;lt;user2&amp;gt; –-rw&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moreover, the &lt;code&gt;dv login&lt;/code&gt;, &lt;code&gt;dv logout&lt;/code&gt; and &lt;code&gt;dv view&lt;/code&gt; are commands to directly sign in or out of your Diversion account, and to use the web interface instead of the CLI if you prefer to manage your repo.&lt;/p&gt;

&lt;p&gt;Typically, if you want to login into your account from the CLI, you can just run &lt;code&gt;dv login&lt;/code&gt;. Your browser will automatically open an OAuth authentication page and, assuming you’ve logged in your Diversion account earlier, you’ll directly be signed in, and you’ll be able to instantly come back to your shell.&lt;/p&gt;

&lt;p&gt;Ok - now, with all this in mind, let’s see how to use the &lt;strong&gt;code&amp;gt;dv&lt;/strong&gt; CLI to version a simple Godot project, and discover the Diversion web app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioning a Godot game with Diversion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Preparing the Godot demo project
&lt;/h3&gt;

&lt;p&gt;For this tutorial, I’m going to use Godot’s “Dodge the creeps” official demo project, which you can get for &lt;a href="https://github.com/godotengine/godot-demo-projects/tree/3.5-9e68af3/2d/dodge_the_creeps"&gt;free on the official Github&lt;/a&gt;. It’s a basic 2D game where you control an avatar with the arrow keys and you have to avoid the enemies that are spawning randomly around you:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p_LhVZ5v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rm2osk1o9ty525u29zwj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p_LhVZ5v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rm2osk1o9ty525u29zwj.gif" alt="demo-game" width="691" height="959"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Although the Github branch is marked as 3.5X, the project also works directly in Godot 4 :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To get the project, you can download the whole repo as a zip, or clone it locally on your computer using Git; then, open your Godot app and, in the startup project browser, click the &lt;strong&gt;Scan&lt;/strong&gt; option:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6_YKab_l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nb7ovcl2o2di3lo3elf0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6_YKab_l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nb7ovcl2o2di3lo3elf0.png" alt="godot-scan-project" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, go to your local copy of the &lt;code&gt;dodge-the-creeps/&lt;/code&gt; demo folder, and click &lt;strong&gt;Select Current Folder&lt;/strong&gt; - this will auto-add the project to your Godot projects list, and you’ll be able to double-click on it to open it as usual:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bZPiB9Ac--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wzykgwitgd533zk4iy62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bZPiB9Ac--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wzykgwitgd533zk4iy62.png" alt="godot-open-project" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside, you’ll find a simple 2D scene that looks like this - and that you can run to try out the demo game yourself :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rcl-02s3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pyxflgrlkimngka4h0ns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rcl-02s3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pyxflgrlkimngka4h0ns.png" alt="godot-project-overview" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Initialising the Diversion repo
&lt;/h3&gt;

&lt;p&gt;**_Important note: This part of the guide assumes you’ve logged into your Diversion account from the CLI, using the &lt;code&gt;dv login&lt;/code&gt; command, as discussed before :)&lt;/p&gt;

&lt;p&gt;Now that we have a Godot project to version, let’s see how to use Diversion for it.&lt;/p&gt;

&lt;p&gt;To start up, we can just open a shell, go to this folder and run the &lt;code&gt;dv init&lt;/code&gt; command. We need to pass in the path of the folder to create a repo for, so here it’s just our current folder (&lt;code&gt;dv init .&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oBvAA4od--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bog4s44o9pld7997wz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oBvAA4od--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bog4s44o9pld7997wz9.png" alt="diversion-repo-init" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will do several things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It will create a new Diversion repo linked to this specific directory.&lt;/li&gt;
&lt;li&gt;It will auto-add a &lt;code&gt;.dvignore&lt;/code&gt; file in the folder, which is the equivalent of the &lt;code&gt;.gitignore&lt;/code&gt; file for a Git-versioned project.&lt;/li&gt;
&lt;li&gt;It will register this repository in your Diversion account to make it accessible from anywhere on the web app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that the base contents &lt;code&gt;.dvignore&lt;/code&gt; file are improved regularly by the Diversion team and now contains some goodies for Godot game devs (like the &lt;code&gt;.godot/&lt;/code&gt; folder that is auto-generated by any Godot 4 project, and contains some cache files that don’t require versioning). So although you can always edit it to fit your own specific architecture, it should usually be fine as-is for your game projects :)&lt;/p&gt;

&lt;p&gt;So, now, let’s have a look at what files in our Godot demo project are ready for versioning by running the &lt;code&gt;dv status&lt;/code&gt; command:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HqwXTJ1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dv6jfkguyupcv0rp09td.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HqwXTJ1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dv6jfkguyupcv0rp09td.png" alt="diversion-repo-status" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s nice!&lt;/p&gt;

&lt;p&gt;You see that our Diversion versioning only takes into account the “real” assets in our project. Moreover, we can notice something at the very bottom of the screenshot: Diversion shows us a &lt;strong&gt;Sync complete&lt;/strong&gt; message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HQjzQwkr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dvkhy2nhd1hyjldv31kn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HQjzQwkr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dvkhy2nhd1hyjldv31kn.png" alt="diversion-repo-synced" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s because, as we said before, Diversion being a cloud-native tool, your repositories are always synced to the online version available via the web app…&lt;/p&gt;

&lt;h3&gt;
  
  
  Exploring the Diversion web app
&lt;/h3&gt;

&lt;p&gt;To get a direct link to the online version of this repo, we’ll simply run the &lt;code&gt;dv view&lt;/code&gt; command. This opens a new browser page in the Diversion app (as usual, you’ll need to be logged in to see it) that is dedicated to this specific project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AblITBsX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6wahbap4qjhsxchhv8u3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AblITBsX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6wahbap4qjhsxchhv8u3.png" alt="diversion-webapp" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the very top, we see the name of the repo and the branch we’re currently viewing - here it’s &lt;strong&gt;dodge-the-creeps&lt;/strong&gt;, and &lt;strong&gt;main&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then, below, we have a list of files corresponding to our current workspace that perfectly reflects the results from our last &lt;code&gt;dv status&lt;/code&gt; command, and a list of the latest commits. You see that we can also commit files from this interface using the left sidebar.&lt;/p&gt;

&lt;p&gt;Typically, let’s say that we want to add all of those files, and create a new commit about adding the Godot demo project. Then we could click on the checkbox at the very top of the workspace view to select all files, enter our commit message in the input field at the bottom, and click the &lt;strong&gt;Commit&lt;/strong&gt; button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UALEKx0r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l0m1fno7nn3sx9aupcoe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UALEKx0r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l0m1fno7nn3sx9aupcoe.png" alt="diversion-web-commit" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As soon as we click on the Commit button, we get a confirm window, and then a quick spinner while Diversion actually does the commit… and here we go!&lt;/p&gt;

&lt;p&gt;Our new commit now appears in the list of recent commits on the right, and we see our workspace has no modified files anymore :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6eU4-Stq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h292nhr52r7pdv1s39za.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6eU4-Stq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h292nhr52r7pdv1s39za.png" alt="diversion-web-last_commit" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the way, if you have a longer history in your Diversion repo and you want to keep track of some older modifications, you can also go to the left sidebar and switch over to the &lt;strong&gt;History&lt;/strong&gt; tab to see the full evolution of your project, or search for a specific commit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CkZkl5RP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qnrcafh0jbmcusms6afy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CkZkl5RP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qnrcafh0jbmcusms6afy.png" alt="diversion-web-history" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, we could also come back to our shell and, inside our Diversion-versioned repo, run the &lt;code&gt;dv log&lt;/code&gt; command - and sure enough, our new commit is already synced locally, too!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DgRNyS32--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zb4648ft9h3sudal0ri0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DgRNyS32--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zb4648ft9h3sudal0ri0.png" alt="diversion-repo-log" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we know the basics, let’s see how to use branches in Diversion to help organise collaborative development, handle important features, or just follow common DevOps workflows like &lt;a href="https://www.diversion.dev/blog/the-agile-the-fragile-and-the-iron-fist-of-branching-strategies"&gt;Trunk-based Development&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Working with branches
&lt;/h3&gt;

&lt;p&gt;As most (if not all) VCS tools, Diversion has branch-related features that let us easily create, switch between and delete branches.&lt;/p&gt;

&lt;p&gt;So in this last part, we’re going to quickly recall why using branches when versioning a project can be beneficial, and we’ll see how to apply this to our Diversion/Godot demo project.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why should I use branches when working with a versioning tool?
&lt;/h4&gt;

&lt;p&gt;Using branches in version control systems is an efficient way to manage code changes, collaborate with team members, experiment with new features, and maintain a stable and organised codebase.&lt;/p&gt;

&lt;p&gt;Most notably, branches provide the following advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolating new features or big changes: Branches allow you to work on specific features or changes without affecting the main or stable codebase. This is crucial in preventing unfinished or potentially unstable code from impacting the rest of the project.&lt;/li&gt;
&lt;li&gt;Supporting parallel development: Multiple developers can work on different features simultaneously by creating separate branches. This parallel development can significantly speed up the overall progress of a project - and it’s totally aligned with the main objectives of Diversion, and its cloud-native nature :)&lt;/li&gt;
&lt;li&gt;Testing or experimenting: Branches are also a safe space for tinkering with new ideas or implementing potentially disruptive changes. Developers can create feature branches, test new code, and easily discard or merge it back into the main branch if successful.&lt;/li&gt;
&lt;li&gt;Collaborating &amp;amp; doing code reviews: Branches help with the code review process, too. After they’ve created their branch and committed changes on them, developers can initiate a pull request for team members to review before merging into the main branch. This ensures that changes meet quality standards and follow the team's coding conventions.&lt;/li&gt;
&lt;li&gt;Managing releases: Branches are often used to manage releases. This can help plan, verify and execute a nice release schedule while always maintaining a stable main branch.&lt;/li&gt;
&lt;li&gt;Doing hotfixes: If critical issues are discovered in the released version, branches can be used for quick hotfixes. This is a sort of “practical application” of the parallel development mentioned before: thanks to branches, you can address urgent problems without affecting the ongoing development work in the main branch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So having branch-related features is a must-have for version control solutions - and Diversion has got some to make it easy to work in parallel.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using branches in Diversion
&lt;/h4&gt;

&lt;p&gt;If we take a look at the &lt;code&gt;dv branch&lt;/code&gt; documentation in the CLI tool, by running the &lt;code&gt;dv help branch&lt;/code&gt; command, we get the following: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DwF4_ql2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eisgxhqxtbczwivxogdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DwF4_ql2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eisgxhqxtbczwivxogdp.png" alt="diversion-cli-branch" width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test the branch features, what we’re going to do is change the Godot demo a little to have enemies move more slowly; we’ll suppose this is some experimental changes that we want to test to make the game easier, but we’re not too sure it will be perfect - so we’d rather use a branch to isolate our new development.&lt;/p&gt;

&lt;p&gt;To create our new branch, we can use &lt;code&gt;dv branch -c &amp;lt;name&amp;gt;&lt;/code&gt;. Then, if we run the &lt;code&gt;dv status&lt;/code&gt; command, we’ll see that the CLI auto-switched us to our new branch (contrary to Git, for example, that doesn’t auto-check you out on your new branch):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xOIdcM5w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kohyg06ep5dsbxl2gnfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xOIdcM5w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kohyg06ep5dsbxl2gnfq.png" alt="diversion-repo-branch" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want, you can also have a look at the browser and you’ll see that this new branch will have appeared in the project online dashboard, and you’ll be switched on it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--poaVVGKZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3y32tcwk2x00ave8nem0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--poaVVGKZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3y32tcwk2x00ave8nem0.png" alt="diversion-web-branch" width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’re now on our new branch, ready to work. The next step is to actually do our change in the code, to reduce the enemies’ speed.&lt;/p&gt;

&lt;p&gt;To do this, let’s go to the &lt;code&gt;Main.gd&lt;/code&gt; script, in the &lt;code&gt;_on_MobTimer_timeout()&lt;/code&gt; function, and replace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Choose the velocity for the mob.
var velocity = Vector2(randf_range(150.0, 250.0), 0.0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Choose the velocity for the mob.
var velocity = Vector2(randf_range(50.0, 150.0), 0.0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run the game again, you’ll notice that the enemies now move more slowly, making it slightly easier to dodge them and last longer. The modified file is also visible if we do a new &lt;code&gt;dv status&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sqpR9aGa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xbp8ngmh4hy8n01s6y81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sqpR9aGa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xbp8ngmh4hy8n01s6y81.png" alt="diversion-repo-status" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, in the web app, you can click on the modified file in the &lt;strong&gt;Workspace&lt;/strong&gt; tab, and select the split view at the top to compare the modified version to the previous one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wPEqLzCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/he2ckscl2j9rtrv30bqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wPEqLzCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/he2ckscl2j9rtrv30bqk.png" alt="diversion-web-compare" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok so - now, let’s commit our changes in the branch, so that everyone in the team can use this branch to try out our modification and give some feedback.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6HZeg47c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kl7gd1pe04o1gth73lkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6HZeg47c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kl7gd1pe04o1gth73lkc.png" alt="diversion-web-commit" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You could also use the shell to commit the file by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dv commit -m "test(core): reduce enemies speed" Main.gd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus, if you want, you can always compare two branches by selecting them in the dropdown at the top, and then selecting the commits to compare:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZIhWOuYn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7zko1wwwns8nsu2oomio.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZIhWOuYn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7zko1wwwns8nsu2oomio.gif" alt="demo-compare-branches" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, suppose the team decides to keep this change and wants to integrate it in the production version of the game. Then, to re-merge this new commit in the main branch, we just need to switch back to this branch (with &lt;code&gt;dv checkout main&lt;/code&gt;), and use the &lt;code&gt;dv merge&lt;/code&gt; command with our test branch name:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zgnwl0A---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0op5hpfbp7yzw0kwnwgl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zgnwl0A---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0op5hpfbp7yzw0kwnwgl.png" alt="diversion-repo-merge" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s important to remember that merging a branch doesn’t automatically destroy it (because you might want to keep working on it afterwards, depending on the situation). So to really clean up our work session here, we should also remove our test branch.&lt;/p&gt;

&lt;p&gt;This screenshot shows the state of the branches before deletion (the first run of &lt;code&gt;dv branch&lt;/code&gt;), the deletion of the branch (&lt;code&gt;dv branch -d test/enemies-slower&lt;/code&gt;) and the state of the branches after deletion (the second run of &lt;code&gt;dv branch&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O4Mcvxpt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlw6az94g3yht3w2aq6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O4Mcvxpt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlw6az94g3yht3w2aq6b.png" alt="diversion-repo-check-branches" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, as usual, you can come back to the web app to check the repo is perfectly reflected, and the test branch has indeed disappeared:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8cY5Yr60--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ai6mjpkjblxc5jgc0am0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8cY5Yr60--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ai6mjpkjblxc5jgc0am0.png" alt="diversion-web-check-branches" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So there you go: you now know how to initialise, configure and update a Diversion repository for a Godot project. And you even know how to work with branches to get a more organised workflow and support your collaborative dev!&lt;/p&gt;

&lt;p&gt;Of course, this was just a quick intro to using Diversion for version control, and more specifically for a Godot project. But of course, if you’re curious, you should definitely have a go by &lt;a href="https://www.diversion.dev/"&gt;going to the official website&lt;/a&gt;, or &lt;a href="https://discord.com/invite/HDAGJvgkuT"&gt;joining their Discord&lt;/a&gt; to ask all your questions directly :)&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>diversion</category>
    </item>
    <item>
      <title>Choosing your weapon: SaaS or self-hosted version control?</title>
      <dc:creator>Mina Pêcheux</dc:creator>
      <pubDate>Fri, 03 Nov 2023 11:13:02 +0000</pubDate>
      <link>https://dev.to/diversion/choosing-your-weapon-saas-or-self-hosted-version-control-3e63</link>
      <guid>https://dev.to/diversion/choosing-your-weapon-saas-or-self-hosted-version-control-3e63</guid>
      <description>&lt;p&gt;In the fast-paced video game industry, being able to efficiently manage, track, and collaborate on complex multimedia projects is essential. You need to have a way of iterating quickly, of checking everything works with every release, and of merging together all the code and the assets the team produces.&lt;/p&gt;

&lt;p&gt;That’s why today, many game studios, large or small, use version control tools.&lt;/p&gt;

&lt;p&gt;Of course, as we discussed in other articles, &lt;a href="https://www.diversion.dev/blog/version-control-for-game-devs-survey-results"&gt;finding the right version control solution for your team might not always be easy&lt;/a&gt;, especially taking into account &lt;a href="https://www.diversion.dev/blog/can-artists-benefit-from-version-control-too"&gt;the specific needs of developers and artists&lt;/a&gt;. But luckily, there are now more and more available, and several projects aim at providing good versioning utilities specifically in the context of video games.&lt;/p&gt;

&lt;p&gt;However, there is still a question that you will need to answer when picking the best version control tool for your team, which is: “should I go for a SaaS or a self-hosted solution?”.&lt;/p&gt;

&lt;p&gt;Well, in this article, we’re going to briefly go over the advantages and the drawbacks of each system so that you can get a better idea of which one best suits your own situation :)&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick recap: SaaS VS self-hosted
&lt;/h2&gt;

&lt;p&gt;Just before we dive in, let’s briefly sum up what a SaaS or a self-hosted VCS solution is.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SaaS version control is a system where code, assets, and project data are stored and managed on servers hosted by third-party cloud providers. Generally speaking, this approach allows for real-time collaboration and easy access from anywhere with an Internet connection.&lt;/li&gt;
&lt;li&gt;Self-hosted version control is a system where the code and project data are stored and managed by the team itself. This approach grants full control and ownership of the infrastructure, but it requires in-house hardware and/or software maintenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s important to note though that this crude distinction is quite basic, and we’re simplifying the comparison by grouping together some variants. SaaS VCS could also extend to private servers managed by a third-party provider; and self-hosting can consider both self-hosted private servers, and self-hosted on-prem(ise) servers.&lt;/p&gt;

&lt;p&gt;Basically, here, we’re mostly focusing on the difference between “having someone else handle the VCS in terms of hardware and software” (SaaS) or “taking care of everything on your own, from install to maintenance” (self-hosted) :)&lt;/p&gt;

&lt;p&gt;Alright so - now, with this in mind, let’s see what are the main differences between those two systems, and which one may be more adapted to certain team structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  The powers - and risks! - of SaaS version control tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Benefiting from easy access &amp;amp; collaboration
&lt;/h3&gt;

&lt;p&gt;One of the most obvious advantages of SaaS version control systems is that they’re more easily accessible for real-time collaboration (this service being managed by the SaaS provider itself). So usually, even if your teammates are spread across the globe, they can still work simultaneously on the same project and share their results instantly.&lt;/p&gt;

&lt;p&gt;Because every designer, artist and developer can easily access the latest version of the game assets and code at any time, it’s also easier to stay consistent throughout the development process and iterate on the project in an interesting way.&lt;/p&gt;

&lt;p&gt;All this leads to improved efficiency, faster decision-making, and a more streamlined workflow.&lt;/p&gt;

&lt;p&gt;Moreover, since the data is centralised in one place, some SaaS solutions offer really nice features such as automatic conflict prevention, to help teams avoid infuriating afternoon-long merge conflict resolution sessions - ‘cause the system can check continuously whether a file is currently being edited and ensure everyone’s in sync, without people having to manually lock and unlock files.&lt;/p&gt;

&lt;p&gt;(Note that this can also be true of a self-hosted VCS, if the version control doesn’t use a Git-like distributed architecture ;))&lt;/p&gt;

&lt;h3&gt;
  
  
  Taking advantage of scalability &amp;amp; flexibility
&lt;/h3&gt;

&lt;p&gt;Video games are strange beasts that mix a lot of different fields of expertise - be it in terms of people’s skills, or in terms of file types and sizes! Handling complex binary assets, and large multimedia files like images, sounds, 3D models or even movies &lt;a href="https://www.diversion.dev/blog/the-key-to-proper-asset-management-in-game-development"&gt;is always difficult&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nowadays, some VCS solutions are very much focused on managing these large files and allowing game creators to keep all their assets in the same place, whether they are small light scripts or big heavy 4k textures.&lt;/p&gt;

&lt;p&gt;And, truth is - a SaaS system is often a nice answer here :)&lt;/p&gt;

&lt;p&gt;Indeed, a SaaS tool is inherently scalable: it’s based on technologies that can be boosted by upgrading the hardware and the infrastructure seamlessly. And, of course, because this is handled by the SaaS VCS provider, the game team is free to continue working on their project without all these maintenance headaches.&lt;/p&gt;

&lt;p&gt;This “auto-scaling” is also often supported by a lot of other nice-to-haves or auxiliary tools that help facilitate the overall versioning workflow. Usually, SaaS version control doesn’t exist in isolation; rather, it’s part of a broader ecosystem of cloud services. This complete “all-in-one” pack can be a real game-changer for video game creators, because it can simplify the day-to-day project management by keeping everything centralised in one place.&lt;/p&gt;

&lt;p&gt;For example, having task management tools, continuous integration, deployment pipelines and review features can be an amazing time-saver and further power team collaboration.&lt;/p&gt;

&lt;p&gt;The goal, as always, is to reduce menial manual tasks and automate them to improve the development process itself - and by taking advantage of cloud-based services, game developers can delegate a lot of the boring maintenance issues and, instead, focus on efficiently realising their own dream and making games for all of us.&lt;/p&gt;

&lt;h3&gt;
  
  
  Going to the cloud… for data protection &amp;amp; security?
&lt;/h3&gt;

&lt;p&gt;The third big advantage of a SaaS version control system is often said to be data protection and security. And even if it’s true that there are a lot of super neat and reassuring utilities when using this kind of solution, perhaps there’s also some side-stuff worth remembering when diving into a SaaS VCS.&lt;/p&gt;

&lt;p&gt;So, on the plus side, using SaaS version control is obviously excellent as far as data redundancy goes. Since you literally have a remote backup of all your data online, and this data is often also backed up again by the VCS service provider, as part of the reliability they are committed to provide. So, you really run less risk of seeing all your week’s work disappear because of a wrong move! (Typically, cloud providers invest a lot on robust redundancy mechanisms, and they distribute the data across multiple data centres or regions to make sure your project data remains safe and accessible at any time, with as little risk of outage or downtime as possible.)&lt;/p&gt;

&lt;p&gt;A SaaS VCS is also considered really secure because, unless they want to go out of business, cloud providers basically &lt;em&gt;need&lt;/em&gt; to put a lot of money in installing heavy security measures and guarding everyone’s assets. Of course, any system can be hacked… but at least, they put a lot of effort and capital into making sure it happens as rarely as possible here.&lt;/p&gt;

&lt;p&gt;That being said… some people have also pointed out that, while your cloud data is indeed secured from the outside, you also are forced to entrust the cloud provider itself with it! Meaning that, in a world of secrets and dark trades like the one of video games, you might be giving your private data to another company that then just promises it will be cool and not backstab you in any way.&lt;/p&gt;

&lt;p&gt;No, let’s be honest - I’m painting a rather dark picture of it and, in fact, most SaaS providers aren’t just terrible sharks lurking and waiting to feed off your data. They’re sincerely concerned about obeying the various regulations and laws regarding data privacy, they comply with all legislations about data storage and sensitive data management, and they respect intellectual property.&lt;/p&gt;

&lt;p&gt;I just thought it was worth mentioning this issue so that you also see some of the risks of storing and distributing your data online via a cloud provider, if not every actor in the chain is doing their best to up the quality of the service ;)&lt;/p&gt;

&lt;h3&gt;
  
  
  What if you can’t access the cloud service?
&lt;/h3&gt;

&lt;p&gt;Actually, another smaller but notable drawback of SaaS VCS is that, because everything’s online, you need to have the Internet to connect to them and get access to your data. Oftentimes, a SaaS version control tool will have very limited functionalities when used locally on your machine offline - if it has any.&lt;/p&gt;

&lt;p&gt;Game studios that want to go for a SaaS VCS therefore need to consider this failure point, especially in regions with unreliable or slow internet infrastructure.&lt;/p&gt;

&lt;p&gt;And, also, there’s always the possibility that it’s the service &lt;em&gt;itself&lt;/em&gt; that is out. In other words, even though &lt;em&gt;you&lt;/em&gt; are connected, the cloud VCS is offline and down for some reason. Although the cloud providers have many failsafes to avoid this scenario, it can still happen and, in that case, you need to have some contingencies in place to address potential downtime and ensure the work can continue offline.&lt;/p&gt;

&lt;p&gt;However, you should also keep in mind that a self-hosted system, even if it’s completely on-prem, can fail too - there might be a connectivity problem, some downtime on your data centre, or a maintenance issue that your IT team is working on and prevents you from accessing the data…&lt;/p&gt;

&lt;h3&gt;
  
  
  Addressing the cost issue
&lt;/h3&gt;

&lt;p&gt;Finally, last but not least, there’s the question of price.&lt;/p&gt;

&lt;p&gt;SaaS version control systems typically operate on a subscription-based or a pay-as-you-go pricing model. So, while this model provides flexibility by allowing teams to pay only for what they use, it also means you’ll have ongoing expenses. Over time, subscription costs can add up, and perhaps be more expensive than the initial investment of a self-hosted version control solution.&lt;/p&gt;

&lt;p&gt;Smaller indie studios or startups with limited budgets may find it challenging to manage these recurring costs - in particular if they can’t accurately predict the thresholds they’ll meet… although, to be fair, most SaaS VCS offer a free base package, and there are some thresholds before you’re required to pay anything :)&lt;/p&gt;

&lt;p&gt;For larger game development teams, the problem is a bit different. On the one hand, those companies usually have more money, so they can handle the price of a SaaS version control tool. But on the other hand, the subscription costs of SaaS version control can become substantial. As the team size grows, there will be more and more people in need of access to the service, and you’ll have to pay more and more subscriptions.&lt;/p&gt;

&lt;p&gt;This cost scaling can make SaaS solutions less cost-effective for large studios compared to self-hosted alternatives, which may have just a one-time cost upon install. However, it is not always a clear-cut decision since, as we’ll discuss in a second, many self-hosted version control systems have per-seat cost or annual subscriptions, too, and they always require resources on your part…&lt;/p&gt;

&lt;h3&gt;
  
  
  To recap?
&lt;/h3&gt;

&lt;p&gt;So ok: SaaS VCS offer a lot of good perks that are really well-aligned with the unique specificities of modern video game creation. They don’t require any set-up or maintenance, give teams instant access from anywhere in the world, they allow for easy sharing and collaboration (sometimes with auto-merge conflicts prevention), they provide seamless scalability, and they usually have a lot of security measures in place to ensure your data stays safe and backed-up.&lt;/p&gt;

&lt;p&gt;However, they also introduce some concerns about data privacy, and they may go offline and stop your production if you don’t have a backup plan - plus the ongoing subscription fees (or the pay-as-you-go models) can slowly start to cost a lot in your overall budget.&lt;/p&gt;

&lt;p&gt;That’s why some people prefer to turn to self-hosted solutions…&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you rather pick a self-hosted solution?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Managing &amp;amp; “securing” your data
&lt;/h3&gt;

&lt;p&gt;Obviously, as a counterpoint to SaaS solutions, one of the best things with a self-hosted VCS is that you’re totally in control of your data and their management. You don’t store your secrets on a third-party server - you keep everything at home, within your own secured infrastructure (of course - assuming you make sure it’s secured - see next section).&lt;/p&gt;

&lt;p&gt;This level of control is really important when you’re dealing with highly confidential intellectual property or proprietary tools, assets or even game mechanics. By keeping the data on a private server, or even on-prem, you ensure that your game’s source code and assets remain completely private.&lt;/p&gt;

&lt;p&gt;This complete control of the data also means that you are free to choose how you store it. You can tailor the system to your own needs, even if it means experimenting with some custom workflows. And you can perfectly link the version control system to the rest of your internal tools to craft an end-to-end superbly adapted game development pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  The importance &amp;amp; difficulties of operating your system
&lt;/h3&gt;

&lt;p&gt;But of course… on the down side, there’s the problem of maintaining and securing all of this by yourself. ‘Cause this “phenomenal data privacy perk” only stands as long as you can guarantee that your system &lt;em&gt;is&lt;/em&gt; well-setup and protected.&lt;/p&gt;

&lt;p&gt;Maintaining a self-hosted version control system, whether it is on a remote server or directly at your studio, means you have to manage both the hardware and the software infrastructure. This includes buying, setting up and preserving servers, storage devices, and the version control tool itself. In particular, regular updates, fixes and upgrades are often necessary to ensure the system is reliable and secure.&lt;/p&gt;

&lt;p&gt;So, contrary to a SaaS version solution where all this is handled by your SaaS provider and your team is 100% focused on creating games, when using self-hosted version control, you’ll almost certainly need to have some IT people dedicated to taking care of it!&lt;/p&gt;

&lt;p&gt;By the way, this IT team will also be in charge of handling data backups. It will need to put in place data redundancy mechanisms and it will be responsible for disaster recovery if there is ever any problem - all of which takes time and skills. And any lapses in this area can lead to data loss and big project setbacks, so better be careful…&lt;/p&gt;

&lt;h3&gt;
  
  
  Working on a local network… a gift or a curse?
&lt;/h3&gt;

&lt;p&gt;As we said before, video games often rely on massive assets such as high-resolution textures, 3D models, and complex animations. These big files are heavy on the storage… and also long to transfer!&lt;/p&gt;

&lt;p&gt;In that case, on-premise version control is actually a great way to have high-performance access to these large files from within a local office. Teams can retrieve and update assets swiftly, minimising the waiting time and optimising productivity. And even a self-hosted private server, if it is well-located and linked to your studio, can be a real step-up from using some SaaS solution.&lt;/p&gt;

&lt;p&gt;(‘Cause yeah, comparatively, using SaaS VCS can be slower and have bottlenecks at various points of the file exchanges, which can be risky if your production is on a tight schedule. Plus, if everyone is downloading the same huge asset at the same time, it will probably bog down the entire studio…!)&lt;/p&gt;

&lt;p&gt;On the other hand, being constrained to a local network also means that collaboration is more limited - at least, geographically speaking. If the company is really harsh on security measures, you might not be able to work somewhere else that on the company’s premises (though this is evolving as we enter a new era of post-Covid remote work-friendly setups). Of course, VPN is a common tool for dodging these issues and allowing people to access the private network from anywhere, but it does require some cumbersome setup steps whenever you want to collaborate with the rest of the team.&lt;/p&gt;

&lt;p&gt;Depending on how the infrastructure is built, and how the version control tool is made available to the team, cross-team collaboration can also be hindered and therefore slow down the overall process. In a really large studio with multiple teams working on different aspects of a project, coordination can become complex - teams can struggle to share assets seamlessly and maintain consistent project versions, which then leads to potential conflicts and delays. The only solution is then meticulous planning and communication… but this also takes time and skills ;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Predicting &amp;amp; lowering the costs
&lt;/h3&gt;

&lt;p&gt;Now, though maintaining your infrastructure can be hard, there’s a nice silver-lining in having it all in-house: you can predict and reduce the cost dedicated to this part of your activity.&lt;/p&gt;

&lt;p&gt;Indeed, while installing the whole system can be a bit expensive at first, this initial investment can become very cost-effective in the long run, especially for large studios.&lt;/p&gt;

&lt;p&gt;Also, you’re not subject to the same unpredictable variations of VCS-related costs as with a SaaS solution. When using on-prem version control, you can get fairly reasonable expectations of the budget needed, and you can allocate the rest of resources with more confidence.&lt;/p&gt;

&lt;p&gt;But.&lt;/p&gt;

&lt;p&gt;First, as we said before, the costs of SaaS solutions may actually be quite low for a while - if there are even any.&lt;/p&gt;

&lt;p&gt;Second, although on-prem VCS doesn’t directly scale the costs when your team expands, it’s not always that clear. Typically, if your IT team grows, then your personnel costs will as well. And actually, some solutions like Perforce or even Github and Gitlab when used on-prem price their service by the number of users - so you’re not necessarily getting the better bargain…&lt;/p&gt;

&lt;p&gt;And third, being fully on-prem only works as long as you’re sure you can maintain all of this. So even though it’s &lt;em&gt;technically&lt;/em&gt; possible… it can be a big risk to go fully on-prem, and it can actually create a lot of difficulties. You can of course consider those a risk worth taking, but it’s crucial to remember that the initial investment and the subsequent savings cost-wise are just one chunk of the equation; and there are a lot more things to consider before going this route.&lt;/p&gt;

&lt;p&gt;Typically - your system might suddenly be endangered if some unexpected twist forces you to adapt to rapid growth or re-provision your pipeline… because a self-hosted solution, especially if it’s on-prem, is way harder to scale properly than a SaaS one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the challenges of self-hosted version control scaling
&lt;/h3&gt;

&lt;p&gt;Game development studios live in a strange industry, where a small studio can suddenly boom and grow wild, especially after releasing a very successful title. (That’s a very-well known phenomenon in the indie community, where two people in their garage can make a completely revolutionary artwork that becomes a milestone for an entire genre! Yes, &lt;em&gt;The Binding of Isaac&lt;/em&gt;, I’m thinking of you…)&lt;/p&gt;

&lt;p&gt;However, self-hosted version control systems may struggle to adapt seamlessly to these changes. Scaling up the infrastructure to accommodate more people and more data can be tricky - it can be time-consuming and costly. So studios must be really careful when they plan for growth and find where best to direct resources to support this change and avoid bottlenecks.&lt;/p&gt;

&lt;p&gt;Even outside of those unique events, more common scaling challenges can be over- or underprovisioning your hardware and infrastructure. Because overestimating the system may result in unnecessary expenses… but underestimating can just lead to roadblocks. It’s essential to find the right balance and analyse your entire studio’s past, present and future state to scale everything as well as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  To recap?
&lt;/h3&gt;

&lt;p&gt;Self-hosted version control systems can offer a high degree of control and customisation. They are interesting in terms of data security and fast local access, or even in terms of budgeting because they make for lower and more predictable costs. But the trade-off to all that is that your studio is in charge of its entire infrastructure and hardware - so you’ll need to deal with data backup, maintenance, and even scaling difficulties.&lt;/p&gt;

&lt;h2&gt;
  
  
  So… what should you pick?
&lt;/h2&gt;

&lt;p&gt;At this point, you see that there is no perfect answer to this question. It all depends on the situation, such as the size of your team and projects, the security requirements you have, the budget you can afford to spend or your scaling ambitions.&lt;/p&gt;

&lt;p&gt;Still, it’s worth noting that, in all generality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SaaS VCS solutions are a good choice for small and mid-sized studios, startups, or indie developers who prioritise agility, remote collaboration, and cost-efficient scaling. They are particularly interesting when a team is spread around the globe, and they need quick deployment without the overhead of managing infrastructure, because with scalability, data backups and integration capabilities, they provide an “all-in-one” and “care-free” solution. \
But, of course, it also implies taking the related subscription or pay-as-you-go fees into account when budgeting your projects (though a lot of solutions remain free for quite a while…), and you put your IP in the hands of a third party - although you’re getting their guarantee for privacy :)&lt;/li&gt;
&lt;li&gt;Self-hosted VCS solutions can be better for large studios with substantial resources, sensitive IP, or a history of on-premise infrastructure. They’re valuable for studios who want to keep full control over their data, need high-performance (local!) access to large assets, or who can benefit from economies of scale… \
Still, all this requires in-house maintenance - meaning, usually, a dedicated IT team - and good planning to cope with scaling challenges, so this “efficient cost” can actually sometimes scale up, too!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;To sum up, picking between a SaaS version control system and a self-hosted solution is an important decision that will have an impact on the entire workflow of the game studio.&lt;/p&gt;

&lt;p&gt;Ultimately, there is no one-size-fits-all solution, and each type of VCS has its own advantages and drawbacks. The key is to find the one that suits your team and your project, and to not have your version control tools slow down your creators, but rather empower them to do what they like.&lt;/p&gt;

&lt;p&gt;That being said, nowadays, there are a lot of interesting tools for you to explore - and not just the old-timers like Git, PlasticSCM or Perforce.&lt;/p&gt;

&lt;p&gt;For example, if you’re a game dev looking for a free VCS SaaS option, then you might want to explore &lt;a href="https://www.diversion.dev/"&gt;diversion.dev&lt;/a&gt;, which is a really cool project with a lot of interesting features that, though it is in-development, is already very promising!&lt;/p&gt;

</description>
      <category>vcs</category>
      <category>saas</category>
      <category>devops</category>
    </item>
    <item>
      <title>Can artists benefit from version control, too?</title>
      <dc:creator>Mina Pêcheux</dc:creator>
      <pubDate>Fri, 15 Sep 2023 08:21:35 +0000</pubDate>
      <link>https://dev.to/diversion/can-artists-benefit-from-version-control-too-2i5m</link>
      <guid>https://dev.to/diversion/can-artists-benefit-from-version-control-too-2i5m</guid>
      <description>&lt;p&gt;Over the years, the little game studios have slowly turned into a big industry with a lot of high budget products. And despite some infamous AAA titles day-one patches and ridiculous bugs (yes, Cyberpunk, I’m looking at you), it’s impressive to see how much of this software works really well.&lt;/p&gt;

&lt;p&gt;Because video games are demanding and complex artworks that involve bringing together coders and artists. You have to ship a robust project, that is maintainable and upgradable while working on as many platforms as possible; you have to write whole stories, prepare hundreds of scenes, code complex behaviours for your AIs or create stunning visuals that can run on six-years old consoles.&lt;/p&gt;

&lt;p&gt;All of that requires some minimal level of organisation. And, most notably, a tool to clearly track the progression and history of your game, step-by-step, and file by file.&lt;/p&gt;

&lt;p&gt;That’s usually where version control comes in; after all, the whole goal is to keep an eye on the evolution of files, compare differences, help with teamwork by handling branches and merges, and get a backup of your latest working release. (Yes, you know: the one from before you added this new boss that crashes the entire level.)&lt;/p&gt;

&lt;p&gt;Except that there’s a catch. For now, most of those versioning tools are mostly made for code. Meaning that they’re good at tracking basic text files like scripts, but they struggle with large assets; and that they don’t always have the most user-friendly interface.&lt;/p&gt;

&lt;p&gt;So… what about artists? How can &lt;em&gt;they&lt;/em&gt; keep track of their work on assets?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why “coder-oriented” versioning tools rarely work for artists
&lt;/h2&gt;

&lt;p&gt;These days, there are a fair amount of version control systems - but the most famous ones come from the dev community, and are thus primarily designed for code versioning.&lt;/p&gt;

&lt;p&gt;The well-known &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git&lt;/a&gt;, the old &lt;a href="https://subversion.apache.org/" rel="noopener noreferrer"&gt;SVN&lt;/a&gt;, or the quite popular &lt;a href="https://www.plasticscm.com/" rel="noopener noreferrer"&gt;PlasticSCM&lt;/a&gt; and &lt;a href="https://www.perforce.com/products/helix-core" rel="noopener noreferrer"&gt;Perforce&lt;/a&gt; - those are all common tools for versioning. Yet artists are often having a hard time using them, because of various common problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complexity &amp;amp; user-unfriendliness
&lt;/h3&gt;

&lt;p&gt;The first culprit is the complexity of those tools.&lt;/p&gt;

&lt;p&gt;Git and SVN are probably the worst in that regard. Although they both offer &lt;a href="https://git-scm.com/downloads/guis" rel="noopener noreferrer"&gt;a few GUI clients&lt;/a&gt;, they’re filled with big concepts that aren’t that easy to grasp, and make versioning a real challenge in itself. Using branches properly can be very complex, and solving merge conflicts is nearly impossible when dealing with binary files like images or 3D models.&lt;/p&gt;

&lt;p&gt;Now, to be fair: PlasticSCM or Perforce offer way clearer interfaces, and GUI clients that make them fairly easy to use.&lt;/p&gt;

&lt;p&gt;Still, the moment you start to dive into more advanced stuff, you’re gonna have to know the tool really well in order to not inadvertently overwrite your colleague’s work, or erase last week’s progress.&lt;/p&gt;

&lt;p&gt;In particular, there is virtually no visual differencing in those tools. At best, the system will tell you that “your image file has changed”, which is far from informative. In other words, artists can’t really see what’s changed between the two versions, and they’ll basically need to keep both copies on their computer and open them side-by-side if they want to compare.&lt;/p&gt;

&lt;p&gt;Another thorn in the side of game artists who want to use these versioning tools is that the traditional game art workflows don’t often combine well; you then need to force artists to comply to the VCS’s rules, or develop in-house ad-hoc intermediary solutions to bridge everyone’s comfort zones… which is time-consuming and not very scalable!&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling large asset files
&lt;/h3&gt;

&lt;p&gt;Of course, another major problem of those “coder-oriented” systems is that they’re not designed to manage massive files like art assets. By comparison, scripts are extremely small files.&lt;/p&gt;

&lt;p&gt;So most of those tools don’t expect files to weigh more than a few hundred KBs - while this is just on the low-end for images, audio files or movies!&lt;/p&gt;

&lt;p&gt;PlasticSCM and Perforce are currently the best solution in this domain: they are both able to handle mid- and large-sized assets, and that’s why they’re now the standard solution for many game studios. But the pretty steep storage cost of PlasticSCM, or the licence fees and server maintenance requirements of Perforce, can discourage little teams, and because they’re not as famous as Git for example, they have a smaller user-base and less documentation.&lt;/p&gt;

&lt;p&gt;Git has a well-known command-line extension called &lt;a href="https://github.com/git-lfs/git-lfs/tree/main" rel="noopener noreferrer"&gt;Git LFS&lt;/a&gt; (for “Git Large File Storage”) to manage large files better, but it’s complex to set up and can severely hinder the day-to-day usage of the VCS, in particular for small projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limited metadata editing
&lt;/h3&gt;

&lt;p&gt;Moreover, game assets often require additional metadata such as tags, descriptions, or other information to help artists and developers update and integrate them effectively.&lt;/p&gt;

&lt;p&gt;However, common versioning tools don’t have much in terms of metadata. Usually, you have your files on one side and your commit history on the other - and these commits hold metadata on the tasks and the updates, rather than the files themselves.&lt;/p&gt;

&lt;p&gt;This means that unless all your metadata is embedded in the assets, it might be “lost in translation” when sharing the file with the rest of the team via a typical version control system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Merge conflicts management
&lt;/h3&gt;

&lt;p&gt;Art assets are typically files that are edited by several members of the team - more often than not, a main game asset like a character or a big environment requires several people to combine their skills and create a model, a rig, an animation, materials and textures, hair and cloth simulation…&lt;/p&gt;

&lt;p&gt;This naturally implies that one asset file might be edited by two people at once and, if this file is versioned, you’ll then have to merge both results into a logical single output.&lt;/p&gt;

&lt;p&gt;This is the problem of merge conflict and, again, a lot of “coder-oriented” VCS don’t do it well for binary files. Basically, that’s because tools like Git or SVN for example are designed for text files that can be compared line by line; but, in a JPEG image, it’s not possible to do such a comparison.&lt;/p&gt;

&lt;p&gt;That being said, SVN and Perforce for example have a “lock” mechanic that lets you take over the file during your work session and prevent any other changes, which is a basic way of avoiding conflicts. That’s already very cool, and it solves a lot of daily issues - but it can be tricky because you need to remember to lock the file before starting your work, and unlock it afterwards so that other teammates can edit it further.&lt;/p&gt;

&lt;p&gt;Ideally, this conflict prevention should be handled automatically by the system, especially if it’s cloud-based and therefore has access to previous and current data at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are there versioning tools for artists?
&lt;/h2&gt;

&lt;p&gt;All of this highlights how, at the moment, the classic VCS tools like Git, SVN or even Perforce aren’t totally suited for game artists.&lt;/p&gt;

&lt;p&gt;Still, you need to track those art assets so that you know what was made when, by who, and for what - so you have to find tools to version those files as well as code.&lt;/p&gt;

&lt;h3&gt;
  
  
  But - can’t we use Google Drive? Or Dropbox? Or emails?
&lt;/h3&gt;

&lt;p&gt;That’s actually a very common solution to this problem. As discussed in &lt;a href="https://www.diversion.dev/blog/version-control-for-game-devs-survey-results" rel="noopener noreferrer"&gt;this study&lt;/a&gt; we conducted a while back, many game teams decide to use some external storage system for their non-code assets.&lt;/p&gt;

&lt;p&gt;The problem is that those tools are not real versioning systems: you often end up sending your team files with “_v2”, “_v3”, “_final” suffixes. Plus, you have to spend a lot of time managing shared folders that get cluttered with backup or temporary files, because art software (such as Photoshop, Maya, Blender…) are very good at creating plenty of files “around” your main one.&lt;/p&gt;

&lt;p&gt;To put it simply - using Google Drive or emails is easy but also risky, because you don’t have a reliable single source of truth, you don’t have a centralised history of changes and you don’t have any specific security for your data. Most notably, separating your code from your assets by maintaining two storage/versioning systems is really cumbersome - especially for video games that intimately tie the two!&lt;/p&gt;

&lt;h3&gt;
  
  
  Picking a versioning tool made &lt;em&gt;for&lt;/em&gt; artists
&lt;/h3&gt;

&lt;p&gt;Solutions like &lt;a href="https://www.alienbrain.com/" rel="noopener noreferrer"&gt;Alienbrain&lt;/a&gt;, PlasticSCM or Perforce’s designer-oriented &lt;a href="https://www.perforce.com/products/helix-core-apps/helix-sync" rel="noopener noreferrer"&gt;Helix Sync&lt;/a&gt; are trying to shift the mindset on version control and integrate artists better. Be it by creating more accessible interfaces to the tool, simplifying the options to get a more approachable system or ensuring direct connections with typical art creation software, they aim at giving artists adapted tools to keep track of their files.&lt;/p&gt;

&lt;p&gt;For example, Alienbrain offers a visual differentiation tool that directly highlights the modifications on the file:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94n476niaen2on7oh9ex.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94n476niaen2on7oh9ex.jpg" alt="alienbrain-file_compare"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Screenshot from: &lt;a href="https://www.alienbrain.com/" rel="noopener noreferrer"&gt;https://www.alienbrain.com/&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And it also integrates seamlessly with many game creation tools (Unreal Engine, Maya, Photoshop…), so that you can access your version control system from within each of those applications without having to switch windows.&lt;/p&gt;

&lt;p&gt;Sounds great, right?&lt;/p&gt;

&lt;p&gt;Well - that actually comes at a high price that basically blocks any indie studio from using it. It's a minimum €120 per year &lt;em&gt;per team member&lt;/em&gt;… and that’s for a coder! ‘Cause yeah, Alienbrain has a fairly strange &lt;a href="https://www.alienbrain.com/pricing.php" rel="noopener noreferrer"&gt;pricing system&lt;/a&gt; where you can have a coder subscription, an artist subscription or an “advanced” subscription that combines the two. For example, someone with a coder account won’t be able to get image previews, or track progress and manage the project at all.&lt;/p&gt;

&lt;p&gt;This highlights how, because of the challenges of versioning large binary files, current solutions have to make their products expensive to cover their storage costs, and how this directly impacts users.&lt;/p&gt;

&lt;p&gt;Moreover, the “easy integrations” that Alienbrain advertises on its homepage are mostly for art software… the only code editor they support natively is Microsoft Visual Studio, which is just one of the solutions used by devs. Overall, the steep learning curve and high complexity of the software put a huge overhead on the coders’ daily workflow.&lt;/p&gt;

&lt;p&gt;(Plus, while the code-centric features such as branches, merging and conflict solving have improved, &lt;a href="https://www.g2.com/products/alienbrain/reviews#survey-response-7623816" rel="noopener noreferrer"&gt;some reviews&lt;/a&gt; still say that the check-in/check-out and code merge features aren’t as well-designed as in other tools…)&lt;/p&gt;

&lt;p&gt;So… does this mean that we have to pick either coder-oriented and perhaps free VCS that don’t work well for artists, or buy very pricey artist-oriented VCS that are unusable by coders? Or are we condemned to maintain two version control systems at the same time on every game project to combine the best of both worlds… which also means painfully re-merging those two worlds afterwards to get our final game?&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring modern versioning tools
&lt;/h2&gt;

&lt;p&gt;This industry-wide question is becoming more and more of a problem, because video game studios are growing fast and exploring ever new workflows. To try and solve this conundrum, many people have started to work on more modern and multi-usage version control systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.diversion.dev/" rel="noopener noreferrer"&gt;Diversion&lt;/a&gt; is one of those new versioning solutions. It is a cloud-native tool, currently in beta, that aims at bridging the gap and providing a VCS built both for developers and artists.&lt;/p&gt;

&lt;p&gt;One of their main goals is to handle large binary files and small code sources alike, in a seamless and user-friendly workflow that everyone can understand. So they’re looking for the best trade-off between providing many features and a scalable solution, and keeping it easy-to-use with a clear interface.&lt;/p&gt;

&lt;p&gt;And another very cool thing is that Diversion is actively working on an automatic conflict prevention tool to help teams collaborate on large projects safely - without risking unwanted overwrites, and also without having to “lock/unlock” files manually.&lt;/p&gt;

&lt;p&gt;To do this, they take advantage of their cloud setup to continuously keep local files in sync with the remote version, and then notify users working on the same file at the same time that it is already being edited. You even have some info on the other teammates who are currently changing the file, and when was the last modification.&lt;/p&gt;

&lt;p&gt;Of course, Diversion is still in beta and there are a lot of features that need to be added; but as is, this solution already looks interesting, and it’s definitely dedicated to creating a good user experience for both coders and artists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In the complex world of video game creation, finding the perfect version control system is hard. Having something that is tailored for the needs of coders and artists is difficult, because they typically rely on very different workflows and software. And yet, having tools that accommodate both and can thus be shared across an entire game studio (instead of juxtaposing several profile-specific solutions) could be extremely nice in terms of setup, maintenance and team collaboration.&lt;/p&gt;

&lt;p&gt;Traditional versioning tools like Git and SVN, while robust for source code management, often struggle with handling large game assets - plus, artists are often blocked by the complexity of those coder-oriented VCS. Conversely, artist-friendly systems are often very expensive, and they might not be suited for developers.&lt;/p&gt;

&lt;p&gt;That being said, the industry is witnessing a wave of innovative solutions that are meant to solve this exact problem. Tools like PlasticSCM and Perforce have recognized the need for artist-friendly version control and have implemented interesting features such as visual diffs and large binary asset support.&lt;/p&gt;

&lt;p&gt;Diversion is another solution that tackles this challenge. It aims at providing creators with a scalable and easy-to-use tool - and it might not be as pricey and difficult to manage as PlasticSCM and Perforce! Plus, they’re currently developing a conflict prevention feature to simplify collaborative work and make the best out of their cloud-based solution. So if you’re curious about this alternative solution and you want to learn more, check out Diversion &lt;a href="https://www.diversion.dev/" rel="noopener noreferrer"&gt;here&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>vcs</category>
    </item>
    <item>
      <title>Version control for your Godot game projects</title>
      <dc:creator>Mina Pêcheux</dc:creator>
      <pubDate>Wed, 26 Jul 2023 13:02:52 +0000</pubDate>
      <link>https://dev.to/diversion/version-control-for-your-godot-game-projects-4234</link>
      <guid>https://dev.to/diversion/version-control-for-your-godot-game-projects-4234</guid>
      <description>&lt;p&gt;Any game developer knows that versioning the code and the assets of a game project is no piece of cake - whereas web apps are mostly big bundles of text files, games require both text and complex binary files. So you need to have a tool that does both version control and asset management!&lt;/p&gt;

&lt;p&gt;However, even to this day, the game dev community is fairly sceptical when it comes to using the usual SCM tools for keeping track of the project’s history, and collaborating with the other teammates.&lt;/p&gt;

&lt;p&gt;We’ve already talked about these issues for &lt;a href="https://www.diversion.dev/blog/how-to-version-your-unity-project-with-git" rel="noopener noreferrer"&gt;versioning a Unity project with Git&lt;/a&gt;, the standard SCM solution; but, of course, the same questions arise for other game engines, such as Godot.&lt;/p&gt;

&lt;p&gt;So, today, let’s put on our Godot DevOps hat, and see how we can version a Godot project, what are the differences from a Unity one, and what issues still remain no matter what.&lt;/p&gt;

&lt;h2&gt;
  
  
  Godot: a VCS-friendly game engine...
&lt;/h2&gt;

&lt;p&gt;Compared to Unity or Unreal Engine, Godot is a somewhat new and small game engine - the real first out-of-beta version dates back to only 2014, and it began as the brainchild of two developers: Juan Linietsky and Ariel Manzur.&lt;/p&gt;

&lt;p&gt;However, it does stand out from its competitors with its community-first philosophy, and the fact that it’s been open-source since the very start. This idea of bringing in the community on the development has allowed the engine to grow quite rapidly, in particular thanks to various plugins that can extend the tool in various ways.&lt;/p&gt;

&lt;p&gt;And, among all those features, there are some specifically meant to help with versioning and SCM...&lt;/p&gt;

&lt;h3&gt;
  
  
  Enabling version control for a Godot project
&lt;/h3&gt;

&lt;p&gt;Although there is no SCM tool built-in Godot directly, any Godot project offers an easy way to integrate versioning, just by going to the &lt;strong&gt;Project | Version Control&lt;/strong&gt; menu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnsi42wzy5y9d88e5g1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnsi42wzy5y9d88e5g1z.png" alt="godot-vcs-menu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Except that if you click on that button... you’ll probably get an error popup telling you that you don’t have any VCS plugins enabled:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffo673mfwbzsm6bid25u2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffo673mfwbzsm6bid25u2.png" alt="godot-no-vcs-plugins"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s because, parallel to enabling version control for your project, you also have to make sure Godot actually has a tool to use to &lt;em&gt;do&lt;/em&gt; this versioning!&lt;/p&gt;

&lt;p&gt;Now, from what I’ve seen, at the moment, the only plugins that are available in &lt;a href="https://godotassetlibrary.com/" rel="noopener noreferrer"&gt;Godot’s asset library&lt;/a&gt; for versioning are Git integrations. In fact, the Godot team has even released &lt;a href="https://github.com/godotengine/godot-git-plugin" rel="noopener noreferrer"&gt;an official Git versioning plugin&lt;/a&gt; to directly connect your Godot project to a Git SCM.&lt;/p&gt;

&lt;p&gt;Ok, I know: there are dozens of SCM tools, so you may be thinking that Godot is just limiting our options here, and that this quick VCS setup is just a joke that nobody should use. But, in this specific case, there are actually a few reasons why Git is a nice choice, and may be the right fit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First of all, Git is open-source. And given Godot’s whole “sharing to the community” mindset, it makes sense to stick with open-source software for versioning.&lt;/li&gt;
&lt;li&gt;Git is also among the most popular SCM tools, so many developers are familiar with it and use it “by default” (as a survey we’ve conducted &lt;a href="https://www.diversion.dev/blog/version-control-for-game-devs-survey-results" rel="noopener noreferrer"&gt;has shown&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Github and Gitlab are also extremely popular, and they provide another set of tools for automation, and CI/CD.&lt;/li&gt;
&lt;li&gt;A lot of files in a Godot project are text-based (we’ll talk more about this in a second), so they are totally “understandable” and usable by Git.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, in truth, going for a Godot-Git combo is not that unreasonable :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;span&gt;Note:&lt;/span&gt; By the way, if you’re curious, some of the most famous versioning tools for game development and their specificities are discussed in more detail in &lt;a href="https://thenewstack.io/5-version-control-tools-game-developers-should-know-about/" rel="noopener noreferrer"&gt;this article&lt;/a&gt; ;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Anyway - if you follow the &lt;a href="https://github.com/godotengine/godot-git-plugin/wiki" rel="noopener noreferrer"&gt;install instructions&lt;/a&gt; of this plugin and add it to your Godot project, you’ll then be able to click the Set Up Version Control item of the menu and get this new popup, where you can enter your various Git-related credentials and info:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd2hsjzd63efl51wym0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd2hsjzd63efl51wym0c.png" alt="godot-git-setup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once it’s configured, you’ll be able to examine your Git repo from inside your Godot project editor, and benefit from various tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File differences (in unified or split view):&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyus2hzta4xo3ol0o6dn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyus2hzta4xo3ol0o6dn.png" alt="godot-git-diff-unified"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwwxjk1bl68nl4vd6hsk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwwxjk1bl68nl4vd6hsk.png" alt="godot-git-diff-split"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct staging/unstaging:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54i97eajhuda4o3cpliu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54i97eajhuda4o3cpliu.png" alt="godot-git-staging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct commit, and a list of all the current commits in the repo:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19m6i3c6uextl53ryv1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19m6i3c6uextl53ryv1e.png" alt="godot-git-commit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpaffyyfcpz232la3qpei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpaffyyfcpz232la3qpei.png" alt="godot-git-log"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;And even more tools for branch management, remote repository configuration, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ok, that’s great - thanks to this little add-on, we can very easily handle all of our project’s versioning inside the editor, and we have all the basic Git options we need right at our fingertips. So we should be able to version all of our codebase directly, without even needing an external shell.&lt;/p&gt;

&lt;p&gt;But this does beg the question: what about our complex project files? You know, all the project settings and resource assets like shader graphs, material properties or even entire scenes?&lt;/p&gt;

&lt;h3&gt;
  
  
  Godot’s text-based settings file
&lt;/h3&gt;

&lt;p&gt;To me, that’s where Godot really shines!&lt;/p&gt;

&lt;p&gt;‘Cause, as we said before, many Godot project files are text-based. Basically, as stated in the game engine’s official docs: “Godot aims to be VCS friendly and generate mostly readable and mergeable files”. So the creators have made their best to use human-readable and easy-to-version files for the project configuration and the resource metadata, by writing those files in a TOML-like format.&lt;/p&gt;

&lt;p&gt;This makes those project files way easier to version and track than Unity’s - actually, let’s do a quick comparison to better understand the difference ;)&lt;/p&gt;

&lt;p&gt;In Unity, even if you force the editor to &lt;a href="https://www.diversion.dev/blog/how-to-version-your-unity-project-with-git" rel="noopener noreferrer"&gt;serialise the assets as text files&lt;/a&gt; to help with Git versioning, you still end up with pretty cryptic config files, filled with a long list of mysterious properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!129 &amp;amp;1
PlayerSettings:
  m_ObjectHideFlags: 0
  serializedVersion: 23
  productGUID: 969ea8fe4c8a54236a202247833a2b06
  AndroidProfiler: 0
  AndroidFilterTouchesWhenObscured: 0
  AndroidEnableSustainedPerformanceMode: 0
  defaultScreenOrientation: 4
  targetDevice: 2
  useOnDemandResources: 0
  accelerometerFrequency: 60
  companyName: DefaultCompany
  productName: Tutorials
  defaultCursor: {fileID: 0}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the other hand, here’s the beginning of a &lt;code&gt;project.godot&lt;/code&gt; file, which contains the project’s global settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
;   [section] ; section goes between []
;   param=value ; assign values to parameters
config_version=4
[MonoCustomResourceRegistry]
ClassPrefix=""
SearchType=0
ResourceScriptDirectories=[ "res://" ]
[application]
config/name="Tutorials"
run/main_scene="res://05-MouseFollow/scenes/05-MouseFollow.tscn"
config/icon="res://icon.png"
[display]
window/size/width=1920
window/size/height=1080
[editor_plugins]
enabled=PoolStringArray( "res://addons/MonoCustomResourceRegistry/plugin.cfg" )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And similarly, any Godot resource is stored in this TOML format. So, for example, you can just open and read through your scene hierarchies in any text editor (here’s the top of a &lt;code&gt;.tscn&lt;/code&gt; asset in one of my Godot projects):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[gd_scene load_steps=6 format=2]

[ext_resource path="res://04-RTSUnitNavigation/scripts/Unit.cs" type="Script" id=2]
[ext_resource path="res://04-RTSUnitNavigation/art/models/craft_speederA.fbx" type="PackedScene" id=3]

[sub_resource type="BoxShape" id=1]
extents = Vector3( 0.5, 0.55, 0.35 )

[node name="Unit" type="KinematicBody"]
script = ExtResource( 2 )

[node name="Model" parent="." instance=ExtResource( 3 )]
transform = Transform( -0.5, 0, -4.37114e-08, 0, 0.5, 0, 4.37114e-08, 0, -0.5, -1, 0.2, -0.7 )

[node name="CollisionShape" type="CollisionShape" parent="."]
transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.35, 0.05 )
shape = SubResource( 1 )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What’s great is that a file like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;allows us to quickly peek at our scenes and remember what nodes we’ve put in them, plus all the components and linked resources they use&lt;/li&gt;
&lt;li&gt;is fully compatible with a Git versioning since it’s just text&lt;/li&gt;
&lt;li&gt;can be explored and compared throughout the commits history easily&lt;/li&gt;
&lt;li&gt;is way easier to merge in case of conflicts than an incomprehensible soup of properties like in Unity’s scene description&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actually, to a certain extent, an artist that is a bit curious about coding could probably read those files and get the overall gist, or even help fix merge conflicts!&lt;/p&gt;

&lt;p&gt;All of this means that Godot offers a quick tool for integrating Git, and relies on text-files that are totally human-readable, and that Git can handle without any issues. Perfect, right? :)&lt;/p&gt;

&lt;p&gt;Well, sadly, not quite.&lt;/p&gt;

&lt;p&gt;Because there is still one type of files that poses a problem - it’s those heavy images, movies, audio clips or 3D models that your Github has trouble displaying, and that always ends up as an unreadable mess of binary characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  ... but not for large asset files!
&lt;/h2&gt;

&lt;p&gt;Yep - large binary files are always the problem when versioning a game project, especially when you’re using a tool like Git, that was primarily designed to handle text files.&lt;/p&gt;

&lt;p&gt;Your SCM will try its best to help, but if you ask a Git repo to show you the diff on an image or a movie clip, you won’t get very far. All those “special multimedia files” that are crucial to a game project - the images, movies, 3D models, audio files... - are just not meant to be tracked with Git.&lt;/p&gt;

&lt;p&gt;In other words, despite Godot’s really nice Git integration, it is still limited by this everlasting versioning issue when working on game projects. So you’ll be able to commit all your metadata files into your Git repository without a hitch, but when the time comes to actually add the file itself, you’ll need to blindly push the binary contents of the asset and hope it works.&lt;/p&gt;

&lt;p&gt;As time goes by and you continue to add more resources, pulling back your Git repository will become longer and longer because the tool will have to try and retrieve all of this complex data.&lt;/p&gt;

&lt;p&gt;And yes: all of this will be a real nightmare for the (non-dev) artists in your team... who should actually be the ones authoring and keeping track of these final asset files!&lt;/p&gt;

&lt;p&gt;This might be fine for small Godot projects. But for big ones, long story short: versioning large asset files is, as it’s always been, a pain - and this time, Godot doesn’t have a ready-made solution.&lt;/p&gt;

&lt;p&gt;So, does all that mean we should give up and manage with this less-than-ideal situation? Is Git the doomed-but-only option? Or could we connect Godot with another SCM tool to dodge some of those problems?&lt;/p&gt;

&lt;h2&gt;
  
  
  An alternative to Git with better asset management?
&lt;/h2&gt;

&lt;p&gt;Because the usual version control solution, Git, has proven somewhat limited for game projects time and time again, many people have turned to other SCM solutions.&lt;/p&gt;

&lt;p&gt;Most notably, Perforce and PlasticSCM are two common versioning tools that are used by the game creation community.&lt;/p&gt;

&lt;p&gt;Perforce is an interesting solution for big companies, because it handles large assets well and it’s good with code and complex assets. It’s also centralised, which means you won’t have to worry about re-merging local versions... but also that you are completely dependent on the remote server. Plus, compared to Git, Perforce is free for a little bit, but then it quickly adopts the pay-as-you-go strategy. And finally - you have to host and manage the remote server...&lt;/p&gt;

&lt;p&gt;PlasticSCM shares many of Perforce’s advantages. However, since it’s been acquired by Unity in 2021, it’s slowly been tuned for this game engine - so it’s now mostly valuable for Unity dev teams that want an all-in-one solution. (And who aren’t too scared by the price, since PlasticSCM is a pay-as-you-go tool as well, but with fairly high prices.)&lt;/p&gt;

&lt;p&gt;And then, of course, a few other teams around the world have started to dream of easier game dev versioning tools, too - which is why, today, various new SCM solutions with a special focus on game development are in the works.&lt;/p&gt;

&lt;p&gt;For example, Diversion is a cloud-native version control system, still in beta but very promising, that aims at providing a versioning tool that is easy-to-use for everyone (meaning, developers and artists alike) and highly scalable.&lt;/p&gt;

&lt;p&gt;Its goal is to facilitate versioning for multimedia projects like games by natively managing small text files &lt;em&gt;and&lt;/em&gt; large assets, and by offering a centralised history of everything in your project, trouble-free. Plus, because they have a simple GUI, non-dev members of the team can use it too, and help with the integration and merges :)&lt;/p&gt;

&lt;p&gt;The Diversion team is also working on a conflict-prevention feature to notify you whenever you’re updating the same file as somebody else, and you might be creating a conflict (thanks to its continuous sync system of local changes with the remote repository in the cloud).&lt;/p&gt;

&lt;p&gt;Combine this with Godot’s easy-to-read text-based configuration files, and you’ll get a pretty neat version system that makes it easy to browse the entire history of your project, and lets you do collaborative work without too many risks of merge conflicts!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Godot is a rising game engine that is attracting more and more followers and that already offers quite a variety of features thanks to its open-source nature and its community-made plugins.&lt;/p&gt;

&lt;p&gt;Some of those plugins make it very easy to integrate Git versioning in a Godot project, simply by downloading an add-on and turning on a few options. We then have everything we need to inspect and update our Git repo inside our Godot project editor. Plus, because Godot uses a plain text TOML-like format for all of its settings and metadata files, we can read through the config and version it with Git without the big merge conflict issues we’d have in a similar Unity project, for example.&lt;/p&gt;

&lt;p&gt;However, this solution is not perfect, because Git is not meant to handle large asset files, and those are an essential part of many games. For big and complex Godot projects, keeping track of images, 3D models or audio sources alongside the codebase is hard, and taming all the subtleties of Git is often too complex for non-dev members of the team to be brought in on it.&lt;/p&gt;

&lt;p&gt;But nowadays, new SCM solutions are popping here and there to serve as alternatives to Git, such as Diversion. This cloud-native versioning tool handles both basic text files and large binary asset files, and it is accessible to developers and artists thanks to its visual interface. A conflict prevention feature is even in development, that could nicely complement Godot’s VCS-friendly configuration files and reduce the frustration of detecting and avoiding potential conflicts :)&lt;/p&gt;

&lt;p&gt;If you want to learn more about Diversion, go ahead and &lt;a href="https://www.diversion.dev/" rel="noopener noreferrer"&gt;check the website&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>git</category>
      <category>godot</category>
      <category>devops</category>
    </item>
    <item>
      <title>The Agile, The Fragile, And The Iron Fist Of Branching Strategies</title>
      <dc:creator>Sasha Medvedovsky</dc:creator>
      <pubDate>Wed, 19 Jul 2023 07:08:58 +0000</pubDate>
      <link>https://dev.to/diversion/the-agile-the-fragile-and-the-iron-fist-of-branching-strategies-47ma</link>
      <guid>https://dev.to/diversion/the-agile-the-fragile-and-the-iron-fist-of-branching-strategies-47ma</guid>
      <description>&lt;p&gt;Whether you love it or hate it, Git has proven to be the nearly ubiquitous method engineering organizations employ to ship code today.  However, when you’re just getting started and building your team, you may be thinking about which strategy is the right one for you to choose based on your current and future needs.  &lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;We recently wrote a longer post about effective branching strategies, and the considerations involved when selecting your branching strategy of choice.  However, we still believe it could be useful to dive in more deeply into the underlying philosophy for each branching strategy, to help you decide what code shipping strategy is the right one for your engineering team.&lt;/p&gt;

&lt;p&gt;‍To make a very rough generalization, we can largely split branching strategies into those that are more agile in nature and those that are more structured.  Each is employed to provide either more rapid delivery or greater control, if we were to think about them in a very generic way.  Below we’ll dive into the most common strategies, from the structured to the agile, their benefits and what they’re best suited for. Hopefully this will help make the decisions regarding what can work best for you and your teams, and whether you need to rethink your branching strategy altogether.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured Strategies
&lt;/h2&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h3&gt;
  
  
  Release Branching
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FKht0lI6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rx0bafkpd3rmjce5kw2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FKht0lI6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rx0bafkpd3rmjce5kw2d.png" alt="Image description" width="614" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;‍This strategy is well-suited for large teams and projects that require long-term support for multiple versions. It’s no surprise then that both &lt;a href="https://learn.microsoft.com/en-us/devops/develop/how-microsoft-develops-devops"&gt;Microsoft&lt;/a&gt; and the &lt;a href="https://cwiki.apache.org/confluence/display/HAWQ/Release+Management"&gt;Apache Software Foundation&lt;/a&gt; often employ release branching as their strategy of choice. (For those who aren’t familiar, the &lt;a href="https://www.apache.org/"&gt;Apache Software Foundation&lt;/a&gt; is best known for hosting numerous open-source projects. The way they work is: each major release has a dedicated branch where bug fixes and patches are applied while development continues on separate branches).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In this strategy, a separate branch is created for each major release version, where bug fixes and patches are applied to the release branch.&lt;/li&gt;
&lt;li&gt;New features are developed in separate branches. 
‍&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to Use It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Release branching is best suited for projects that require stable release maintenance while continuing development on other branches. This is because it offers a controlled and structured approach to managing releases, along with greater stability. Another situation where this strategy is used is in large projects with frequent releases (e.g. games) - the release branches isolate features scheduled for the upcoming release from ones that are not.&lt;/p&gt;

&lt;p&gt;‍&lt;strong&gt;Advantages:&lt;/strong&gt; The release branching strategy’s greatest advantage is that it provides strong isolation between releases, allowing clarity in multiple versions support, and scheduling and coordination of release cycles in large scale projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;‍Disadvantages:&lt;/strong&gt; This strategy creates numerous long lived branches, which complicates code management - it creates a need for complex merges to make sure code written in one branch (e.g., a bug fix) propagates into the other branches correctly. Use this strategy only where needed.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h3&gt;
  
  
  GitFlow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DOce8Etg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/43xo4ajvh6ngqeavdpjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DOce8Etg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/43xo4ajvh6ngqeavdpjy.png" alt="Image description" width="732" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitFlow is a variation on the release branching strategy, that also defines additional long lived branches for different purposes. It was &lt;a href="https://nvie.com/posts/a-successful-git-branching-model/"&gt;conceived in 2010&lt;/a&gt; by Vincent Driessen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;br&gt;
It consists of a "develop" branch for ongoing development and a "master" branch for stable releases (we’ll call it ‘main’ from this point on to align with the more modern terminology).&lt;br&gt;
Additional branches are used for feature development, bug fixing, and release preparation. These branches are deleted once they are merged to “develop” and “main”.&lt;br&gt;
‍&lt;br&gt;
&lt;strong&gt;The Way it Works&lt;/strong&gt;&lt;br&gt;
Gitflow uses a central repository approach with two long lived branches: 'main' for production and 'develop' for integrating features. Additional temporary branches are created for isolating new feature developments and for preparing production releases. After a feature is developed on a feature branch, it's merged into the 'develop' branch. &lt;/p&gt;

&lt;p&gt;‍When a release is ready, a release branch is created off 'develop', which is then merged into the 'main' and 'develop' branches, when the release is complete.&lt;br&gt;
‍&lt;br&gt;
&lt;strong&gt;When To Use It&lt;/strong&gt;&lt;br&gt;
GitFlow was commonly used (and still is, in some places) in projects with a scheduled release cycle. Teams working on software that has major scheduled releases, like operating system distributions, often use this strategy to add greater control and stability to the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; Clear separation of under-development code and production; streamlined release management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt; Bad fit for CI/CD processes; a complex workflow with multiple branch types and merging strategies.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  The Agile Strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Feature Branching
&lt;/h3&gt;

&lt;p&gt;‍&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RKlwkIA6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx09l4e359syft3hs754.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RKlwkIA6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kx09l4e359syft3hs754.png" alt="Image description" width="614" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;‍Feature branching enables parallel development, isolation, and collaboration among developers. It places the emphasis on agility, collaboration, and shorter feedback loops, which is why it is one of the more popular branching strategies employed with many development teams, including well-known engineering organizations like &lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow"&gt;Atlassian&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Feature Branching Workflow, developers create a branch for each new feature.&lt;/li&gt;
&lt;li&gt;The 'main' branch contains the official project history, and feature branches are used to develop new features outside of the main project. &lt;/li&gt;
&lt;li&gt;When a feature is complete, it's merged back into the main branch.&lt;/li&gt;
&lt;li&gt;Different instances of this flow are known as ‘Github Flow’ where code is pushed to production upon its merge and ‘Gitlab Flow’ which schedules code for release across one or more staging branches.
‍&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When To Use It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Due to its flexibility this strategy is suitable for teams of all sizes, although it should be noted that it can become complex for larger teams if branch management is not done properly. This is oftentimes the go-to strategy of choice for those who want both agility with some semblance of control and isolation.&lt;br&gt;
‍&lt;br&gt;
&lt;strong&gt;Advantages:&lt;/strong&gt; This strategy is great for collaboration as each feature branch allows developers to work on new features without disturbing or impacting the main branch, which is kept production ready. Yet on the collaboration side, changes can be shared and discussed before being merged into the main code base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;‍Disadvantages:&lt;/strong&gt; Probably its biggest downside is that it can lead to "merge hell" if not managed properly. This tends to happen when many branches are created and worked on concurrently, making the merging process a complicated and time-consuming task.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h3&gt;
  
  
  Trunk-Based Development
&lt;/h3&gt;

&lt;p&gt;‍&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3LStMoen--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddgmq1ka522di3e1urxx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3LStMoen--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddgmq1ka522di3e1urxx.png" alt="Image description" width="614" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trunk-Based Development allows agility, large-scale collaboration and fast-paced development. This strategy is common in organizations that practice continuous integration and deployment, and is used in conjunction with feature flags (with tools like &lt;a href="https://launchdarkly.com/blog/git-branching-strategies-vs-trunk-based-development/"&gt;LaunchDarkly&lt;/a&gt;). It is often used by large consumer-facing companies such as Google, Meta and Netflix.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trunk-Based Development is a branching strategy where all developers work on a single branch, usually the main branch or "trunk."&lt;/li&gt;
&lt;li&gt;Short-lived feature branches are created, but they're merged into 'main' as soon as possible - usually before the developed feature is complete.&lt;/li&gt;
&lt;li&gt;Continuous integration tests are run to ensure 'main' is always in a releasable state.&lt;/li&gt;
&lt;li&gt;Feature flags or toggles are used to enable or disable unfinished or experimental features. 
‍&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When To Use It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This strategy is useful in organizations that prioritize continuous integration and deployment, over isolation or control. While enabling velocity, this does require discipline to keep the main branch always in a releasable state so that unstable code is not inadvertently pushed to production. In large companies like Meta and Google, this is the only viable strategy - as any branch that splits off main falls hopelessly behind extremely quickly, making merging back an impossible task.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt; This strategy encourages regular code integration, decreases the complexity of merging changes, and supports continuous integration and deployment practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt; The constant integration can lead to problems if not done carefully. This format requires strong release engineering to support it, and additional feature flags / toggles tooling to ensure experimental and unfinished features aren’t released at large without proper controls.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;While it may appear that the more “agile” approaches have similar principles, they prioritize different aspects of the engineering workflow. The Feature Branch workflow allows more flexibility in terms of when deployments happen; Trunk-Based Development emphasizes regular code integration and continuous delivery.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Choose Your Strategy
&lt;/h2&gt;

&lt;p&gt;Some of the key factors to consider when selecting or changing the branch strategy for your engineering organization are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Release frequency&lt;/li&gt;
&lt;li&gt;Risk tolerance&lt;/li&gt;
&lt;li&gt;Project complexity&lt;/li&gt;
&lt;li&gt;Team size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regardless of the strategy you employ, the &lt;a href="https://diversion.dev/"&gt;version control system&lt;/a&gt; you choose should provide the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast branching and updates&lt;/li&gt;
&lt;li&gt;Flexibility&lt;/li&gt;
&lt;li&gt;Ease of resolving conflicts&lt;/li&gt;
&lt;li&gt;Real-time collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next generation of &lt;a href="https://diversion.dev/"&gt;cloud native version control&lt;/a&gt; systems should focus on all of these elements to ensure that modern engineering can deliver fast and stay safe. There is also a need for better automation of processes like merges and conflict resolution; these may be greatly improved in the near-term by leveraging new generative AI tools, which promise to free us from mundane and frustrating tasks - but this deserves a separate post.&lt;/p&gt;

</description>
      <category>git</category>
      <category>cicd</category>
      <category>development</category>
      <category>agile</category>
    </item>
    <item>
      <title>How to Version Your Unity project with Git</title>
      <dc:creator>Mina Pêcheux</dc:creator>
      <pubDate>Wed, 05 Jul 2023 15:46:35 +0000</pubDate>
      <link>https://dev.to/diversion/how-to-version-your-unity-project-with-git-1c4a</link>
      <guid>https://dev.to/diversion/how-to-version-your-unity-project-with-git-1c4a</guid>
      <description>&lt;p&gt;If you have a bit of Unity experience, then you know that game projects are complex beasts that contain a wide variety of files - from source code to graphical assets, a Unity folder hierarchy is divided in quite a lot of subfolders with a plethora of file types.&lt;/p&gt;

&lt;p&gt;Yet those files need to remain structured and organised, otherwise it’s a recipe for disaster!&lt;/p&gt;

&lt;p&gt;That’s why, in video game development as in other domains, we have to follow good practices and version our code thanks to Source Code Management (SCM) solutions - also known as Version Control. And one of the best-known tools for this is Git which is still, to this day, a favourite among developers (as shown in &lt;a href="https://www.diversion.dev/blog/version-control-for-game-devs-survey-results"&gt;a previous survey we conducted&lt;/a&gt;)... although as we’ll see in this article, it’s not always suited for versioning game projects, and it requires some adjustments in your Unity settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tuning your project’s settings for Git versioning
&lt;/h2&gt;

&lt;p&gt;Versioning a Unity project with Git is not exactly plug-and-play; indeed, it’s essential to understand how to properly specify the SCM which files are relevant and which should be ignored - and to ensure you really commit all your project’s data, in particular the relationships between your assets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using the right &lt;code&gt;.gitignore&lt;/code&gt; model
&lt;/h3&gt;

&lt;p&gt;Now, if you’re ever faced with versioning your first Unity project, you might be a bit frightened by all the files you’ll need to commit and update... but fear not, there are actually some good practices to keep in mind when versioning a Unity project hierarchy with Git to reduce the amount of versioned files!&lt;/p&gt;

&lt;p&gt;As is the case for most Git repositories, it’s crucial to properly tell the tool which files or folders it can safely ignore without losing any data in the process, thanks to a &lt;code&gt;.gitignore&lt;/code&gt; file. For Unity, this &lt;code&gt;.gitignore&lt;/code&gt; typically includes at least the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/[Ll]ibrary/&lt;/code&gt;: Luckily, Unity projects don’t need to be shipped with all of their dependencies directly! For versioning, you can just share the &lt;code&gt;Packages/&lt;/code&gt; folder that contains the &lt;code&gt;manifest.json&lt;/code&gt; and &lt;code&gt;packages-lock.json&lt;/code&gt; files: those files are simple metadata lists that detail all the required lib dependencies and will allow another Unity instance to retrieve all the needed packages in the right version.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/[Oo]bj/&lt;/code&gt;, &lt;code&gt;/[Bb]uild/&lt;/code&gt;, &lt;code&gt;/[Bb]uilds/&lt;/code&gt;...: All the files that are auto-generated by Unity during compilation, or at runtime, can of course be ignored since another Unity instance will re-generate them when the time comes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*.tmp, /[Tt]emp/&lt;/code&gt; and &lt;code&gt;/[Ll]ogs/&lt;/code&gt;: The temporary files can obviously be ignored since they’re worksession-related (they’re created dynamically when you start up Unity and destroyed when you close it, and they depend on the machine you open the project on).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/[Rr]ecordings/&lt;/code&gt; and &lt;code&gt;/[Mm]emoryCaptures/&lt;/code&gt;: Those files can quickly grow in size and hurt your storage usage - plus, they can contain sensitive data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This list is far from comprehensive - to get a full example &lt;code&gt;.gitignore&lt;/code&gt; file, you can either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;check out &lt;a href="https://github.com/github/gitignore/blob/main/Unity.gitignore"&gt;this official sample&lt;/a&gt;, and copy it in your own Git repo&lt;/li&gt;
&lt;li&gt;or, if you’re just creating your project and you’re using Github or Gitlab for example, reference this template in the UI to add directly to your project:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rqZPy9QG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqzns5pxmvunbb91919p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rqZPy9QG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqzns5pxmvunbb91919p.png" alt="github-gitignore-template" width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, if you have any types of credentials in your Unity folder (such as keys for publishing to the Apple Store or Google Play, or a unique Unity Pro id), you should definitely add these to your &lt;code&gt;.gitignore&lt;/code&gt; too. Because don’t forget that even removing these files with a new commit won’t erase them from the repo’s history :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking a few editor settings for even cleaner repositories
&lt;/h3&gt;

&lt;p&gt;In addition to excluding the unnecessary files and folders with your &lt;code&gt;.gitignore&lt;/code&gt;, it’s also important to tell Unity how to properly store and reference the files that you &lt;em&gt;do&lt;/em&gt; wish to commit and version.&lt;/p&gt;

&lt;h4&gt;
  
  
  Keeping the references
&lt;/h4&gt;

&lt;p&gt;First of all, you have to remember that a game project is not just a bunch of code snippets and assets tossed together in a big pile; all of these pieces of data have to be linked and referenced the right way so that you eventually get the expected interactions and an actual playable thing!&lt;/p&gt;

&lt;p&gt;In a Unity project, these connections and references are handled by the famous &lt;code&gt;.meta&lt;/code&gt; files - the Editor automatically creates one for every folder and file in your project. And yet, if you explore the hierarchy of one of your game projects outside of the Editor, by default, you won’t see any of these &lt;code&gt;.meta&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;Similarly, by default, Git versioning won’t be able to see these &lt;code&gt;.meta&lt;/code&gt; files and it will thus lose all these references in commits.&lt;/p&gt;

&lt;p&gt;To avoid this and actually keep the connections, you need to go to the &lt;strong&gt;Project Settings&lt;/strong&gt; panel and, in the &lt;strong&gt;Version Control&lt;/strong&gt; section, set the &lt;strong&gt;Mode&lt;/strong&gt; option to &lt;strong&gt;Visible Meta Files&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NLL3h3SG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/52yb7qilm2445387fqgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NLL3h3SG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/52yb7qilm2445387fqgv.png" alt="unity-settings-visible_meta_files" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you take another look at your project in your OS file explorer, you should now see &lt;code&gt;.meta&lt;/code&gt; files next to each folder and asset:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pel6Bwul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uhq6d5cmeov9idjn06y9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pel6Bwul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uhq6d5cmeov9idjn06y9.png" alt="mac-finder-meta_files" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Versioning the assets more easily
&lt;/h4&gt;

&lt;p&gt;Another interesting setting is the asset serialisation mode. If you want your project to be more adapted to Git versioning (which is a text-based SCM tool), then you can force Unity to serialise the assets as text.&lt;/p&gt;

&lt;p&gt;Once again, go to your &lt;strong&gt;Project Settings&lt;/strong&gt; and, in the &lt;strong&gt;Editor&lt;/strong&gt; section, make sure that, in the &lt;strong&gt;Asset Serialization&lt;/strong&gt; block, the &lt;strong&gt;Mode&lt;/strong&gt; is set to &lt;strong&gt;Force Text&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n8SvNTE5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dwehm9nsphggjoynel8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n8SvNTE5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dwehm9nsphggjoynel8n.png" alt="unity-settings-asset_serialization" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will make your Unity assets easier to version for Git... but, sadly, it doesn’t solve everything!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;u&gt;&lt;strong&gt;Important note:&lt;/strong&gt;&lt;/u&gt; After any of these changes, don’t forget to save them explicitly by going to the &lt;strong&gt;File | Save Project&lt;/strong&gt; menu ;)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling large assets
&lt;/h2&gt;

&lt;p&gt;Asset management is a big topic (as we’ve already discussed in &lt;a href="https://www.diversion.dev/blog/the-key-to-proper-asset-management-in-game-development"&gt;this other article&lt;/a&gt;), and anyone who’s tried to use version control on multimedia projects like video games or animation movies knows that the common SCM tools can’t always cut it. Especially when it comes to versioning large and complex files such as images, movies, 3D models or audio clips.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problems with multimedia files
&lt;/h3&gt;

&lt;p&gt;Large binary assets are always &lt;em&gt;the&lt;/em&gt; pain point when using Git - and for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First and foremost, Git was not designed to deal with these types of files. Its text-based philosophy is excellent for versioning code or, to a certain extent, project configuration files, but it really lacks some features for multimedia assets.&lt;/li&gt;
&lt;li&gt;Even if you manage to commit and store your files, don’t hope to get easy-to-read version comparisons for your images or your videos: while Git providers like Github or Gitlab offer pretty impressive tooling for browsing your code history and studying the changes made by your peers in the codebase, they don’t have anything remotely as efficient for binary assets. \
And if your file is too large, you won’t even get a preview - that’s typically the case for audio files:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CS2lu_Sy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9ppn9p7clygm95bm7ac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CS2lu_Sy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9ppn9p7clygm95bm7ac.png" alt="github-file-too_large" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moreover, those large assets are often resources created by artists - and Git is by no means easy-to-apprehend for non-coders. Versioning these assets therefore either implies that the artists take time to learn how to use Git (or at least a UI Git client), or that you devote a team member to integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These issues shouldn’t be ignored because Git is still the go-to versioning tool for a lot of developers, so many will just use it as a reflex when they set up the project. But if you’ve not properly assessed whether it’s fit for your team, you might run into quite a number of difficulties later on, when you bring in your actual assets.&lt;/p&gt;

&lt;p&gt;Of course, the Unity team and community are well aware of these problems, and there are a few tricks you can learn to mitigate them...&lt;/p&gt;

&lt;h3&gt;
  
  
  Improving the management of your large files
&lt;/h3&gt;

&lt;p&gt;Now that we know large files are the most common issue for Unity Git versioning, let’s discuss some interesting techniques for better configuring and storing them.&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing and limiting the size of your images
&lt;/h4&gt;

&lt;p&gt;An obvious but important thing to keep in mind is that your files shouldn’t be larger than needed. This is particularly valuable for images since, by picking the right format and the right resolution, you can greatly reduce the file’s size and thus improve your storage consumption.&lt;/p&gt;

&lt;p&gt;When you’re working with bitmap images, there’s always this concern that the asset might be scaled up somewhere, and that it will end up blurry if you, as an artist, haven’t prepared a file with a high enough resolution.&lt;/p&gt;

&lt;p&gt;However, all in all, games aren’t that responsive - sure, you’ll want to accommodate for various platforms and screen sizes, but you don’t necessarily have to prepare each and every image in your project for a 4k display. So a good process is to keep a high-resolution source file archived somewhere out of version control, and only include the final exported assets in the versioning, while making sure those exports suit the project’s needs - no less, and no more.&lt;/p&gt;

&lt;p&gt;In order to check if a given image size works for your game, it’s possible to actually test it out inside Unity by defining a maximum resolution for the image asset in the Editor at import time, and then verifying it’s okay in-game:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oT4lxLLg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aovh0krbtkd4yohfb4d4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oT4lxLLg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aovh0krbtkd4yohfb4d4.png" alt="unity-image-import_settings" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This import setting doesn’t modify the image file itself, it simply limits the max resolution inside Unity - so you can use this setting to check down to which resolution the image is still legible in your game, and then re-apply those settings to your export to actually reduce the file size.&lt;/p&gt;

&lt;h4&gt;
  
  
  Re-using instead of duplicating
&lt;/h4&gt;

&lt;p&gt;Another nice trick is to try and anticipate your asset variations, and produce some base that can then be transformed automatically into the other alternatives, without duplicating this file over and over again.&lt;/p&gt;

&lt;p&gt;For example, consider a 2D platformer game with some little characters jumping around, each for one player. Each avatar has the exact same shape, but the colours have to be different to distinguish between each player:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xRbw-MLN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dt7tz026tcxkq43m18c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xRbw-MLN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dt7tz026tcxkq43m18c.png" alt="demo-color_swap" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, suppose that these sprites are defined in a spritesheet, so as to have all the animations and poses. Then, a naive solution could be to prepare one spritesheet per player, and vary the colours on each, right?&lt;/p&gt;

&lt;p&gt;The problem is that this is very risky in terms of maintainability (since changing a chunk of one spritesheet requires the artist to update all the others the same way, and this is very error prone), and it is absolutely not efficient in terms of storage. A better solution is thus to use some colour-swap shader to create per-player colour variations, and switch the colour palette of the spritesheet accordingly.&lt;/p&gt;

&lt;p&gt;And it’s the same for materials, which can be customised at runtime using a &lt;a href="https://docs.unity3d.com/ScriptReference/MaterialPropertyBlock.html"&gt;&lt;code&gt;MaterialPropertyBlock&lt;/code&gt;&lt;/a&gt; instance; or sounds which can be re-pitched and even chopped down to create other audio clips; or 3D models that can be combined to form unique sets.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using Git LFS... or not?
&lt;/h4&gt;

&lt;p&gt;Finally, it’s worth talking a bit about the &lt;a href="https://git-lfs.com/"&gt;Git Large File Storage&lt;/a&gt; system, also known as Git LFS.&lt;/p&gt;

&lt;p&gt;In short, Git LFS is a Git command-line extension that is meant to simplify the versioning of large files. As explained on the tool’s main page, the goal is to better deal with heavy resources (up to several GB), keep your main Git repo manageable by externalising these large assets and benefit from faster push and pulls on these big objects, all the while working with a Git-like solution.&lt;/p&gt;

&lt;p&gt;That’s very nice and this page also shows you how quick it is to start using Git LFS... unfortunately, from my own experience and &lt;a href="https://news.ycombinator.com/item?id=27134972"&gt;the experience of many users&lt;/a&gt;, Git LFS becomes a real thorn in your side the minute you install it in your pipeline.&lt;/p&gt;

&lt;p&gt;From my own experience, it’s true that Git LFS does make the push and pulls faster. However, it also requires you to list all your “asset types” (meaning the file extensions you consider like large files, and want to include in this alternate system). And that you maintain this list. And that you migrate your previous assets that fall under this list, if any, to the Git LFS system. And you can’t really use SSH easily, so you’re bound to fall back to HTTPS transfers, whereas your main Git repo may be using SSH.&lt;/p&gt;

&lt;p&gt;Oh and, yes - if you’re mixing Git LFS with Github or Gitlab, the moment you begin to &lt;em&gt;really&lt;/em&gt; store some fair amount of assets, you’ll need to &lt;a href="https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-storage-and-bandwidth-usage"&gt;buy additional LFS data storage&lt;/a&gt;, and this can quickly grow to &lt;a href="https://docs.github.com/en/billing/managing-billing-for-git-large-file-storage/upgrading-git-large-file-storage"&gt;a significant amount of money&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That’s an awful lot of trouble - even though, to date, Git LFS is about the only Git-solution for managing your large files. So, does that mean despite its wide usage among developers, Git is not suited for versioning video games? Should we try and find another SCM tool that’s better at handling our heavy assets?&lt;/p&gt;

&lt;h2&gt;
  
  
  Switching to a SCM with native large file management?
&lt;/h2&gt;

&lt;p&gt;At this point, it’s clear that although Git is the &lt;em&gt;de facto&lt;/em&gt; SCM tool in many domains, it’s not the perfect fit for game projects versioning. In particular, its lack of support for large files severely complicates the management of a Unity project for example. So: wouldn’t it be cool to find an alternative that both coders and artists can use, and that handles large binary files better?&lt;/p&gt;

&lt;p&gt;Well, actually - there is one worth taking a look at: a cloud-native SCM tool, currently in beta, called &lt;a href="https://www.diversion.dev/"&gt;Diversion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Diversion is working hard on integrating large assets management in the normal versioning pipeline, no addons required, and with an easy-to-use interface for devs and artists alike. So it lets you version your source code and your big assets next to each other in one unified way, no matter their size:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fC8aTyyR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n4zkdntjztobn8r7x8cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fC8aTyyR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n4zkdntjztobn8r7x8cd.png" alt="diversion-scalable" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, your team can keep together all the project files and rely on just a single tool, rather than extending the SCM solution with command-line plugins specifically for one kind of asset!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Git is still one of the most used versioning tools nowadays, and in lots of domains, it’s great for the job. However, with video games, there are some challenges that Git just wasn’t designed to solve - most notably, the management of large multimedia assets like images, movies or audio clips. So if you use Git for versioning a Unity project, there are a few guidelines to follow to make your workflow more manageable and streamlined.&lt;/p&gt;

&lt;p&gt;When you want to store and version your heavy assets, you can rely on a command-line extension called Git LFS. It makes your push and pulls way faster, and it provides better examination tools for those big binary files. And yet, this tool is far from perfect, in particular because it’s not that easy-to-use, and you have to keep track of which file types should be handled by this alternate system.&lt;/p&gt;

&lt;p&gt;On the other hand, other SCM solutions such as Diversion take this fact into account and aim at providing creators (both artists and developers) with a user-friendly scalable tool, capable of handling small code snippets and large asset files. So if you’re not satisfied with your Unity Git versioning, or if you’re curious about this alternative solution and you want to learn more, check out Diversion &lt;a href="https://www.diversion.dev/"&gt;here&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>git</category>
      <category>gamedev</category>
      <category>devops</category>
    </item>
    <item>
      <title>3 Reasons Game Developers are Looking for Perforce Alternatives</title>
      <dc:creator>Yuki Arbel</dc:creator>
      <pubDate>Mon, 29 May 2023 12:31:10 +0000</pubDate>
      <link>https://dev.to/diversion/3-reasons-game-developers-are-looking-for-perforce-alternatives-1ebm</link>
      <guid>https://dev.to/diversion/3-reasons-game-developers-are-looking-for-perforce-alternatives-1ebm</guid>
      <description>&lt;p&gt;Version control is key to software development of any kind and games are not different in that sense - any serious game developer (from indies to AAA) use some shape or form of version control as part of their development infrastructure.&lt;/p&gt;

&lt;p&gt;Nevertheless, Game development requirements are somewhat unique so version control tools stack up slightly differently than the way they do for “generic” software development. Perforce (or more accurately HelixCore from Perforce Software) is known to address many of these unique requirements pretty well. In a &lt;a href="https://www.diversion.dev/blog/version-control-for-game-devs-survey-results"&gt;survey&lt;/a&gt; that we conducted among game developers, we learned that Perforce was used by 28% of respondents - a huge market share compared to its foothold in other software market segments. Perforce themselves report that they are in use by 19 of 20 top AAA game vendors.&lt;/p&gt;

&lt;p&gt;Speaking to many game developers as part of our exploration of the domain - we learned that even game developers that are heavily invested in Perforce as a version control system have “one eye open” for a Perforce alternative. Some assign the search to a special task force, and for others this is only a wishlist item for the infra team… but it is always present - and here’s why:&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It’s Attractive
&lt;/h2&gt;

&lt;p&gt;Perforce has been around for many years and many of the competitors it had in the 90’s are no longer with us. When Perforce started, Git was not even conceptualized. During that time, it has built robust software and a broad set of features, but if you look at its current focus, it is game development companies, and other vendors that have to manage versions for very large projects and very large files. This is because Perforce is known for its &lt;strong&gt;scalability&lt;/strong&gt; - the ability to handle very large files and repositories. &lt;/p&gt;

&lt;p&gt;Another key feature that is attractive to game developers is the &lt;strong&gt;ability to integrate perforce into the IDE’s&lt;/strong&gt; of the two leading game engines - &lt;a href="https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/SourceControl/Perforce/"&gt;Unreal Engine&lt;/a&gt; from Epic Games and &lt;a href="https://www.perforce.com/integrations/perforce-and-unity-integration"&gt;Unity&lt;/a&gt;. Interestingly enough, Unity has recently &lt;a href="https://venturebeat.com/business/unity-acquires-codice-software-to-manage-3d-workflows/"&gt;acquired&lt;/a&gt; a version control tool Plastic SCM (now rebranded as Unity Version Control), so it remains to be seen to what extent this integration will still be maintained.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  And - What the Challenges Are
&lt;/h2&gt;

&lt;p&gt;One major complaint about Perforce is the complex setup and maintenance it requires. As a tool developed back in the 1990’s, and not undergoing an architectural overhaul since, Perforce server is software that needs to be installed on a dedicated server. Being in the era of SaaS (with version control tools like &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;, &lt;a href="https://about.gitlab.com/"&gt;Gitlab&lt;/a&gt; and &lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt; available as SaaS), developers are reluctant to invest excess IT resources running legacy infrastructure and the fact that Perforce still requires them to do so is considered as a drawback. &lt;/p&gt;

&lt;p&gt;Another related disadvantage is the &lt;strong&gt;smaller set of modern integrations&lt;/strong&gt; it has compared to other cloud native version control tools. Perforce did start pivoting towards a &lt;a href="https://www.perforce.com/perforce-and-cloud"&gt;cloud offering&lt;/a&gt;, however it’s more or less the same software, installed on a server provisioned in the cloud - and still requires complex maintenance and configuration.&lt;/p&gt;

&lt;p&gt;Finally, probably the key reason game developers are looking for Perforce alternatives is its &lt;strong&gt;cost&lt;/strong&gt;. Perforce pricing (per-seat) is considered to be very high compared to alternatives, and combined with the cost of setup and maintenance you end up with a pretty high Total Cost of Ownership (TCO) making it prohibitive for smaller players, and a noticeable expense for the larger ones.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Consider when Looking for a Perforce Alternative
&lt;/h2&gt;

&lt;p&gt;When looking for alternatives, there are a few evaluation criteria that are unique to the game development industry. First and foremost: &lt;strong&gt;scalability&lt;/strong&gt;. Game projects tend to be large and include many large binary files. Version control tools have to cater for that and apparently not all of them do this all that well. Git, for example, has a limit on its file and repo size, and game developers typically have to use &lt;a href="https://git-lfs.com/"&gt;Git-LFS&lt;/a&gt; to be able to use Git reasonably (but even that &lt;a href="https://andrewzuo.com/git-lfs-a-solution-that-wont-work-to-a-problem-that-doesn-t-exist-dfbb60de7730"&gt;doesn’t work all that well&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Another key criteria is the &lt;strong&gt;simplicity of use&lt;/strong&gt;: game development companies typically have game designers and artists as part of their staff, and they typically prefer simpler interfaces than those offered by version control tools.&lt;/p&gt;

&lt;p&gt;The main alternatives game developers have to choose from are &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;, &lt;a href="https://subversion.apache.org/"&gt;SVN&lt;/a&gt; and Unity &lt;a href="https://unity.com/solutions/version-control"&gt;Version Control&lt;/a&gt; (which is how Unity packaged their acquired Plastic SCM). A recent &lt;a href="https://dev.tourl"&gt;article&lt;/a&gt; in &lt;em&gt;The New Stack&lt;/em&gt; provides a good roundup comparing between the various alternatives. Spoiler: no tool is perfect and something’s got to give…&lt;/p&gt;

&lt;p&gt;We at &lt;a href="https://www.diversion.dev/"&gt;Diversion&lt;/a&gt; are looking closely at the needs of the game development community and are building a modern, cloud native version control tool to make their life easier. If you’re looking for a Perforce alternative, be sure to check it out &lt;a href="https://diversion.dev/"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>scm</category>
      <category>git</category>
      <category>versioncontrol</category>
    </item>
    <item>
      <title>The Key To Proper Asset Management In Game Development</title>
      <dc:creator>Yuki Arbel</dc:creator>
      <pubDate>Tue, 21 Mar 2023 20:11:11 +0000</pubDate>
      <link>https://dev.to/diversion/the-key-to-proper-asset-management-in-game-development-23mh</link>
      <guid>https://dev.to/diversion/the-key-to-proper-asset-management-in-game-development-23mh</guid>
      <description>&lt;p&gt;The world of software development has changed and evolved significantly over the last two decades from when Git was introduced.  The world of cloud and microservices, CI/CD and automation have introduced scale, efficiency and velocity made possible through as-a-service models for both software and infrastructure.  However, there is an entire industry that could not derive the same benefits that traditional software has seen, due to its own unique complexities.  Much in the world of game development has not significantly or sufficiently evolved, due to its inherent limitations of size, performance, and collaboration that look quite different in the game development world.&lt;/p&gt;

&lt;p&gt;A core piece in the complexity is a byproduct of how gaming assets are created, managed and versioned in game development, which is quite different from typical software engineering disciplines. From 3D models to audio files, textures, and other media, game assets are critical components of any game development project. This is why managing game assets efficiently is essential for creating high-quality games, and source control systems can play a significant role in this process––both in managing the assets and from a collaboration perspective. &lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;With much of the modern software delivery world relying heavily on Git and the SaaS tooling that makes git source control available at scale (from Github to Gitlab and Bitbucket), the world of game development requires different capabilities, as noted in previous posts––leaving game developers to work with a different set of SCM tools.  As a byproduct, there is often much less community and ecosystem support and help that focuses specifically on these unique complexities. &lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;In this blogpost we’d like to focus on this specific area and  explore the different source control systems that are optimized for game development, alongside best practices for how to manage game assets effectively. We'll cover the benefits of using source control systems. We’ll focus on the basics of asset management, version control for asset management, and how this applies to your source control of choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Asset Management?
&lt;/h2&gt;

&lt;p&gt;Assets are a core component in games, and asset management is a crucial aspect of game development that involves organizing and tracking all digital resources used in the game. &lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
Asset management is typically comprised of several steps in the process, as follows:&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asset Creation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;‍Asset creation involves creating digital resources such as 3D models, textures, animations, audio files, code, and other resources that are what constitutes the game elements. This process can be done by in-house artists, sound designers, and developers, or outsourced to external contractors. Depending on the type of asset, it may require close collaboration between asset creators and engineering.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asset Organization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;‍After assets are created, they need to be organized and stored in a central repository for collaborative work. This repository could be a version control system, a cloud-based service, or a local file server. A good practice is to organize assets based on their type, such as 3D models, textures, or audio files, and should be easy to locate and access by team members.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asset Integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once assets are created and organized, they need to be integrated into the game engine. This involves importing the assets into the engine, optimizing them, and testing them in the game engine to ensure that they work as intended. Integration can be done by artists, designers, or developers depending on the asset type.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asset Tracking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;‍As assets are integrated into the game, it's essential to keep track of changes made to them. This is typically done using version control software, which allows teams to track changes made to assets over time, collaborate on asset creation, and revert to previous versions if needed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asset Reuse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;‍Like other software development disciplines that leverage boilerplate code, and reuse types and other objects, game developers often reuse assets across multiple projects to save time and reduce costs. Asset reuse requires proper documentation and organization of assets to ensure that they can be easily located and used across projects.&lt;br&gt;
‍&lt;br&gt;
With all of this in mind it is really critical to have a strong version control and source management solution that is optimized for the diversity of collaborators and stakeholders in the game development world.  This is where the right SCM comes into play, and has a huge impact on the speed, quality, and productivity of game development teams.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Your SCM is Important for Asset Management in Game Development‍
&lt;/h2&gt;

&lt;p&gt;Version control software (AKA source control management––SCM) is the backbone of modern engineering practices, and it provides essential features for efficient asset management critical in today’s engineering processes. A good place to get started is this post, on the current state of the SCM union for the game development world (read: &lt;a href="https://thenewstack.io/unleashing-git-for-the-game-development-industry/"&gt;Unleashing Git for the Game Development Industry&lt;/a&gt;).  &lt;/p&gt;

&lt;p&gt;‍This begins with structured workflows that all of the collaborators and stakeholders in the organization can align with, making it possible for teams to manage their assets in a more organized and efficient way.  Another mission critical capability that version control will provide is backup and recovery: Using a version control system allows teams to back up and recover binary files, which can be especially important for these large and complex files that would take a significant amount of time to recreate.&lt;/p&gt;

&lt;p&gt;‍As the name implies, version control also provides much-needed versioning and change history of binary files, which can be used to track progress, understand changes made, and document the development process.  While merging is not possible for binary files, version control software still enables collaboration by allowing multiple team members to access and work with the same file. Some version management tools also allow checking-out/locking a file so that it is not modified by two people in parallel to avoid conflicts.  One way this comes in handy with version control software is branching. This allows teams to create separate branches of a binary file, which can be useful for experimenting with different versions or testing new features without affecting the main branch of the file.&lt;/p&gt;

&lt;p&gt;‍Finally no piece of software is complete without verifying its quality, through reviewing and approval processes.  Your SCM will enable you to review changes made to binary files and approve them before they are implemented in the game engine. This can help to ensure that all assets meet quality standards and are error-free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right SCM for Game Development
&lt;/h2&gt;

&lt;p&gt;The first step though, and likely the most important is choosing the right system for your needs.  This is an entire blog post unto itself (and we plan to release one soon on this topic - so subscribe if you’d like more on this topic), but just to touch on this briefly––this should be based on factors such as the size of your project, the number of assets you're managing, and the type of assets you're working with, as well as other SW development practices and processes you apply across your company. The popular tools leveraged for game development include Git, Perforce, SVN and Unity PlasticSCM.&lt;/p&gt;

&lt;p&gt;There really is a lot that can be said about each of these, but the most critical pieces you would need to explore is large binary file support, performance with large repositories, branching and merging capabilities, as well as collaboration through permissions and access control to files and repositories.  Each of the popular tools in the ecosystem plays to different strengths and use cases, and we’ll be sure to dedicate a post to this in the coming weeks.&lt;/p&gt;

&lt;p&gt;Once you've chosen a source control system (check this post out for some stats on &lt;a href="https://www.diversion.dev/blog#"&gt;version control for game developers&lt;/a&gt;), you can start applying best practices for asset management, which we’ll dive into below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Asset Management Best Practices
&lt;/h2&gt;

&lt;p&gt;Once you have proper version management in place for assets, you are halfway to having an efficient process for asset management, as basic aspects, regular backup, are covered for you.  &lt;/p&gt;

&lt;p&gt;‍Let’s dive into some good practices around asset management processes and workflows that are built around how you leverage your SCM and play to its strengths.&lt;/p&gt;

&lt;p&gt;‍Like software pipelines, assets should be handled in a similar fashion.  It’s a good practice to establish a clear and well-defined asset pipeline to manage the flow of assets from creation to implementation.  This will also ensure that all team members are aware of the process.&lt;/p&gt;

&lt;p&gt;Another good practice that contributes to effective teamwork and workflows is defining a consistent naming convention for assets. This makes it easier to locate and manage files that multiple collaborators need to work on. Suggested methods are to include information such as the type of asset and the date it was created.  Once you have good processes, and naming conventions, knowing where to find these key assets is important.&lt;/p&gt;

&lt;p&gt;‍This is where your SCM or cloud storage comes in to provide a central repository where all assets should be stored that is easily accessible to all team members. This helps to prevent duplicate files and reduces the risk of lost or misplaced assets.  When these types of files are stored in a centralized location, their size can impact cost and performance, and this is where asset optimization comes into play.&lt;/p&gt;

&lt;p&gt;‍Optimizing assets such as textures and models can reduce file size and improve performance. This can be achieved by reducing polygon counts, compressing textures, and using LODs.  Storage is also expensive, so the additional value of reducing file size is that you can also derive cost benefits.&lt;/p&gt;

&lt;p&gt;‍After all is said and done, one of the backbones of great collaboration that is often underestimated is documentation. By taking the time to create great documentation regarding the creation, modification, and usage of assets you can ensure that all team members are on the same page and can easily refer to previous decisions and iterations.&lt;/p&gt;

&lt;p&gt;‍Finally we come to actually making use of your assets, and no engineering assets should be pushed to production without proper testing.  Make sure to take the proper time to test your assets in the game engine to help identify issues early in the development process, and ensure that assets are working as intended.&lt;/p&gt;

&lt;h2&gt;
  
  
  ‍SCM &amp;amp; Proper Game Asset Management
&lt;/h2&gt;

&lt;p&gt;Eventually game development is not much different than other software engineering disciplines. There are mission critical assets that need to be properly maintained, backed up, versioned, and managed for productive teamwork and operational best practices.&lt;/p&gt;

&lt;p&gt;‍Choosing an SCM that is optimized for game development will help you overcome some of the unique challenges in the game development world when it comes to asset management and collaborative work.  Once you have a good SCM to help with the version control, backup and collaboration, you can then set out to apply best practices for processes and workflows to ensure you manage assets properly in the long term.&lt;/p&gt;

&lt;p&gt;‍In &lt;a href="https://diversion.dev/blog"&gt;our next posts&lt;/a&gt; we will dig deeper into the game development world, and provide more insights into unique challenges for gaming engineers.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>scm</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Version Control for Game Devs: Survey Results</title>
      <dc:creator>Sasha Medvedovsky</dc:creator>
      <pubDate>Tue, 24 Jan 2023 15:10:51 +0000</pubDate>
      <link>https://dev.to/diversion/version-control-for-game-devs-survey-results-2pj</link>
      <guid>https://dev.to/diversion/version-control-for-game-devs-survey-results-2pj</guid>
      <description>&lt;h5&gt;
  
  
  Yuki Arbel, January 24, 2023
&lt;/h5&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;"Listening to your customers is the key to building great products"&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Anonymous&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://diversion.dev"&gt;Diversion&lt;/a&gt;, we are building a next generation Version Control tool, with a strong emphasis on addressing the unique challenges faced by game developers. It’s no secret that the games industry is underserved by existing solutions (see here), but we wanted to hear first hand from game developers about the tools they are using, how they use them, and what challenges they encounter.&lt;/p&gt;

&lt;p&gt;With that in mind, we ran a survey among professional game developers. Obviously, people are busy, and you need to show your gratitude for their willingness to contribute, so we added a raffle for VR goggles. We ended up with more than a 100 respondents before closing the poll.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Who responded to our survey?
&lt;/h2&gt;

&lt;p&gt;We asked people what size of organization they are currently working for. We thought this could be important in order to look at usage patterns and challenges also from that angle. It is one thing to be an indie developer or work with handful of colleagues, and another to work in a large enterprise split across continents. 45% of our respondents work in small companies (up to 100 employees), 40% work in midsize companies (up to 1000 employees), 15% work in large companies (larger than 1000 employees). We’ll get to some analysis using this information later on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IW3eAe_e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z7gmbbcroqlycmbro1af.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IW3eAe_e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z7gmbbcroqlycmbro1af.png" alt="Organization Size" width="600" height="371"&gt;&lt;/a&gt;&lt;br&gt;
‍‍&lt;/p&gt;

&lt;h2&gt;
  
  
  So, which version control tools are game developers currently using?
&lt;/h2&gt;

&lt;p&gt;Our main goal was to find out the distribution of version control tools among game developers.&lt;/p&gt;

&lt;p&gt;Git is by far the most common version control solution reported by game devs (used by 82% of respondents). However, approximately 25% of those who use Git also use another version control tool in addition to it.&lt;/p&gt;

&lt;p&gt;Other version control products used by survey participants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perforce (28% of respondents)&lt;/li&gt;
&lt;li&gt;SVN (6% of respondents)&lt;/li&gt;
&lt;li&gt;Plastic SCM (4% of respondents)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were also 2 respondents reporting using an internally built version control system (which might indicate a lack of adequate solutions, and is probably less than ideal for a game development company).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8uTPmVD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68dqfrm2vzl3gofd8a8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8uTPmVD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68dqfrm2vzl3gofd8a8g.png" alt="SCM Popularity" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Differences by company size
&lt;/h2&gt;

&lt;p&gt;We looked further into the tools usage patterns, to see if they depended on organization size. Perforce is much more common in larger companies than in the smaller ones. More than 38% of respondents working for mid to large companies (companies larger than 100 employees) use Perforce, compared to 11% in smaller companies (under 100 employees).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BVRKsq44--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f2yghzx4fy2w2qtdp2cm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BVRKsq44--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f2yghzx4fy2w2qtdp2cm.png" alt="Perforce usage by company size" width="880" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphical assets
&lt;/h2&gt;

&lt;p&gt;Binary files, and especially graphical assets, are a huge problem (pun not intended) in game development. We wanted to check how game developers deal with this problem.&lt;/p&gt;

&lt;p&gt;First, we wanted to check whether designers use version control to store the assets that they create. It turned out that nearly half of respondents (45%) say that designers in their company use cloud storage to store the assets that they create. We assume that part of the reason is the complexity of using version control (which we were able to correlate from other responses they provided), as well as large storage volume required to store versioned assets (as version control products don’t have a way to manage that).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O2ksals4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5l79jzg0uvi6rqcvypp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O2ksals4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5l79jzg0uvi6rqcvypp2.png" alt="only 54.5% of responders say designers use SCM" width="600" height="371"&gt;&lt;/a&gt;‍&lt;/p&gt;

&lt;p&gt;Then, we wanted to check how common it is to keep graphical assets in version control (at least the end result of artists’ work). 78% of respondents who use Git and were familiar with the topic reported that graphical assets are also versioned. We’ve got a few more detailed responses explaining that only the final assets are versioned, which makes us believe this may be a typical scenario.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--itvs7mL9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61q1vmb6v8fdzvnfomb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--itvs7mL9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61q1vmb6v8fdzvnfomb8.png" alt="78% report assets stored in SCM" width="600" height="371"&gt;&lt;/a&gt;&lt;br&gt;
‍&lt;br&gt;
Since large files don’t work well in Git, we wanted to cross correlate this with the use of Git LFS. 59% of Git users reported they are also using Git LFS to handle large files (some of them reported about problems with it, but this deserves a separate article).&lt;/p&gt;

&lt;p&gt;From direct interviews we know that some companies who use Git to version code, are also using SVN or Perforce in conjunction with Git to store large assets. This of course is not optimal, as it complicates the toolchain and reduces the team’s ability to collaborate effectively. This might explain the high percentage of cross-usage between Git and SVN/Perforce.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting
&lt;/h2&gt;

&lt;p&gt;While the global trend is to move hosting to the cloud via SaaS, all prominent Git vendors also offer their product as software that can be installed and maintained by the customer himself. We wanted to understand to what extent this trend is applicable to game developers. First, we wanted to learn how many of our respondents consume their remote Git as a cloud service vs. install the software on-prem. Approximately 22% of our respondents were not sure about this, but from those who did know where their Git is hosted, approximately 2/3 are using the cloud, and 1/3 are hosting Git on prem.&lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oZkvGCSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/skx256hmbuece8h2ec6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oZkvGCSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/skx256hmbuece8h2ec6i.png" alt="Cloud vs on-prem hosting" width="600" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we wanted to understand the split between the different Git offerings in the market. The majority of companies are using Github (41%), followed by Gitlab (30%) and Bitbucket (22%).&lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vxvpcrng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tbhkws4dsr80femokpee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vxvpcrng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tbhkws4dsr80femokpee.png" alt="Git hosting provider - 41% use GitHub" width="600" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;p&gt;Finally, we wanted to explicitly ask about challenges. After all, we are building Diversion in order to better address existing challenges with version control products, so we’d better know what they are.&lt;/p&gt;

&lt;p&gt;Many respondents that use git reported on challenges they are having with the solution. Here are the top 3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;38% of respondents who use git indicated it is too complex for use by non-developers&lt;/li&gt;
&lt;li&gt;25% of respondents who use git indicated it has poor support for graphical assets&lt;/li&gt;
&lt;li&gt;21% of respondents who use git indicated it is slow
‍&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kdpZaMMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgntvrwakvuilpvq5z8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kdpZaMMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgntvrwakvuilpvq5z8b.png" alt="Git challenges in game development" width="600" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also asked about challenges with Perforce. One of the challenges that was highlighted by users for Perforce was complexity of use by non-developers (seems to be a common theme). Another challenge that stood out in the responses was a poor branching experience.&lt;/p&gt;

&lt;p&gt;Finally, we asked about the existence of a dedicated team handling the version control tool. While this does not necessarily translate to a challenge for the end users, it does impose costs and an operational burden on the organizations. To this question, 64% of respondents who were familiar with the subject, indicated that such a team exists in their organization.&lt;/p&gt;

&lt;p&gt;‍&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qxcDN_Bv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4urgn19x10aw9twzp9l7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qxcDN_Bv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4urgn19x10aw9twzp9l7.png" alt="Team handling SCM" width="600" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  File conflicts
&lt;/h2&gt;

&lt;p&gt;One common challenge that we haven’t included in the survey, but that has surfaced in interviews we conducted, is file conflicts. One company we talked about told us they have a slack channel where artists ask each other if someone’s working on a specific art file (of course, sometime this workflow fails). Others have reported frequent and impossible to solve merge conflicts in Unity or Unreal Engine’s files (scene files, prefabs, etc.). Some version control tools offer an ability to lock files (not Git); but this introduces other problems (people forgetting to unlock files). None of the companies we’ve talked to uses file locking - clearly, a better solution is needed.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;As we can see, version control remains a significant challenge in game development. The most probable reason is that the popular version control tools were not built with game development in mind, or are just very old and were not built for today’s scale.&lt;/p&gt;

&lt;p&gt;We continue to work hard to get &lt;a href="https://www.diversion.dev/game-development"&gt;Diversion&lt;/a&gt; to you. It’s currently in private beta to our early subscribers, and we plan a wider release in the coming weeks. Stay tuned!&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>git</category>
      <category>gdc</category>
      <category>github</category>
    </item>
    <item>
      <title>Secure By-Design Storage for Your SCM</title>
      <dc:creator>avi-mastov</dc:creator>
      <pubDate>Mon, 08 Aug 2022 09:37:36 +0000</pubDate>
      <link>https://dev.to/diversion/secure-by-design-storage-for-your-scm-3dfe</link>
      <guid>https://dev.to/diversion/secure-by-design-storage-for-your-scm-3dfe</guid>
      <description>&lt;p&gt;The widely adopted SCM tools we use today, Github and Gitlab, are built on the dated architecture and design of git.  I recently happened upon &lt;a href="https://news.ycombinator.com/item?id=31984450"&gt;this thread&lt;/a&gt; on HackerNews that talked about a lot of the pains we’ve spoken about in our article &lt;em&gt;&lt;a href="https://dzone.com/articles/on-git-and-cognitive-load"&gt;On Git and Cognitive Load&lt;/a&gt;&lt;/em&gt;.  These aren’t the only issues with Git, many of them are just really simple missing features that are no longer aligned to our current engineering practices, take this post on &lt;a href="https://www.diversion.dev/blog/git-and-folder-non-tracking"&gt;Folder (Non)Tracking&lt;/a&gt;, and today I want to talk about common workarounds (AKA hacks) for secure storage with today’s SCMs.&lt;/p&gt;

&lt;p&gt;When we build applications, from mobile to desktop, across industries we often have many configurations in order to connect our applications to external services.  Some of these services are required at runtime (e.g. ad networks, configuration servers, analytics), and others at build time (e.g. code signing).  We’ll dive into some of the challenges third-party services and imports introduce into our development processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Challenges with Securing Credentials in SCMs
&lt;/h2&gt;

&lt;p&gt;With security taking center stage over the past few years, from the code to the build processes - shift left to DevSecOps, many best practices have been formalized for handling the credentials to our third-party services and supply chain.  For example, for good security reasons, credentials to the services described above are usually not stored inside the SCM.  What is usually done is that each developer has their own local ‘.env’ files that store their environment variables for quick access in development processes. These files are set to be ignored from commit processes by the SCM so that they do not propagate to your git repository and remain there for all of posterity.&lt;/p&gt;

&lt;p&gt;However, in order for these services to run properly, these credentials do need to be accessible to the running service in production or at build time, and so the way this works is that the CI/CD platform of choice then has its own copy of these secure variables.  These are then either injected into the code at build time or used at build time to sign the app itself.&lt;/p&gt;

&lt;p&gt;While this is important for defending our systems, and ensuring our secrets and environment variables are not exposed to would-be hackers, this does add a lot of complexity to the management and maintenance of our environments and systems, and can be tedious to keep up with.  &lt;/p&gt;

&lt;p&gt;This, to us, is yet another area that git  and similar SCMs have not kept up pace with modern engineering and the attack landscape.  With the amount of data and services running in the cloud, that require remote access, and are interdependent as chained services - the communication between these services is critical, while security cannot be compromised either.&lt;/p&gt;

&lt;p&gt;There are products who have tried to address this known challenge, such as Fastlane’s Match, that stores code signing certificates for iOS in a dedicated git repo. This makes it possible to use just one setup for both your local development environment and for the CI/CD to access the same credentials. The drawback is the git repo itself.  Over time, the files it contains grow so big, that the cloning starts to take so long that it becomes the most significant part of the build time.  &lt;/p&gt;

&lt;p&gt;This isn’t scalable, and ultimately is a huge time sink on our most valuable asset - our developers’ time. Recently Match started supporting alternative storage - Amazon S3 and Google Cloud, which is great progress. No point in keeping revoked certificates in version control, taking up space and increasing clone time, right? However, it just replaces one problem with another of the same type. Now you need to store access credentials to S3 / GC. The documentation reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When running &lt;code&gt;fastlane match init&lt;/code&gt; the first time, the setup process will give you the option to create your &lt;code&gt;gc_keys.json&lt;/code&gt; file. This file contains the authentication credentials needed to access your Google Cloud storage bucket. Make sure to keep that file secret and never add it to version control. We recommend adding &lt;code&gt;gc_keys.json&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back to square one, then. Each developer and the CI/CD need their own credentials file, so additional setup needs to be done between cloning the repo and being able to run or distribute the code. The same thing applies to using a git repo to store the certificates, because it’s a different repo than the one that contains the codebase, and usually requires another SSH key for access. Oh, and I forgot to mention you also need a passphrase to decrypt the Match repo, which is another secret to worry about.&lt;/p&gt;

&lt;p&gt;This is a good resource to reference on &lt;a href="https://codesigning.guide/"&gt;code signing&lt;/a&gt;, and the complexity involved.  I’ll also add that currently Match is the only solution trying to overcome this challenge without compromising your credentials to the Apple Developer Portal - so it’s a good effort on their part, and a useful utility, despite some of its drawbacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling Secret Management - Truly as Code
&lt;/h2&gt;

&lt;p&gt;For this to truly be scalable these important variables need to be stored inside the native workflow and context, and be easily maintained.  What if you could just store all this data inside your regular repo, but somehow mark the relevant files as sensitive and/or volatile? What’s more, what if we could have them secured and replaced with different versions at will (per environment or per user)?&lt;/p&gt;

&lt;p&gt;A post about security and DevOps wouldn’t be complete without some reference to GitOps. So let’s talk about roles and policies, and how all this could come together.  We’ve established that it would be really great to have a “secrets” folder inside our regular ol’ repo.  Once that happens, we would be able to leverage this repo, manage and apply policies like we would any other repository in our organization.  We would be able to define who has access to these folders, and make that possible only for certain roles, and in our favorite way–as code (e.g. with separation for dev and prod). &lt;/p&gt;

&lt;p&gt;From a cost optimization perspective (as we head into a bear market), this would not only save us the setup and troubleshooting time, but also the added cost of additional tools in our stack just for secret management.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Git to Developer Experience - It is Possible
&lt;/h2&gt;

&lt;p&gt;When it comes to git, it’s clear that it wasn’t built with developer experience in mind. However, this could also be a byproduct of the times.  Perhaps that’s what developer experience looked like historically with little external services, no CI/CD, less security in mind, and the features were sufficient then.&lt;/p&gt;

&lt;p&gt;With the constant evolution in engineering processes - from the speed and velocity that code needs to be delivered to production, the many and multiple services that each application is broken down into, the evolving attack landscape, and even our processes and culture with global, distributed teams—the way we work together and collaborate on code is becoming a core piece of our developer experience, without compromising security.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://www.diversion.dev/"&gt;Diversion&lt;/a&gt;, as a team that dogfoods its own products, and wants to improve our very own git developer experience––we’re trying to find the many points of friction and ruthlessly remove these unnecessary obstacles from our development processes. What else is bugging you about git? Let us know in the comments.&lt;/p&gt;

</description>
      <category>security</category>
      <category>git</category>
      <category>sourcecontrol</category>
      <category>scm</category>
    </item>
    <item>
      <title>Git and Folder (Non)Tracking</title>
      <dc:creator>avi-mastov</dc:creator>
      <pubDate>Mon, 20 Jun 2022 14:16:23 +0000</pubDate>
      <link>https://dev.to/diversion/git-and-folder-nontracking-2b08</link>
      <guid>https://dev.to/diversion/git-and-folder-nontracking-2b08</guid>
      <description>&lt;p&gt;We talk about Git a lot, because it’s simply the de facto way of collaborative engineering today. However, aside from the complexities with using git as a source code version control tool (you can read &lt;a href="https://dev.to/diversion/on-git-and-cognitive-load-3pj9"&gt;this post about it&lt;/a&gt;), there are other aspects with the way that git works that still require workarounds and hacks, even as they are known issues for many years.&lt;/p&gt;

&lt;p&gt;One such pain remains in the lack of folder tracking in git.  There are plenty of good posts on best practices with tracking folders (such as &lt;a href="https://harmstyler.me/posts/2012/gitignore-vs-gitkeep/"&gt;using .gitkeep or .gitignore files to track empty folders&lt;/a&gt;), and in this post, I just want to outline why this is important at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Git Tracking Oversight
&lt;/h2&gt;

&lt;p&gt;Git is a system built to track files only, but files –– as we all know –– are hosted in folders. This means that if you want to do an operation as simple as renaming or moving a folder, this will affect all the files hosted in that folder, and your repo status will show as though all the files under the folder (and its subfolders) were changed, when really only one folder name or path has changed.&lt;/p&gt;

&lt;p&gt;Why does this matter?&lt;/p&gt;

&lt;p&gt;There are a few reasons this is something you should pay attention to if you are just getting started with git, and we’ll dive into them below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Scenarios and Recommended Workarounds
&lt;/h2&gt;

&lt;p&gt;Let’s start with tools you may be using in your repository.  Some of these tools (take the example of &lt;a href="https://github.com/dbt-labs/dbt-core"&gt;DBT&lt;/a&gt;), when integrating with your repository, will build a directory tree including folders that are required for the tool when it runs. Upon initialization though, these folders start empty and some of them will stay empty at the time of a new commit. Because DBT is a great tool, it uses the aforementioned practice to create dummy files (.gitkeep) inside the empty folders, in order to make the folders “trackable.”&lt;/p&gt;

&lt;p&gt;In the event that folders are created in a repository with no such dummy file, they won’t be tracked and pushed to the remote, so if someone chooses to fork or clone your repository as-is, these untracked folders will not be present in the cloned repository. If a tool requires certain folders to exist to properly run and store future files, this tool’s operation will fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip #1:&lt;/strong&gt; If you require a certain hierarchy to your repository, whether it’s for specific tools that require certain directories or even automation processes in your CI/CD, make sure to create a dummy file inside these folders so they aren’t lost when collaborating and sharing with teammates.&lt;/p&gt;

&lt;p&gt;Another common scenario where tracking only files can cause a lot of pain is when moving or renaming folders.  Content changes are often made in the same commit that the rename or move has occurred (refactoring). When this happens, git will treat all the changed files in the moved folder as completely new objects (because both the path and contents are different), and you will essentially lose their entire change history. On the flip side, if a teammate has not yet pulled or updated their local copy, and they happen to update any of those files pre-move or name change, this can create the type of merge conflicts from our worst nightmares.&lt;/p&gt;

&lt;p&gt;This one is particularly painful, as it requires the entire engineering organization to hold its breath until this update is propagated to the entire engineering team. Depending on the internal processes, a pull request like this might require the same checks and balances as any other code changes, with peer reviews and merges, and the entire engineering team will be blocked from continuing work until this change is merged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip #2:&lt;/strong&gt; A good practice when planning on moving or changing a folder name is to complete this operation as a standalone and separate commit to any other code or file content changes. Push and then merge this change.  &lt;/p&gt;

&lt;p&gt;Once you have done so - be sure to update the entire engineering organization to the change and have them rebase their local copies before making any further code or file content changes.  (Yes, you literally have to do all this, to not have any breaking changes due to the lack of folder tracking in git). &lt;/p&gt;

&lt;p&gt;Important caveat: If engineers from the team are working on their own branches, they will not automatically sync with the main branch, so be sure to have them pull the main branch into their working branches.&lt;/p&gt;

&lt;p&gt;However, the good news is, that if you do follow this process, you will maintain your entire folder and file content history after the move or rename, so make sure to follow this closely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge is Power with Git
&lt;/h2&gt;

&lt;p&gt;When it comes to working with our developer tools, knowledge is power, and can be the difference between painful mistakes like losing our entire folder or file history because we weren’t aware of the underlying fundamentals of our tools.  Before you complete any potentially irreversible operation (&lt;code&gt;rm -rf&lt;/code&gt; anyone?), make sure to read the fine print and know what you’re doing beforehand.&lt;/p&gt;

&lt;p&gt;We need our tools to support our work and the pace of our engineering, and sometimes when we take the time to do things in the proper canonical order recommended, we will actually move faster, and not have to clean up unnecessary messes that will only slow us down.&lt;/p&gt;

&lt;p&gt;We’ll continue to share good practices with version control, and how to work through its challenges, so stay tuned.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
