没有评论的Git diff

r3b*_*00t 5 ruby git

假设我在文件中添加了两行hello.rb.

# this is a comment
puts "hello world"
Run Code Online (Sandbox Code Playgroud)

如果我这样做git diff,它会显示我添加了两行.

我不希望git显示任何Ruby注释的行.我试过用git diff -G <regular expression>,但它对我不起作用.我怎么这样做git diff,它不会显示任何Ruby评论?

小智 5

一种可能性是(ab)使用创建差异之前应用的git 的textconv 过滤器,因此您甚至可以转换二进制格式以获得人类可读的差异。

您可以使用任何从文件读取并写入标准输出的脚本,例如删除所有以 开头的行#

#!/bin/sh
grep -v "^\s*#" "$1" || test $? = 1
Run Code Online (Sandbox Code Playgroud)

test $? = 1更正 的退出代码grep,详情参见/sf/answers/3473959961/。)

对于 C,有一个sed删除注释的脚本,我将在以下示例中使用它。下载脚本:

cd ~/install
wget http://sed.sourceforge.net/grabbag/scripts/remccoms3.sed
chmod +x remccoms3.sed
Run Code Online (Sandbox Code Playgroud)

将其添加到您的~/.gitconfig

[diff "strip-comments"]
         textconv=~/install/remccoms3.sed
Run Code Online (Sandbox Code Playgroud)

将其添加到存储库.gitattributes以针对某些文件类型启用它:

*.cpp diff=strip-comments
*.c diff=strip-comments
*.h diff=strip-comments
Run Code Online (Sandbox Code Playgroud)

主要缺点是默认情况下它将始终启用,您可以使用--no-textconv.


Jan*_*hoł 3

Git 非常关心您提供给它的数据,并且非常努力不丢失任何信息。对于 Git 来说,将某些行视为没有更改(如果它们已更改)是没有意义的。

我认为唯一合理的方法是对 Git 输出进行后处理,正如 Dogbert 在他的评论中已经表明的那样。