Index: hg-git/hggit/gc.py
===================================================================
--- hg-git.orig/hggit/gc.py
+++ hg-git/hggit/gc.py
@@ -56,7 +56,7 @@ def _process_batch(ui, object_store, sha
     object_store.add_objects(list(objects))
 
     for obj, path in objects:
-        object_store._remove_loose_object(obj.id)
+        object_store.delete_loose_object(obj.id)
 
     ui.debug(b'packed %d loose objects!\n' % len(shas))
 
Index: hg-git/hggit/git_handler.py
===================================================================
--- hg-git.orig/hggit/git_handler.py
+++ hg-git/hggit/git_handler.py
@@ -2127,8 +2127,14 @@ class GitHandler(object):
         )
 
         for change in changes:
-            oldfile, oldmode, oldsha = change.old
-            newfile, newmode, newsha = change.new
+            if change.old is not None:
+                oldfile, oldmode, oldsha = change.old
+            else:
+                oldfile, oldmode, oldsha = None, None, None
+            if change.new is not None:
+                newfile, newmode, newsha = change.new
+            else:
+                newfile, newmode, newsha = None, None, None
             # actions are described by the following table ('no' means 'does
             # not exist'):
             #    old        new     |    action
Index: hg-git/setup.cfg
===================================================================
--- hg-git.orig/setup.cfg
+++ hg-git/setup.cfg
@@ -18,7 +18,7 @@ packages =
     hggit
     hggit.helptext
 install_requires=
-    dulwich>=0.21.6,<0.23.0
+    dulwich>=0.24.0,<0.25
 
 [options.package_data]
 * = *.txt, *.rst
Index: hg-git/tests/test-renames.t
===================================================================
--- hg-git.orig/tests/test-renames.t
+++ hg-git/tests/test-renames.t
@@ -408,20 +408,17 @@ Now make another clone and compare the h
    12
   +16
 
-Regenerate the Git metadata and compare the hashes
+Regenerate the Git metadata and verify the commit hashes are deterministic.
+This ensures consistent behavior regardless of the dulwich backend in use.
   $ hg debug-remove-hggit-state
   clearing out the git cache data
   $ hg gexport
   $ cd .hg/git
   $ git log master --pretty=oneline
-  f3f6592447685566af9447c03ae262aa5432511d delta/epsilon (dulwich-rust !)
-  c51ce14ec367c5ea72bf428dee3f8576f2fe1bb0 gamma2 (dulwich-rust !)
-  df749cae534e3c7a0ad664cd0f214dd36e0ac259 remove submodule and rename back (dulwich-rust !)
-  8f9ec605ad0cc2532202f73cef8e35d3241797ee rename and add submodule (dulwich-rust !)
-  8a00d0fb75377c51c9a46e92ff154c919007f0e2 delta/epsilon (no-dulwich-rust !)
-  dd7d4f1adb942a8d349dce585019f6949184bc64 gamma2 (no-dulwich-rust !)
-  3f1cdaf8b603816fcda02bd29e75198ae4cb13db remove submodule and rename back (no-dulwich-rust !)
-  2a4abf1178a999e2054158ceb0c7768079665d03 rename and add submodule (no-dulwich-rust !)
+  8a00d0fb75377c51c9a46e92ff154c919007f0e2 delta/epsilon
+  dd7d4f1adb942a8d349dce585019f6949184bc64 gamma2
+  3f1cdaf8b603816fcda02bd29e75198ae4cb13db remove submodule and rename back
+  2a4abf1178a999e2054158ceb0c7768079665d03 rename and add submodule
   88c416e8d5e0e9dd1187d45ebafaa46111764196 beta renamed back
   027d2a6e050705bf6f7e226e7e97f02ce5ae3200 beta renamed
   dc70e620634887e70ac5dd108bcc7ebd99c60ec3 move submodule
