有没有一种方法可以在Git diff中仅显示空格差异?

17

我想将所有空格更正单独提交,以保持其他内容免受空格更改的影响。

使用类似于以下命令的 git diff 命令很容易过滤掉空格差异:git diff --ignore-space-change

git diff --ignore-all-space --ignore-space-change --ignore-space-at-eol --ignore-blank-lines

但是我该如何列出仅包含空白差异的列表?

(获取仅存在空白差异的文件列表也很有用,这样我就可以直接将它们全部添加而不需要通过git add -p来挑选空白差异了。不过我想这只是次要的。)


1
你的第二个问题是 diff -u <(git diff --stat --ignore-all-space --ignore-space-change --ignore-space-at-eol --ignore-blank-lines) <(git diff --stat),也许可以这样解决? - Ry-
2个回答

3
这是一种实现方式:
  • Start with a clean working directory (e.g. git reset --hard)

  • Use Whitespace Total Fixer to clean up all the whitespace errors. There are options to fix or ignore various issues but the default may be fine:

      find . -name "*.whatever_extension_you_need" -exec wtf -v -i {} \;
    
  • git diff will now show only the whitespace changes

  • Stage and commit the whitespace-only changes.

(值得一提的是,我写了wtf;如果看起来像是无耻的自我宣传,我很抱歉,但我确实是为这种情况而写的,即存储库反复出现空格问题导致您的提交混乱。)

您还可以使用wtf仅仅检查空格错误,而不是直接修复它们。这不会影响您的文件,但它会向stderr打印一条(希望有帮助的)消息,告诉您发现的问题。

> find . -name "*.whatever_extension_you_need" -exec wtf -v {} \; > /dev/null

nightmare.txt LINE 8: WARNING: spaces followed by tabs in whitespace at beginning of line
nightmare.txt:
    CHOPPED 1 lines with trailing space
    CHOPPED 0 blank lines at EOF
    ADDED newline at EOF
    CHANGED 1 line endings which didn't match crlf from first line
    WARNED ABOUT 1 lines with tabs/spaces mix

3
在我看来,毫不羞耻地自我推销没有任何问题!感谢你写下这篇文章和回答。我有机会时会测试一下它。 - iconoclast
1
有史以来最好的起源故事 :) - cxw
1
如果我理解正确,这个答案将会隔离空格错误的差异(例如,如果只有一个提交混合了制表符和空格或在行末留下了空格),但不会隔离非错误的空格差异(例如,如果代码块在一个分支上缩进更深,可能是因为不同的编辑器设置或代码中有额外的嵌套层级)。 - Joshua Goldberg
1
@Dan Lenski - 请问@Joshua Goldberg的评论(即上面的评论)是否正确?(顺便说一句:wtf看起来是一个很棒的工具,感谢您的制作!) - Johnny Utahh
是的,@JoshuaGoldberg的评论是正确的。wtf将会找到(并修复!)空格错误,但它不会找到任意的空格差异。 - Dan Lenski

3
你可以暂时将空格差异应用于原始文件或其副本。然后,您可以使用diff或git diff进行比较,再恢复到原始状态。
在存储库中,您可以根据您要比较的内容来执行类似Add only non-whitespace changes建议的操作。例如:
git diff -U0 -w -b --ignore-blank-lines --no-color | git apply --ignore-whitespace --unidiff-zero -
git diff

当我想对非git文件进行此操作并使用进程替换时,我使用了一个小脚本来使用临时文件完成相同的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接