diff --git a/test/test_submodule.py b/test/test_submodule.py
index 852a5ef6f..4dc89f98f 100644
--- a/test/test_submodule.py
+++ b/test/test_submodule.py
@@ -948,18 +948,6 @@ def test_remove_norefs(self, rwdir):
         sm.remove()
         assert not sm.exists()
 
-    @pytest.mark.xfail(
-        os.name == "nt" and sys.version_info >= (3, 12),
-        reason=(
-            "The sm.move call fails. Submodule.move calls os.renames, which raises:\n"
-            "PermissionError: [WinError 32] "
-            "The process cannot access the file because it is being used by another process: "
-            R"'C:\Users\ek\AppData\Local\Temp\test_renamekkbznwjp\parent\mymodules\myname' "
-            R"-> 'C:\Users\ek\AppData\Local\Temp\test_renamekkbznwjp\parent\renamed\myname'"
-            "\nThis resembles other Windows errors, but only occurs starting in Python 3.12."
-        ),
-        raises=PermissionError,
-    )
     @with_rw_directory
     def test_rename(self, rwdir):
         parent = git.Repo.init(osp.join(rwdir, "parent"))
@@ -970,6 +958,12 @@ def test_rename(self, rwdir):
         assert sm.rename(sm_name) is sm and sm.name == sm_name
         assert not sm.repo.is_dirty(index=True, working_tree=False, untracked_files=False)
 
+        # This is needed to work around a PermissionError on Windows, resembling others,
+        # except new in Python 3.12. (*Maybe* this could be due to changes in CPython's
+        # garbage collector detailed in https://github.com/python/cpython/issues/97922.)
+        if os.name == "nt" and sys.version_info >= (3, 12):
+            gc.collect()
+
         new_path = "renamed/myname"
         assert sm.move(new_path).name == new_path