2015-10-15 187 views
29

我正在经历一个代码库并修复空白的怪异问题,并且通常会校正缩进和这样的事情,并且我想确保我没有无意中做出任何其他更改,所以我在做git diff -w以显示所有更改的文件的差异,同时忽略空白的差异。问题是这实际上并没有忽略所有的空格的差异 - 至少什么认为只是空白的差异。例如,在从git diff -w输出以下,忽略*所有*空格在提交之间随着git-diff的变化

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

你可以看到,我只有

  1. 去除多余的空行,上的行结束
  2. 把大括号其关键他们打开值,
  3. 缩进适合上下文

This question看起来像它可能会提供一个答案,但它处理两个具体的文件之间的差异,而不是两个具体的承诺之间的差异。搜索出现的其他一切也都是死路一条。例如,this question是关于合并,不显示差异,并且this question涉及显示字级差异,等等。

回答

24

也许有更好的答案,但我迄今发现的最佳解决方案是这样的。

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

@Torek - 又一块Git的善良。为什么在地狱里很难区分所有空白?我正在试图在Visual Studio项目文件上评估PR的Windows计算机上。我不在乎CR,LF或CRLF的差异,但这就是Git填补我的终端的地方。 – jww

9

忽略用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 
0

对于用户到位桶,有此一建议修复,但尚未进行编码,并且可能不会,直到有足够的兴趣。您可以访问Bitbucket站点并显示您的支持。我最初在Bitbucket中搜索解决方案时找到当前页面,所以如果在这种情况下有其他人,请去here并投票!