忽略*所有*空格在提交之间使用git-diff进行更改

时间:2015-10-15 22:13:03

标签: git diff git-diff

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

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

你可以看到我只是

  1. 删除了多余的空白行
  2. 将大括号放在键打开的行的末尾,并打开
  3. 缩进以适合上下文
  4. This question看起来可能会首先提供答案,但它会处理两个特定文件之间的差异,而不是两个特定提交之间的差异。通过搜索发现的其他一切也是一个死路一条。例如,this question是关于合并,而不是显示差异,this question涉及显示字级差异,等等。

2 个答案:

答案 0 :(得分:47)

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

首先,你必须控制" whitespace"的定义。 Git目前正在使用。在项目中创建或编辑.gitconfig,以包含

[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:]]

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

答案 1 :(得分:27)

  

使用提交之间的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