git-add 和 git-diff 使用不同的差异工具?

git-add and git-diff use different diff tools?

TL;DR 我配置了一个 difftool,git-diff 给出了“智能”差异,但 git-add 创建了“愚蠢”的大块头。为什么?

我将 difftool 配置为使用 nbdimenbdime 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 -egit 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 没有,所以不是。