Hi everyone,
I’m running into an issue with version control in Ignition 8.3
.
Here’s what I did:
-
I added my data
folder to a Git repository and committed the current state in the Main
branche.
-
I created a new branch develop
and made some modifications to a project.
-
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
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
...
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 develop
branch are still present in the project while on the main
branch checkout.
If you look at the actual files on disk, do you see the changes from the develop
branch?