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


77

我正在检查代码库并修复空白奇数问题,并且通常会纠正缩进等问题,并且我想确保自己没有无意进行任何其他更改,因此我git diff -w打算在忽略空白的同时显示所有已更改文件中的差异。差异。问题在于,这实际上并没有忽略所有空白差异,至少认为仅仅是空白差异。例如,在以下来自的输出中git diff -w

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

你可以看到我只有

  1. 删除了多余的空白行,
  2. 将花括号放在要打开其值的键行的末尾,然后
  3. 缩进以适合上下文

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


1
对于Bitbucket用户,有一个针对此的建议修复程序,但是尚未进行编码,并且可能直到有足够的兴趣后才进行编码。您可以转到Bitbucket网站并显示您的支持。我最初在Bitbucket中寻找解决方案时找到了当前页面,因此,如果在这种情况下还有其他解决方案,请点击此处进行投票!
paultamalunas

git difftool+ kdiff3是一种选择
蒂姆·阿贝尔

Answers:


66

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

首先,您必须控制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:]]'

2
@Torek-另一个Git优点。为什么在地狱中没有所有空格很难比较???我正在尝试评估Visual Studio项目文件上的PR的Windows计算机上。我不在乎CR,LF或CRLF的差异,但这就是Git填补我的终端的原因。
jww

2
人们不明白我为什么讨厌git
Gerry

无论如何要为其创建别名?
StR

2
@StR,您可以在.gitconfig[alias]节中添加以下内容的别名:diffw = diff -w -U0 --word-diff-regex=[^[:space:]]
mattwright

1
@NSjonas我遇到了同样的错误。您需要添加引号。我在答案中编辑了命令。
6

34

忽略两次提交之间使用git-diff进行的所有空格更改

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

我认为您遇到了麻烦,因为Git是这项工作的错误工具。这并不容易完成任务,而屈服于容纳工具是错误的方法。工具应该对您有用,反之亦然

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

以下是一些用于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

2
在这种情况下,这些选项均无济于事:diff仍将换行与不换行视为不同。
吉尔(Gilles)'“ SO-别再邪恶了”

1
最新的git(v2.20.1):error: invalid option: -Z
Morteza Ziyae,

4
@MortezaZiaeemehr该选项适用于diff命令,而不是git命令。此答案建议使用diff工具,而不是将git用于手头的工作。
萨拉夫

也有无效选项的问题。--ignore-all-space--ignore-cr-at-eol为我工作。
mix3d
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.