这个问题是关于将 git 与nbstripout过滤器一起使用,它会在将 jupyter notebook(一个 JSON 文件)存储在 git 下之前从其中删除一些字段。当多个开发人员使用同一个笔记本时,剥离过滤器用于最小化冲突。
所以repo配置开始:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@github.com:stas00/fastai_v1.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[include]
path = ../.gitconfig
$ cat .gitconfig
[filter "nbstripout"]
clean = nbstripout
smudge = cat
required = true
[diff "ipynb"]
textconv = nbstripout -t
$ cat .gitattributes
*.ipynb filter=nbstripout
*.ipynb diff=ipynb
Run Code Online (Sandbox Code Playgroud)
在使用此配置期间git diff或git commit笔记本通过过滤器运行时,该过滤器会删除本地的 json 字段(如单元格的execution_count),并且会因开发人员而异。
现在考虑一个正常情况,即同一笔记本在上游和本地发生变化。尝试将本地存储库与上游同步失败:
$ git pull origin master
From github.com:stas00/fastai_v1
* branch master -> FETCH_HEAD
Updating 1ea49ad..ae0ba93
error: Your local changes to the following files would be overwritten by merge:
dev_nb/004_callbacks.ipynb
Please commit your changes or stash them before you merge.
Aborting
$ git diff dev_nb/004_callbacks.ipynb | wc -l
60
$ git stash
Saved working directory and index state WIP on pull-merge: 1ea49ad Console progress bar
$ git diff dev_nb/004_callbacks.ipynb | wc -l
0
$ git pull origin master
From github.com:stas00/fastai_v1
* branch master -> FETCH_HEAD
Updating 1ea49ad..ae0ba93
error: Your local changes to the following files would be overwritten by merge:
dev_nb/004_callbacks.ipynb
Please commit your changes or stash them before you merge.
Aborting
Run Code Online (Sandbox Code Playgroud)
这不应该发生,因为git stash应该隐藏所有本地更改。我不太确定到底发生了什么,但我认为git stash也可以通过过滤器运行,它只隐藏通过 nbstripout 过滤器显示的更改。所以也许git stash并没有完全将文件带到修改前的状态?然而,在我禁用过滤器之后,git diff什么也没有显示(在禁用它之前也没有)。
换句话说,为什么会git pull看到潜在的冲突并且不会合并,即使git diff显示不存在本地更改(但实际上确实存在,它们只是通过过滤器剥离的更改)。
至少我希望git diff在禁用剥离过滤器后显示更改,但事实并非如此。
为了完成这项git stash; gist pull工作,我必须在运行之前禁用过滤器git stash。
$ nbstripout --uninstall
$ git stash
Saved working directory and index state WIP on pull-merge: 1ea49ad Console progress bar
$ git pull origin master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:stas00/fastai_v1
* branch master -> FETCH_HEAD
1ea49ad..ae0ba93 master -> origin/master
Updating 1ea49ad..ae0ba93
Fast-forward
dev_nb/004_callbacks.ipynb | 1268 ----------------------------------------------------------------------------------------------------------------------------------------
1 file changed, 1268 deletions(-)
Run Code Online (Sandbox Code Playgroud)
现在我必须记住重新启用过滤器:
$ nbstripout --install
Run Code Online (Sandbox Code Playgroud)
是否有更好的工作流程不需要禁用/启用过滤器即可工作?