diff --git a/CHANGELOG b/CHANGELOG
index 1083773b0091df738cbfd4e712018dad4f4ba12b..ff5996c11743515642bd324c84aa86ecc464ab8b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -26,6 +26,7 @@ v 8.10.0 (unreleased)
   - Add "Enabled Git access protocols" to Application Settings
   - Fix user creation with stronger minimum password requirements !4054 (nathan-pmt)
   - PipelinesFinder uses git cache data
+  - Throttle the update of `project.pushes_since_gc` to 1 minute.
   - Check for conflicts with existing Project's wiki path when creating a new project.
   - Don't instantiate a git tree on Projects show default view
   - Bump Rinku to 2.0.0
diff --git a/app/services/projects/housekeeping_service.rb b/app/services/projects/housekeeping_service.rb
index a47df22f1bacbe51a3f760b5d3de9316effa4b7e..752c11d7ae65e3647c4315bc551a9769c82d5002 100644
--- a/app/services/projects/housekeeping_service.rb
+++ b/app/services/projects/housekeeping_service.rb
@@ -27,7 +27,7 @@ module Projects
       GitlabShellOneShotWorker.perform_async(:gc, @project.repository_storage_path, @project.path_with_namespace)
     ensure
       Gitlab::Metrics.measure(:reset_pushes_since_gc) do
-        @project.update_column(:pushes_since_gc, 0)
+        update_pushes_since_gc(0)
       end
     end
 
@@ -37,12 +37,18 @@ module Projects
 
     def increment!
       Gitlab::Metrics.measure(:increment_pushes_since_gc) do
-        @project.increment!(:pushes_since_gc)
+        update_pushes_since_gc(@project.pushes_since_gc + 1)
       end
     end
 
     private
 
+    def update_pushes_since_gc(new_value)
+      if Gitlab::ExclusiveLease.new("project_housekeeping:update_pushes_since_gc:#{project.id}", timeout: 60).try_obtain
+        @project.update_column(:pushes_since_gc, new_value)
+      end
+    end
+
     def try_obtain_lease
       Gitlab::Metrics.measure(:obtain_housekeeping_lease) do
         lease = ::Gitlab::ExclusiveLease.new("project_housekeeping:#{@project.id}", timeout: LEASE_TIMEOUT)