jupyterhub / jupyterhub/nbgitpuller

Sync fails after deleting previously changed file

Open
#254 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Python
Stars
237
Forks
86
PR merge metrics
No merged PRs in 30d

Description

### Bug description
If you change a file locally, then sync, then delete the file, following sync operations will fail.

image

Text of the error message

```
$ git fetch
From https://github.com/jdmansour/testrepo
3024da6..a725b72 main -> origin/main
$ git -c user.email=nbgitpuller@nbgitpuller.link -c user.name=nbgitpuller merge -Xours origin/main
error: Your local changes to the following files would be overwritten by merge:
README.md
Traceback (most recent call last):
File "/opt/tljh/user/lib/python3.9/threading.py", line 973, in _bootstrap_inner
self.run()
File "/opt/tljh/user/lib/python3.9/threading.py", line 910, in run
self._target(*self._args, **self._kwargs)
File "/opt/tljh/user/lib/python3.9/site-packages/nbgitpuller/handlers.py", line 88, in pull
raise e
File "/opt/tljh/user/lib/python3.9/site-packages/nbgitpuller/handlers.py", line 82, in pull
for line in gp.pull():
File "/opt/tljh/user/lib/python3.9/site-packages/nbgitpuller/pull.py", line 146, in pull
yield from self.update()
File "/opt/tljh/user/lib/python3.9/site-packages/nbgitpuller/pull.py", line 287, in update
yield from execute_cmd([
File "/opt/tljh/user/lib/python3.9/site-packages/nbgitpuller/pull.py", line 45, in execute_cmd
raise subprocess.CalledProcessError(ret, cmd)
subprocess.CalledProcessError: Command '['git', '-c', 'user.email=nbgitpuller@nbgitpuller.link', '-c', 'user.name=nbgitpuller', 'merge', '-Xours', 'origin/main']' returned non-zero exit status 128.
```

#### Expected behaviour
I would expect the deleted file to be pulled again from the remote repository.

#### Actual behaviour
Sync fails with the above error message.

### How to reproduce
1. Checkout a repository with nbgitpuller
2. Make a change to a file `README.md`, then sync. The local change will be kept.
3. Delete `README.md` locally. (Optionally sync)
4. Add another file `new_file.txt` to the remote repository, then attempt to sync.

I have added a test to reproduce the problem here: https://github.com/jdmansour/nbgitpuller/commit/cf259693fc5834a196ac7efd6f22ccf945ff251e

Status of the git repository right before step 4

```
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
deleted: README.md

no changes added to commit (use "git add" and/or "git commit -a")
----------------

$ git log --raw
commit 1659637688293df7a351a78113a87331d46bffc7
Author: nbgitpuller
Date: Tue Mar 15 12:22:29 2022 +0100

Automatic commit by nbgitpuller

:100644 100644 b6fc4c6 3b8cc22 M README.md

commit 6a0a1590b23a484dbf8b2e315300fc4978d68bcd
Author: pusher
Date: Tue Mar 15 12:22:29 2022 +0100

Ignore the message

:000000 100644 0000000 b6fc4c6 A README.md
----------------

$ git diff
diff --git a/README.md b/README.md
deleted file mode 100644
index 3b8cc22..0000000
--- a/README.md
+++ /dev/null
@@ -1 +0,0 @@
-student changed
\ No newline at end of file
```

Output of git during the test

```
puller: $ git clone --depth 1 --branch master -- file:///Users/jason/src/nbgitpuller/remote puller
puller: Cloning into 'puller'...
puller: $ git fetch
puller: $ git -c user.email=nbgitpuller@nbgitpuller.link -c user.name=nbgitpuller commit -am Automatic commit by nbgitpuller --allow-empty
puller: [master 1659637] Automatic commit by nbgitpuller
puller: 1 file changed, 1 insertion(+), 1 deletion(-)
puller: $ git -c user.email=nbgitpuller@nbgitpuller.link -c user.name=nbgitpuller merge -Xours origin/master
puller: Already up to date.
puller: $ git fetch
puller: From file:///Users/jason/src/nbgitpuller/remote
puller: 6a0a159..7d298d5 master -> origin/master
puller: $ git checkout origin/master -- README.md
puller: $ git -c user.email=nbgitpuller@nbgitpuller.link -c user.name=nbgitpuller merge -Xours origin/master
puller: error: Your local changes to the following files would be overwritten by merge:
puller: README.md
```

If you go step by step through the commands nbgitpuller is running, what happens is that before the last `git merge`, there will be a staged but not committed change to `README.md`. This causes the merge to fail. Unfortunately I don't understand nbgitpuller's merge strategy very well, so I'm not sure how to fix it. Unstaging the change before merge gets rid of the error message, but I don't know if that is the right solution.

### Your personal set up
I am using TLJH in a fairly vanilla configuration, installed via `https://tljh.jupyter.org/bootstrap.py`.

- OS: Ubuntu 20.04
- Version(s):
- /opt/tljh/hub/bin/jupyterhub --version: 1.5.0
- /opt/tljh/hub/bin/python --version: Python 3.8.10
- /opt/tljh/user/bin/python --version: Python 3.9.7

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.