git-add 和 git-diff 使用不同的差异工具?
git-add and git-diff use different diff tools?
TL;DR 我配置了一个 difftool,git-diff
给出了“智能”差异,但 git-add
创建了“愚蠢”的大块头。为什么?
我将 difftool 配置为使用 nbdime 和 nbdime config-git --enable --global
,我认为这基本上只是将这些行添加到我的 .gitconfig:
[diff "jupyternotebook"]
command = git-nbdiffdriver diff
[merge "jupyternotebook"]
driver = git-nbmergedriver merge %O %A %B %L %P
name = jupyter notebook merge driver
[difftool "nbdime"]
cmd = git-nbdifftool diff \"$LOCAL\" \"$REMOTE\" \"$BASE\"
[difftool]
prompt = false
[mergetool "nbdime"]
cmd = git-nbmergetool merge \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[mergetool]
prompt = false
现在 git diff
给出了我期望的良好输出:
nbdiff /var/folders/6b/03yw1pts2nx_q8vftrh6fv140000gp/T//FILE.ipynb FOLDER/FILE.ipynb
--- /var/folders/6b/03yw1pts2nx_q8vftrh6fv140000gp/T//FILE.ipynb 2022-05-17 14:29:39.937318
+++ FOLDER/FILE.ipynb 2022-05-17 14:09:45.222229
## inserted before /cells/0:
+ code cell:
+ source:
+ ...
+ markdown cell:
+ source:
+ ...
## deleted /cells/0:
- markdown cell:
- source:
- ...
## inserted before /cells/2:
+ code cell:
+ source:
+ ...
但如果我这样做 git add -e FOLDER/FILE.ipynb
,它会给我一个“非常糟糕”的差异:
diff --git a/FOLDER/FILE.ipynb b/FOLDER/FILE.ipynb
index 3a1540c..17363f8 100644
--- a/FOLDER/FILE.ipynb
+++ b/FOLDER/FILE.ipynb
@@ -1,621 +1,716 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- ...
- ]
- },
- ... almost every line in the file is removed
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "j1qKT6qtAYEj"
+ },
+ "outputs": [],
+ "source": [
+ ...
+ ]
+ },
+ ... almost every line in the file is added back
我可能对 git-add 的作用存在根本性的误解,但为什么 git add
不使用 nbdime diff 工具?有没有一种方法可以只添加我在 git-diff
中看到的更改?
git add -e
和 git add -p
都需要能够理解 edited 差异。一般来说,他们对差异的理解有限,需要来自普通 git diff
的“愚蠢”格式。 nbdime
工具将原始文件分开,re-shuffle 将它们变成可用的文本,然后区分可用的文本,1 但这实际上不是 在 文件中,git add -e
需要处理文件中的内容,而不是其中的一些cleaned-up 介绍。
1文件中的内容是 machine-readable JSON。 nbdime
工具的结果似乎是 yaml。如果 Git 有一个本地 JSON 差异引擎,git add -p
和公司将能够处理结果,但 Git 没有,所以它不是。如果 Jupyter-notebooks 使用 yaml,Git 的 line-oriented 工具可以处理它们,但是 Jupyter-notebooks 没有,所以不是。
TL;DR 我配置了一个 difftool,git-diff
给出了“智能”差异,但 git-add
创建了“愚蠢”的大块头。为什么?
我将 difftool 配置为使用 nbdime 和 nbdime config-git --enable --global
,我认为这基本上只是将这些行添加到我的 .gitconfig:
[diff "jupyternotebook"]
command = git-nbdiffdriver diff
[merge "jupyternotebook"]
driver = git-nbmergedriver merge %O %A %B %L %P
name = jupyter notebook merge driver
[difftool "nbdime"]
cmd = git-nbdifftool diff \"$LOCAL\" \"$REMOTE\" \"$BASE\"
[difftool]
prompt = false
[mergetool "nbdime"]
cmd = git-nbmergetool merge \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[mergetool]
prompt = false
现在 git diff
给出了我期望的良好输出:
nbdiff /var/folders/6b/03yw1pts2nx_q8vftrh6fv140000gp/T//FILE.ipynb FOLDER/FILE.ipynb
--- /var/folders/6b/03yw1pts2nx_q8vftrh6fv140000gp/T//FILE.ipynb 2022-05-17 14:29:39.937318
+++ FOLDER/FILE.ipynb 2022-05-17 14:09:45.222229
## inserted before /cells/0:
+ code cell:
+ source:
+ ...
+ markdown cell:
+ source:
+ ...
## deleted /cells/0:
- markdown cell:
- source:
- ...
## inserted before /cells/2:
+ code cell:
+ source:
+ ...
但如果我这样做 git add -e FOLDER/FILE.ipynb
,它会给我一个“非常糟糕”的差异:
diff --git a/FOLDER/FILE.ipynb b/FOLDER/FILE.ipynb
index 3a1540c..17363f8 100644
--- a/FOLDER/FILE.ipynb
+++ b/FOLDER/FILE.ipynb
@@ -1,621 +1,716 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- ...
- ]
- },
- ... almost every line in the file is removed
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "j1qKT6qtAYEj"
+ },
+ "outputs": [],
+ "source": [
+ ...
+ ]
+ },
+ ... almost every line in the file is added back
我可能对 git-add 的作用存在根本性的误解,但为什么 git add
不使用 nbdime diff 工具?有没有一种方法可以只添加我在 git-diff
中看到的更改?
git add -e
和 git add -p
都需要能够理解 edited 差异。一般来说,他们对差异的理解有限,需要来自普通 git diff
的“愚蠢”格式。 nbdime
工具将原始文件分开,re-shuffle 将它们变成可用的文本,然后区分可用的文本,1 但这实际上不是 在 文件中,git add -e
需要处理文件中的内容,而不是其中的一些cleaned-up 介绍。
1文件中的内容是 machine-readable JSON。 nbdime
工具的结果似乎是 yaml。如果 Git 有一个本地 JSON 差异引擎,git add -p
和公司将能够处理结果,但 Git 没有,所以它不是。如果 Jupyter-notebooks 使用 yaml,Git 的 line-oriented 工具可以处理它们,但是 Jupyter-notebooks 没有,所以不是。