GeezerVison is showing github.com — Repo.index.reset fails on windows · Issue #1630 · gitpython-developers/GitPython
Repo.index.reset fails on windows #1630DescriptionHow to reproduce
- clone any repo
- edit a tracked file
- in python, try to reset with
Repo().index.reset(working_tree=True)
You will get a stack trace.
Step by step recipe:
$ git clone https://github.com/gitpython-developers/GitPython git-python
$ cd git-python
$ python -m venv --prompt git venv
$ .\venv\Scirpts\Activate.ps1 # or whatever script is appropriate for you
$ rm pyproject.toml # make any edit
$ git status -sb
## main...origin/main
D pyproject.toml
$ python
>>> from git import Repo
>>> repo.index.reset(working_tree=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\<user>\code\git-python\git\index\util.py", line 103, in check_default_index
return func(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\<user>\code\git-python\git\index\base.py", line 1320, in reset
new_inst = type(self).from_tree(self.repo, commit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\<user>\code\git-python\git\index\base.py", line 367, in from_tree
repo.git.read_tree(*arg_list, **kwargs)
File "C:\Users\<user>\code\git-python\git\cmd.py", line 739, in <lambda>
return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user>\code\git-python\git\cmd.py", line 1312, in _call_process
return self.execute(call, **exec_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\<user>\code\git-python\git\cmd.py", line 1107, in execute
raise GitCommandError(redacted_command, status, stderr_value, stdout_value)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
cmdline: git read-tree --index-output=C:\Users\<user>\code\git-python\.git\tmpxnmxtmmu HEAD
stderr: 'fatal: unable to write new index file'
Expectation
I was expecting the result would be the equivalent of git reset --hard HEAD. Am I doing something incorrectly here? I'm unfamiliar with Windows, so it's quite possible. ActivityByron commented on Aug 19, 2023 Maybe git itself is reading the index and GitPython fails to overwrite it shortly after. It's a known Windows filesystem issue.
As a workaround, one should be able to use repo.git.reset(…) to invoke git directly, possibly after changing the index using GitPython. suvayu commented on Aug 20, 2023 Thanks for the confirmation. For now I have worked around it with Repo.head.reset(working_tree=True) When I get some time, I'll experiment a bit and try to understand this better. EliahKagan commented on Dec 1, 2023 This happens because IndexFile.from_tree (used by IndexFile.reset) uses NamedTemporaryFile in a way that works on Unix-like systems but on Windows prevents git read-tree from overwriting the file by moving its own temporary file to its location. I've proposed a fix in #1751. Reacted by Sebastian Thiel Reacted by Suvayu Ali
MetadataMetadataDevelopmentNo branches or pull requestsIssue actions
|