git diff——ignore-matching-lines忽略所有行



我试图使用git的--ignore-matching-lines,但遇到一些奇怪的行为。下面是普通git diff的输出:

$ git diff test.txt
diff --git a/test.txt b/test.txt
index 602c47d1cb..82655814c5 100644
--- a/test.txt
+++ b/test.txt
@@ -1,5 +1,7 @@
-Hello world
+Hello whitespace world
+

Lots of blank lines

Goodbye world
+
但是,如果我运行
$ git diff --ignore-matching-lines='^$' test.txt

没有输出

为什么忽略了添加单词whitespace的更改?

这可能是由如何解释'$'本身引起的,如Sjoerd Langkemper(也是Stack Overflow用户)在"git diff --ignore-matching-lines如何工作"中所述:

Git在每行上运行每个正则表达式。
这些行以换行符结束,因此我们的regex实际上是根据

进行检查的:
His bill will hold more than his belican,n

其中n表示换行符

当我们有一个变化,增加了一个空行,regex运行针对一个单字节字符串组成的n.
我们如何匹配?

使用--ignore-blank-lines这样的命令来忽略空行更容易。

(顺便检查一下,如果git diff --ignore-blank-line在您的特定情况下是一个好的选择)

然而,这不能很好地与我们想要忽略的其他正则表达式一起工作。
如果我们想忽略既执行无趣的腹部相关更改又添加无趣的空行的更改,则我们给-I的正则表达式需要匹配这两个更改以隐藏更改。
所以我们需要一个匹配空行的正则表达式,--ignore-blank-lines和其他与空白相关的选项不会改变这一点。

空行不能与^$匹配

  • ^匹配行首和缓冲区首。
  • 同样,$匹配行尾作为缓冲区的结束。

所有更改的行都以换行符结束,就在缓冲区结束之前。
这意味着^$匹配每个更改的行.
末尾的换行符开始一个新的行,并紧跟着缓冲区的末尾。

… his belican,n
↑
^ matches because n starts a new line
$ matches because the buffer ends here
这就解释了为什么--ignore-matching-lines='^$'忽略了添加单词whitespace的更改:它忽略了所有行!

为了更精确地匹配,我们可以使用`匹配缓冲区的开始,'匹配缓冲区的结束。
空行可以这样匹配:

`n'

其中n是一个实际的换行符,而不是backslash-n.
在shell中需要大量转义才能正确输入:

git diff -I $'\`n\'' …

最新更新