We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[Bug]: GitPython breaking API change in 3.1.30, breaks extension updates
### Is there an existing issue for this?

- [X] I have searched the existing issues and checked the recent builds/commits

### What happened?

[Per this PR](https://github.com/gitpython-developers/GitPython/pull/1518) and [the changelog](https://github.com/gitpython-developers/GitPython/pull/1518) you can no longer feed arbitrary arguments to prevent remote code execution.

Easy fix, just use the built kwarg that's already there for it.
https://github.com/AUTOMATIC1111/stable-diffusion-webui/blame/0cc0ee1bcb4c24a8c9715f66cede06601bfc00c8/modules/extensions.py#LL69C28-L69C28

there may be other places in the code as well, I'll take a peek

### Steps to reproduce the problem

1. `pip install 'gitpython>=3.1.30'
2. run the web-ui and try to install/check for updates while watching terminal

### What should have happened?

Should have successfully run the git commands and updated  the git repos

### Commit where the problem happens

0cc0ee1b

### What platforms do you use to access the UI ?

Windows

### What browsers do you use to access the UI ?

Google Chrome

### Command Line Arguments

```Shell
No
```


### List of extensions

No

### Console logs

```Shell
Traceback (most recent call last):
  File "/mnt/d/stable-diffusion/stable-diffusion-webui/modules/ui_extensions.py", line 66, in check_updates
    ext.check_updates()
  File "/mnt/d/stable-diffusion/stable-diffusion-webui/modules/extensions.py", line 69, in check_updates
    for fetch in repo.remote().fetch("--dry-run"):
  File "/home/adam/.cache/pypoetry/virtualenvs/sd-deps-z4SYejYZ-py3.10/lib/python3.10/site-packages/git/remote.py", line 1007, in fetch
    res = self._get_fetch_info_from_stderr(proc, progress, kill_after_timeout=kill_after_timeout)
  File "/home/adam/.cache/pypoetry/virtualenvs/sd-deps-z4SYejYZ-py3.10/lib/python3.10/site-packages/git/remote.py", line 848, in _get_fetch_info_from_stderr
    proc.wait(stderr=stderr_text)
  File "/home/adam/.cache/pypoetry/virtualenvs/sd-deps-z4SYejYZ-py3.10/lib/python3.10/site-packages/git/cmd.py", line 604, in wait
    raise GitCommandError(remove_password_if_present(self.args), status, errstr)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
  cmdline: git fetch -v -- origin --dry-run
  stderr: 'fatal: couldn't find remote ref --dry-run'
```


### Additional information

_No response_

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `modules/extensions.py`
Content:
```
1 import os
2 import sys
3 import traceback
4 
5 import time
6 import git
7 
8 from modules import paths, shared
9 
10 extensions = []
11 extensions_dir = os.path.join(paths.data_path, "extensions")
12 extensions_builtin_dir = os.path.join(paths.script_path, "extensions-builtin")
13 
14 if not os.path.exists(extensions_dir):
15     os.makedirs(extensions_dir)
16 
17 def active():
18     return [x for x in extensions if x.enabled]
19 
20 
21 class Extension:
22     def __init__(self, name, path, enabled=True, is_builtin=False):
23         self.name = name
24         self.path = path
25         self.enabled = enabled
26         self.status = ''
27         self.can_update = False
28         self.is_builtin = is_builtin
29         self.version = ''
30 
31         repo = None
32         try:
33             if os.path.exists(os.path.join(path, ".git")):
34                 repo = git.Repo(path)
35         except Exception:
36             print(f"Error reading github repository info from {path}:", file=sys.stderr)
37             print(traceback.format_exc(), file=sys.stderr)
38 
39         if repo is None or repo.bare:
40             self.remote = None
41         else:
42             try:
43                 self.remote = next(repo.remote().urls, None)
44                 self.status = 'unknown'
45                 head = repo.head.commit
46                 ts = time.asctime(time.gmtime(repo.head.commit.committed_date))
47                 self.version = f'{head.hexsha[:8]} ({ts})'
48 
49             except Exception:
50                 self.remote = None
51 
52     def list_files(self, subdir, extension):
53         from modules import scripts
54 
55         dirpath = os.path.join(self.path, subdir)
56         if not os.path.isdir(dirpath):
57             return []
58 
59         res = []
60         for filename in sorted(os.listdir(dirpath)):
61             res.append(scripts.ScriptFile(self.path, filename, os.path.join(dirpath, filename)))
62 
63         res = [x for x in res if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)]
64 
65         return res
66 
67     def check_updates(self):
68         repo = git.Repo(self.path)
69         for fetch in repo.remote().fetch("--dry-run"):
70             if fetch.flags != fetch.HEAD_UPTODATE:
71                 self.can_update = True
72                 self.status = "behind"
73                 return
74 
75         self.can_update = False
76         self.status = "latest"
77 
78     def fetch_and_reset_hard(self):
79         repo = git.Repo(self.path)
80         # Fix: `error: Your local changes to the following files would be overwritten by merge`,
81         # because WSL2 Docker set 755 file permissions instead of 644, this results to the error.
82         repo.git.fetch('--all')
83         repo.git.reset('--hard', 'origin')
84 
85 
86 def list_extensions():
87     extensions.clear()
88 
89     if not os.path.isdir(extensions_dir):
90         return
91 
92     paths = []
93     for dirname in [extensions_dir, extensions_builtin_dir]:
94         if not os.path.isdir(dirname):
95             return
96 
97         for extension_dirname in sorted(os.listdir(dirname)):
98             path = os.path.join(dirname, extension_dirname)
99             if not os.path.isdir(path):
100                 continue
101 
102             paths.append((extension_dirname, path, dirname == extensions_builtin_dir))
103 
104     for dirname, path, is_builtin in paths:
105         extension = Extension(name=dirname, path=path, enabled=dirname not in shared.opts.disabled_extensions, is_builtin=is_builtin)
106         extensions.append(extension)
107 
108
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/modules/extensions.py b/modules/extensions.py
--- a/modules/extensions.py
+++ b/modules/extensions.py
@@ -66,7 +66,7 @@
 
     def check_updates(self):
         repo = git.Repo(self.path)
