Ignition 8.3: Project Load Issues When Switching Git Branches

Hi everyone,

I’m running into an issue with version control in Ignition 8.3 :pensive_face:.

Here’s what I did:

  1. I added my data folder to a Git repository and committed the current state in the Main branche.

  2. I created a new branch develop and made some modifications to a project.

  3. When I switched back to the original branch main (containing the initial project with no modifications), I expected the project to return to its original state.

However, when Ignition tries to load the project after switching branches, I get this error:

Error loading project.

ProtoSerializationException: Fallback serialization failed
  caused by NoSuchElementException: No value present

Ignition v8.3.0 (b2025091510)
Java: Azul Systems, Inc. 17.0.16

Here are the screenshots :

Has anyone encountered something similar?

Is there a recommended way to manage Git branches with Ignition 8.3 projects to avoid this kind of issue?

Any help would be appreciated.

Thanks.

Adrien

If you’re using version control to add/move/remove any files, you’ll need to trigger a scan in order for the Gateway to recognize the new files. For Project content, you’ll want to scan with the projects route - as opposed to the full Gateway scan.

On your Gateway (and assuming you are authenticated) you can access the API documentation. The relevant project route is this one: /openapi#tag/config-management/paths/~1data~1api~1v1~1scan~1projects/post. Alternatively, you can manage the same through the UI by clicking the Scan File System button on the Projects page.

1 Like

Can you copy the full stacktrace of that error message and post it here as preformatted text?

I can now open my project, but the changes made in the develop branch are showing up in the main branch, which is very strange...

Here is the full stacktrace

java.util.concurrent.ExecutionException: com.inductiveautomation.ignition.common.rpc.proto.ProtoSerializationException: Fallback serialization failed
	at java.base/java.util.concurrent.CompletableFuture.reportGet(Unknown Source)
	at java.base/java.util.concurrent.CompletableFuture.get(Unknown Source)
	at com.inductiveautomation.ignition.client.util.gui.progress.Task.runBlocking(Task.java:146)
	at com.inductiveautomation.ignition.client.util.gui.progress.Task.runBlocking(Task.java:125)
	at com.inductiveautomation.ignition.designer.IgnitionDesigner.loadProject(IgnitionDesigner.java:930)
	at com.inductiveautomation.ignition.designer.IgnitionDesigner$Handler$1.openProject(IgnitionDesigner.java:2235)
	at com.inductiveautomation.ignition.designer.ProjectDialog.lambda$openProject$5(ProjectDialog.java:227)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Unknown Source)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
Caused by: com.inductiveautomation.ignition.common.rpc.proto.ProtoSerializationException: Fallback serialization failed
	at com.inductiveautomation.ignition.common.rpc.proto.BuiltinAdapters.fallbackSerializer(BuiltinAdapters.java:398)
	at com.inductiveautomation.ignition.common.rpc.proto.ProtoRpcSerializer.encodeValue(ProtoRpcSerializer.java:119)
	at com.inductiveautomation.ignition.common.rpc.proto.ProtoRpcSerializer.encodeRpcMessage(ProtoRpcSerializer.java:85)
	at com.inductiveautomation.ignition.common.rpc.proto.ProtoRpcSerializer.writeReturnValue(ProtoRpcSerializer.java:412)
	at com.inductiveautomation.ignition.gateway.rpc.CompositeSerializer.writeReturnValue(CompositeSerializer.java:37)
	at com.inductiveautomation.ignition.gateway.rpc.RpcRoutes$OutputWriter.write(RpcRoutes.java:345)
	at com.inductiveautomation.ignition.gateway.rpc.RpcRoutes.safelyHandle(RpcRoutes.java:227)
	at com.inductiveautomation.ignition.gateway.rpc.RpcRoutes.handle(RpcRoutes.java:198)
	at com.inductiveautomation.ignition.gateway.dataroutes.Route.service(Route.java:361)
	at com.inductiveautomation.ignition.gateway.dataroutes.RouteGroupImpl.service(RouteGroupImpl.java:120)
	at com.inductiveautomation.ignition.gateway.dataroutes.RouteGroupCollectionServlet.serviceInternal(RouteGroupCollectionServlet.java:133)
	at com.inductiveautomation.ignition.gateway.dataroutes.AbstractRouteGroupServlet.service(AbstractRouteGroupServlet.java:40)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
	at org.eclipse.jetty.ee10.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1379)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)
	at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1614)
	at com.inductiveautomation.catapult.filters.GatewayFilter.doFilter(GatewayFilter.java:116)
	at jakarta.servlet.http.HttpFilter.doFilter(HttpFilter.java:97)
	at org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:208)
	at org.eclipse.jetty.ee10.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1586)
	at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1547)
	at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:819)
	at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:436)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:464)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
	at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:717)
	at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1060)
	at org.eclipse.jetty.rewrite.handler.RewriteHandler$LastRuleHandler.handle(RewriteHandler.java:159)
	at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
	at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
	at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
	at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
	at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
	at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
	at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
	at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
	at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
	at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:143)
	at org.eclipse.jetty.server.Handler$Sequence.handle(Handler.java:805)
	at org.eclipse.jetty.server.Handler$Sequence.handle(Handler.java:805)
	at org.eclipse.jetty.server.Server.handle(Server.java:182)
	at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:662)
	at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:418)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:478)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:441)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164)
	at java.lang.Thread.run(:0)
