在提交之间使用 git-diff 忽略 *all* 空格更改

Posted

技术标签:

【中文标题】在提交之间使用 git-diff 忽略 *all* 空格更改【英文标题】:Ignore *all* whitespace changes with git-diff between commits 【发布时间】:2016-01-14 13:15:17 【问题描述】:

我正在检查一个代码库并修复空白奇怪并通常更正缩进和此类事情,我想确保我没有无意中进行任何其他更改,所以我正在做 git diff -w 以显示差异所有更改的文件,同时忽略空白差异。问题是这实际上并没有忽略 所有 空白差异——至少 认为仅仅是空白差异。例如,在git diff -w 的以下输出中,

-"Links":
-
-
-    "Thermal":
-
-
-
+  "Links": 
+    "Thermal": 

你可以看到我只有

    删除了多余的空行, 将花括号放在打开其值的键的行尾,然后 缩进以适应上下文

This question 一开始看起来可能会提供答案,但它处理的是两个特定文件之间的差异,而不是两个特定提交之间的差异。通过搜索发现的其他所有内容也都是死胡同。例如,this question 是关于合并,不显示差异,this question 处理显示词级差异等等。

【问题讨论】:

对于 Bitbucket 用户,有一个针对此问题的建议修复,但尚未编码,并且可能在有足够的兴趣之前不会。您可以访问 Bitbucket 网站并表示支持。我最初是在 Bitbucket 中搜索解决方案时找到当前页面的,所以如果有其他人遇到这种情况,请去here 投票! git difftool + kdiff3 是一种选择 【参考方案1】:

也许有更好的答案,但到目前为止我找到的最好的解决方案就是这个。

首先,您必须控制 Git 当前使用的“空白”的定义。

git config core.whitespace '-trailing-space,-indent-with-non-tab,-tab-in-indent'

接下来,您必须控制所用词的定义。不要只使用git diff -w,而是添加--word-diff-regex='[^[:space:]]'

git diff -w --word-diff-regex='[^[:space:]]'

您仍然会看到上下文,这(在我的情况下,因为我试图确保没有差异 除了 空白差异)没有帮助。你可以使用-U0告诉Git给你0行上下文,像这样,

git diff -w -U0 --word-diff-regex='[^[:space:]]'

但是你仍然会得到看起来很像上下文的输出,但它仍然比仔细和手动查看所有更改以确保它们只是空白更改要好得多。

您也可以在一个命令中完成以上所有操作。 -c 标志仅针对一个命令更改 git config。

git -c core.whitespace=-trailing-space,-indent-with-non-tab,-tab-in-indent diff -U0 --word-diff-regex='[^[:space:]]'

【讨论】:

@Torek - 又一个 Git 优点。为什么在没有所有空格的情况下很难区分???我在 Windows 机器上尝试评估 Visual Studio 项目文件的 PR。我不关心 CR、LF 或 CRLF 的差异,但这就是 Git 正在填充我的终端的内容。 人们不明白我为什么讨厌 git 无论如何要为其创建别名? @StR 您可以在 .gitconfig 中创建别名,并在您的 [alias] 部分中使用以下内容:diffw = diff -w -U0 --word-diff-regex=[^[:space:]] @NSjonas 我遇到了同样的错误。您需要添加引号。我编辑了答案中的命令。【参考方案2】:

忽略 所有 提交之间的 git-diff 空格更改

这个问题一开始看起来可能会提供答案,但它处理的是两个特定文件之间的差异,而不是两个特定提交之间的差异。通过搜索找到的其他所有内容也都是死胡同......

我认为您遇到了麻烦,因为 Git 不适合这项工作。它不会使任务变得容易,并且屈服于工具是错误的方法。工具应该为您工作,而不是反之亦然

执行第二次克隆,然后签出有问题的起始版本。然后使用您当前的版本对它们运行常规差异:diff -bur --ignore-all-space <dir1> <dir2>

这里是some of the options for diff

-i, --ignore-case
       ignore case differences in file contents

-E, --ignore-tab-expansion
       ignore changes due to tab expansion

-Z, --ignore-trailing-space
        ignore white space at line end

-b, --ignore-space-change
       ignore changes in the amount of white space

-w, --ignore-all-space
       ignore all white space

-B, --ignore-blank-lines
       ignore changes where lines are all blank

【讨论】:

在这种情况下,这些选项都没有帮助:diff 仍然将换行符视为与没有换行符不同。 使用最新的 git (v2.20.1):error: invalid option: -Z @MortezaZiaeemehr 该选项适用于diff 命令,而不是git 命令。这个答案建议使用 diff 工具,而不是使用 git 来完成手头的工作。 还有无效选项的问题。 --ignore-all-space--ignore-cr-at-eol 为我工作。

以上是关于在提交之间使用 git-diff 忽略 *all* 空格更改的主要内容,如果未能解决你的问题,请参考以下文章

如何使 git-diff 和 git log 忽略新文件和已删除文件?

在 git-diff 的输出中着色空白

如何让 diff 像 git-diff 一样工作?

VS Code 中 Commit、Commit Staged 和 Commit All 的区别

BeautifulSoup 不会使用 .find_all('a') 抓取页面中的所有锚标记。我忽略了啥吗?

git 忽略提交及已push过得文件忽略提交