我试图使用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\'' …