Caused by: java.util.NoSuchElementException: No value present
	at java.util.Optional.get(:0)
	at com.inductiveautomation.ignition.common.resourcecollection.json.ImmutableResourceSerializer.lambda$serialize$4(ImmutableResourceSerializer.java:89)
	at java.lang.Iterable.forEach(:0)
	at com.inductiveautomation.ignition.common.resourcecollection.json.ImmutableResourceSerializer.serialize(ImmutableResourceSerializer.java:86)
	at com.inductiveautomation.ignition.common.resourcecollection.json.ImmutableResourceSerializer.serialize(ImmutableResourceSerializer.java:23)
	at com.inductiveautomation.ignition.common.gson.internal.bind.TreeTypeAdapter.write(TreeTypeAdapter.java:88)
	at com.inductiveautomation.ignition.common.gson.Gson.toJson(Gson.java:842)
	at com.inductiveautomation.ignition.common.gson.Gson.toJsonTree(Gson.java:712)
	at com.inductiveautomation.ignition.common.gson.internal.bind.TreeTypeAdapter$GsonContextImpl.serialize(TreeTypeAdapter.java:175)
	at com.inductiveautomation.ignition.common.resourcecollection.json.RuntimeResourceCollectionSerializer.lambda$serialize$3(RuntimeResourceCollectionSerializer.java:74)
	at java.util.concurrent.ConcurrentHashMap$ValuesView.forEach(:0)
	at java.util.Collections$UnmodifiableCollection.forEach(:0)
	at com.inductiveautomation.ignition.common.resourcecollection.json.RuntimeResourceCollectionSerializer.serialize(RuntimeResourceCollectionSerializer.java:73)
	at com.inductiveautomation.ignition.common.resourcecollection.json.RuntimeResourceCollectionSerializer.serialize(RuntimeResourceCollectionSerializer.java:25)
	at com.inductiveautomation.ignition.common.gson.internal.bind.TreeTypeAdapter.write(TreeTypeAdapter.java:88)
	at com.inductiveautomation.ignition.common.gson.Gson.toJson(Gson.java:842)
	at com.inductiveautomation.ignition.common.gson.Gson.toJsonTree(Gson.java:712)
	at com.inductiveautomation.ignition.common.gson.Gson.toJsonTree(Gson.java:689)
	at com.inductiveautomation.ignition.common.rpc.proto.BuiltinAdapters.fallbackSerializer(BuiltinAdapters.java:395)
	... 54 more

Ignition v8.3.0 (b2025091510)
Java: Azul Systems, Inc. 17.0.16

Is this new to 8.3? :scream:

Are you committing the resource.json file as well? Including updates to it?

That error message suggests that the resource.json file, which has a manifest of files in it, is pointing to a file, but when we try to retrieve data for that file, there's nothing there.

Yes, this is included in my pending changes whenever I make changes to the project.

However, the button Scan File System Button resolves this problem.

Now my changes are reflected in the main branch :thinking:...

Do you mean "now my changes from the main branch are reflected in Ignition"?

That's how it's supposed to work - Ignition isn't watching and reacting to the file system changing underneath it. You must invoke the scan for changes made to the file system to take effect.

The changes were initiated in my develop branch and committed there. When I switch back to the main branch, which has no modifications, even after performing a Scan File System
The changes from my developbranch are still present in the project while on the main branch checkout.

Yes.

1 Like

If you look at the actual files on disk, do you see the changes from the develop branch?