diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 82b27b78229a94c7796fc894e814cc9ad48b5fbe..f63cc179b9e6bc8d7ee1d74964ece2901964279f 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -40,7 +40,14 @@ class Deployment < ActiveRecord::Base
   def includes_commit?(commit)
     return false unless commit
 
-    project.repository.is_ancestor?(commit.id, sha)
+    # Before 8.10, deployments didn't have keep-around refs. Any deployment
+    # created before then could have a `sha` referring to a commit that no
+    # longer exists in the repository, so just ignore those.
+    begin
+      project.repository.is_ancestor?(commit.id, sha)
+    rescue Rugged::OdbError
+      false
+    end
   end
 
   def update_merge_request_metrics!
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index bfff639ad78c55961c1707caec1649a48768b0f0..01a4a53a264d5ed33c402728c73f0b88af4a5ee2 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -38,5 +38,14 @@ describe Deployment, models: true do
         expect(deployment.includes_commit?(commit)).to be true
       end
     end
+
+    context 'when the SHA for the deployment does not exist in the repo' do
+      it 'returns false' do
+        deployment.update(sha: Gitlab::Git::BLANK_SHA)
+        commit = project.commit
+
+        expect(deployment.includes_commit?(commit)).to be false
+      end
+    end
   end
 end