-        for fetch in repo.remote().fetch("--dry-run"):
+        for fetch in repo.remote().fetch(dry_run=True):
             if fetch.flags != fetch.HEAD_UPTODATE:
                 self.can_update = True
                 self.status = "behind"
@@ -79,8 +79,8 @@
         repo = git.Repo(self.path)
         # Fix: `error: Your local changes to the following files would be overwritten by merge`,
         # because WSL2 Docker set 755 file permissions instead of 644, this results to the error.
-        repo.git.fetch('--all')
-        repo.git.reset('--hard', 'origin')
+        repo.git.fetch(all=True)
+        repo.git.reset('origin', hard=True)
 
 
 def list_extensions():

{"golden_diff": "diff --git a/modules/extensions.py b/modules/extensions.py\n--- a/modules/extensions.py\n+++ b/modules/extensions.py\n@@ -66,7 +66,7 @@\n \r\n     def check_updates(self):\r\n         repo = git.Repo(self.path)\r\n-        for fetch in repo.remote().fetch(\"--dry-run\"):\r\n+        for fetch in repo.remote().fetch(dry_run=True):\r\n             if fetch.flags != fetch.HEAD_UPTODATE:\r\n                 self.can_update = True\r\n                 self.status = \"behind\"\r\n@@ -79,8 +79,8 @@\n         repo = git.Repo(self.path)\r\n         # Fix: `error: Your local changes to the following files would be overwritten by merge`,\r\n         # because WSL2 Docker set 755 file permissions instead of 644, this results to the error.\r\n-        repo.git.fetch('--all')\r\n-        repo.git.reset('--hard', 'origin')\r\n+        repo.git.fetch(all=True)\r\n+        repo.git.reset('origin', hard=True)\r\n \r\n \r\n def list_extensions():\n", "issue": "[Bug]: GitPython breaking API change in 3.1.30, breaks extension updates\n### Is there an existing issue for this?\n\n- [X] I have searched the existing issues and checked the recent builds/commits\n\n### What happened?\n\n[Per this PR](https://github.com/gitpython-developers/GitPython/pull/1518) and [the changelog](https://github.com/gitpython-developers/GitPython/pull/1518) you can no longer feed arbitrary arguments to prevent remote code execution.\r\n\r\nEasy fix, just use the built kwarg that's already there for it.\r\nhttps://github.com/AUTOMATIC1111/stable-diffusion-webui/blame/0cc0ee1bcb4c24a8c9715f66cede06601bfc00c8/modules/extensions.py#LL69C28-L69C28\r\n\r\nthere may be other places in the code as well, I'll take a peek\n\n### Steps to reproduce the problem\n\n1. `pip install 'gitpython>=3.1.30'\r\n2. run the web-ui and try to install/check for updates while watching terminal\n\n### What should have happened?\n\nShould have successfully run the git commands and updated  the git repos\n\n### Commit where the problem happens\n\n0cc0ee1b\n\n### What platforms do you use to access the UI ?\n\nWindows\n\n### What browsers do you use to access the UI ?\n\nGoogle Chrome\n\n### Command Line Arguments\n\n```Shell\nNo\n```\n\n\n### List of extensions\n\nNo\n\n### Console logs\n\n```Shell\nTraceback (most recent call last):\r\n  File \"/mnt/d/stable-diffusion/stable-diffusion-webui/modules/ui_extensions.py\", line 66, in check_updates\r\n    ext.check_updates()\r\n  File \"/mnt/d/stable-diffusion/stable-diffusion-webui/modules/extensions.py\", line 69, in check_updates\r\n    for fetch in repo.remote().fetch(\"--dry-run\"):\r\n  File \"/home/adam/.cache/pypoetry/virtualenvs/sd-deps-z4SYejYZ-py3.10/lib/python3.10/site-packages/git/remote.py\", line 1007, in fetch\r\n    res = self._get_fetch_info_from_stderr(proc, progress, kill_after_timeout=kill_after_timeout)\r\n  File \"/home/adam/.cache/pypoetry/virtualenvs/sd-deps-z4SYejYZ-py3.10/lib/python3.10/site-packages/git/remote.py\", line 848, in _get_fetch_info_from_stderr\r\n    proc.wait(stderr=stderr_text)\r\n  File \"/home/adam/.cache/pypoetry/virtualenvs/sd-deps-z4SYejYZ-py3.10/lib/python3.10/site-packages/git/cmd.py\", line 604, in wait\r\n    raise GitCommandError(remove_password_if_present(self.args), status, errstr)\r\ngit.exc.GitCommandError: Cmd('git') failed due to: exit code(128)\r\n  cmdline: git fetch -v -- origin --dry-run\r\n  stderr: 'fatal: couldn't find remote ref --dry-run'\n```\n\n\n### Additional information\n\n_No response_\n", "before_files": [{"content": "import os\r\nimport sys\r\nimport traceback\r\n\r\nimport time\r\nimport git\r\n\r\nfrom modules import paths, shared\r\n\r\nextensions = []\r\nextensions_dir = os.path.join(paths.data_path, \"extensions\")\r\nextensions_builtin_dir = os.path.join(paths.script_path, \"extensions-builtin\")\r\n\r\nif not os.path.exists(extensions_dir):\r\n    os.makedirs(extensions_dir)\r\n\r\ndef active():\r\n    return [x for x in extensions if x.enabled]\r\n\r\n\r\nclass Extension:\r\n    def __init__(self, name, path, enabled=True, is_builtin=False):\r\n        self.name = name\r\n        self.path = path\r\n        self.enabled = enabled\r\n        self.status = ''\r\n        self.can_update = False\r\n        self.is_builtin = is_builtin\r\n        self.version = ''\r\n\r\n        repo = None\r\n        try:\r\n            if os.path.exists(os.path.join(path, \".git\")):\r\n                repo = git.Repo(path)\r\n        except Exception:\r\n            print(f\"Error reading github repository info from {path}:\", file=sys.stderr)\r\n            print(traceback.format_exc(), file=sys.stderr)\r\n\r\n        if repo is None or repo.bare:\r\n            self.remote = None\r\n        else:\r\n            try:\r\n                self.remote = next(repo.remote().urls, None)\r\n                self.status = 'unknown'\r\n                head = repo.head.commit\r\n                ts = time.asctime(time.gmtime(repo.head.commit.committed_date))\r\n                self.version = f'{head.hexsha[:8]} ({ts})'\r\n\r\n            except Exception:\r\n                self.remote = None\r\n\r\n    def list_files(self, subdir, extension):\r\n        from modules import scripts\r\n\r\n        dirpath = os.path.join(self.path, subdir)\r\n        if not os.path.isdir(dirpath):\r\n            return []\r\n\r\n        res = []\r\n        for filename in sorted(os.listdir(dirpath)):\r\n            res.append(scripts.ScriptFile(self.path, filename, os.path.join(dirpath, filename)))\r\n\r\n        res = [x for x in res if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)]\r\n\r\n        return res\r\n\r\n    def check_updates(self):\r\n        repo = git.Repo(self.path)\r\n        for fetch in repo.remote().fetch(\"--dry-run\"):\r\n            if fetch.flags != fetch.HEAD_UPTODATE:\r\n                self.can_update = True\r\n                self.status = \"behind\"\r\n                return\r\n\r\n        self.can_update = False\r\n        self.status = \"latest\"\r\n\r\n    def fetch_and_reset_hard(self):\r\n        repo = git.Repo(self.path)\r\n        # Fix: `error: Your local changes to the following files would be overwritten by merge`,\r\n        # because WSL2 Docker set 755 file permissions instead of 644, this results to the error.\r\n        repo.git.fetch('--all')\r\n        repo.git.reset('--hard', 'origin')\r\n\r\n\r\ndef list_extensions():\r\n    extensions.clear()\r\n\r\n    if not os.path.isdir(extensions_dir):\r\n        return\r\n\r\n    paths = []\r\n    for dirname in [extensions_dir, extensions_builtin_dir]:\r\n        if not os.path.isdir(dirname):\r\n            return\r\n\r\n        for extension_dirname in sorted(os.listdir(dirname)):\r\n            path = os.path.join(dirname, extension_dirname)\r\n            if not os.path.isdir(path):\r\n                continue\r\n\r\n            paths.append((extension_dirname, path, dirname == extensions_builtin_dir))\r\n\r\n    for dirname, path, is_builtin in paths:\r\n        extension = Extension(name=dirname, path=path, enabled=dirname not in shared.opts.disabled_extensions, is_builtin=is_builtin)\r\n        extensions.append(extension)\r\n\r\n", "path": "modules/extensions.py"}], "after_files": [{"content": "import os\r\nimport sys\r\nimport traceback\r\n\r\nimport time\r\nimport git\r\n\r\nfrom modules import paths, shared\r\n\r\nextensions = []\r\nextensions_dir = os.path.join(paths.data_path, \"extensions\")\r\nextensions_builtin_dir = os.path.join(paths.script_path, \"extensions-builtin\")\r\n\r\nif not os.path.exists(extensions_dir):\r\n    os.makedirs(extensions_dir)\r\n\r\ndef active():\r\n    return [x for x in extensions if x.enabled]\r\n\r\n\r\nclass Extension:\r\n    def __init__(self, name, path, enabled=True, is_builtin=False):\r\n        self.name = name\r\n        self.path = path\r\n        self.enabled = enabled\r\n        self.status = ''\r\n        self.can_update = False\r\n        self.is_builtin = is_builtin\r\n        self.version = ''\r\n\r\n        repo = None\r\n        try:\r\n            if os.path.exists(os.path.join(path, \".git\")):\r\n                repo = git.Repo(path)\r\n        except Exception:\r\n            print(f\"Error reading github repository info from {path}:\", file=sys.stderr)\r\n            print(traceback.format_exc(), file=sys.stderr)\r\n\r\n        if repo is None or repo.bare:\r\n            self.remote = None\r\n        else:\r\n            try:\r\n                self.remote = next(repo.remote().urls, None)\r\n                self.status = 'unknown'\r\n                head = repo.head.commit\r\n                ts = time.asctime(time.gmtime(repo.head.commit.committed_date))\r\n                self.version = f'{head.hexsha[:8]} ({ts})'\r\n\r\n            except Exception:\r\n                self.remote = None\r\n\r\n    def list_files(self, subdir, extension):\r\n        from modules import scripts\r\n\r\n        dirpath = os.path.join(self.path, subdir)\r\n        if not os.path.isdir(dirpath):\r\n            return []\r\n\r\n        res = []\r\n        for filename in sorted(os.listdir(dirpath)):\r\n            res.append(scripts.ScriptFile(self.path, filename, os.path.join(dirpath, filename)))\r\n\r\n        res = [x for x in res if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)]\r\n\r\n        return res\r\n\r\n    def check_updates(self):\r\n        repo = git.Repo(self.path)\r\n        for fetch in repo.remote().fetch(dry_run=True):\r\n            if fetch.flags != fetch.HEAD_UPTODATE:\r\n                self.can_update = True\r\n                self.status = \"behind\"\r\n                return\r\n\r\n        self.can_update = False\r\n        self.status = \"latest\"\r\n\r\n    def fetch_and_reset_hard(self):\r\n        repo = git.Repo(self.path)\r\n        # Fix: `error: Your local changes to the following files would be overwritten by merge`,\r\n        # because WSL2 Docker set 755 file permissions instead of 644, this results to the error.\r\n        repo.git.fetch(all=True)\r\n        repo.git.reset('origin', hard=True)\r\n\r\n\r\ndef list_extensions():\r\n    extensions.clear()\r\n\r\n    if not os.path.isdir(extensions_dir):\r\n        return\r\n\r\n    paths = []\r\n    for dirname in [extensions_dir, extensions_builtin_dir]:\r\n        if not os.path.isdir(dirname):\r\n            return\r\n\r\n        for extension_dirname in sorted(os.listdir(dirname)):\r\n            path = os.path.join(dirname, extension_dirname)\r\n            if not os.path.isdir(path):\r\n                continue\r\n\r\n            paths.append((extension_dirname, path, dirname == extensions_builtin_dir))\r\n\r\n    for dirname, path, is_builtin in paths:\r\n        extension = Extension(name=dirname, path=path, enabled=dirname not in shared.opts.disabled_extensions, is_builtin=is_builtin)\r\n        extensions.append(extension)\r\n\r\n", "path": "modules/extensions.py"}]}