diff --git a/rbtools/diffs/patcher.py b/rbtools/diffs/patcher.py
index 8471ed78d32d769bfed0d463d67a47b122b59a8a..5aaf4fdc9c41554d3ff11fb5d312a751ddcece82 100644
--- a/rbtools/diffs/patcher.py
+++ b/rbtools/diffs/patcher.py
@@ -1000,6 +1000,13 @@
         if dirname:
             os.makedirs(dirname, exist_ok=True)
 
+        # GNU patch 2.7+ honors git "rename from"/"rename to" headers and
+        # performs the rename itself before we get here. If that's happened,
+        # the move is already done — don't fail trying to rename a missing
+        # source over an existing destination.
+        if not os.path.exists(old_path) and os.path.exists(new_path):
+            return
+
         os.rename(old_path, new_path)
 
     def handle_remove_file(
diff --git a/rbtools/diffs/tests/test_patcher.py b/rbtools/diffs/tests/test_patcher.py
index b2f0dd39f8b02f7981206a6adf0c019a3f6c73d8..fd3c91849f59f7334ccc812a3592275d67647177 100644
--- a/rbtools/diffs/tests/test_patcher.py
+++ b/rbtools/diffs/tests/test_patcher.py
@@ -1613,6 +1613,57 @@
         with open(new_file_path, 'rb') as f:
             self.assertEqual(f.read(), test_content)
 
+    def test_apply_binary_file_moved_already_renamed(self) -> None:
+        """Testing Patcher.apply_binary_file with moved file when the
+        rename has already been performed (e.g. by GNU patch 2.7+ honoring git
+        rename headers)
+        """
+        temp_dir = make_tempdir()
+
+        # Simulate the state after `patch` has already handled the rename:
+        # the old path is gone, and the new path exists.
+        new_file_path = os.path.join(temp_dir, 'assets', 'new_location.png')
+        os.makedirs(os.path.dirname(new_file_path), exist_ok=True)
+        test_content = b'\x89PNG\r\n\x1a\n'
+
+        with open(new_file_path, mode='wb') as f:
+            f.write(test_content)
+
+        attachment = FileAttachmentItemResource(
+            transport=URLMapTransport('https://reviews.example.com/'),
+            payload={
+                'id': 124,
+                'absolute_url': 'https://example.com/r/1/file/124/download/',
+            },
+            url=(
+                'http://reviews.example.com/api/review-requests/1/'
+                'file-attachments/124/'
+            ),
+        )
+
+        binary_file = self.make_binary_file_patch(
+            old_path='images/old_location.png',
+            new_path='assets/new_location.png',
+            status='moved',
+            file_attachment=attachment,
+            content=test_content,
+        )
+
+        patcher = Patcher(patches=[], dest_path=Path(temp_dir))
+
+        with chdir(temp_dir):
+            success, error = patcher.apply_binary_file(binary_file)
+
+        self.assertTrue(success)
+        self.assertIsNone(error)
+
+        self.assertFalse(os.path.exists(
+            os.path.join(temp_dir, 'images', 'old_location.png')))
+        self.assertTrue(os.path.exists(new_file_path))
+
+        with open(new_file_path, 'rb') as f:
+            self.assertEqual(f.read(), test_content)
+
     def test_apply_binary_file_download_error(self) -> None:
         """Testing Patcher.apply_binary_file with download error"""
         temp_dir = make_tempdir()
