忽略与git diff中的字符串匹配的更改

dsh*_*erd 28 regex git diff

我对git中受版本控制的大量文件做了一个简单的更改,我希望能够检查没有其他更改正在进入这个大型提交.

这些变化都是形式

-                       "main()",
+                       OOMPH_CURRENT_FUNCTION,
Run Code Online (Sandbox Code Playgroud)

其中"main()"可以是任何函数的名称.我想生成不属于这种形式的所有更改的差异.

git diff的-G和-S选项非常接近 - 它们发现与字符串或正则表达式匹配的更改.

有没有办法做到这一点?

到目前为止的尝试

另一个问题描述了如何使用这种方法来否定正则表达式,我认为命令应该是

git diff -G '^((?!OOMPH_CURRENT_FUNCTION).)*$'
Run Code Online (Sandbox Code Playgroud)

但这只是返回错误消息

fatal: invalid log-grep regex: Invalid preceding regular expression
Run Code Online (Sandbox Code Playgroud)

所以我猜git不支持这个正则表达式功能.

我还注意到标准的unix diff有-I选项"忽略其行符合RE的变化".但我找不到用unix diff工具替换git自己的diff的正确方法.

Elm*_*ise 18

请尝试以下方法:

$ git diff > full_diff.txt
$ git diff -G "your pattern" > matching_diff.txt
Run Code Online (Sandbox Code Playgroud)

然后你可以这样比较两个:

$ diff matching_diff.txt full_diff.txt
Run Code Online (Sandbox Code Playgroud)

如果所有更改都与模式匹配,full_diff.txt并且matching_diff.txt将完全相同,则最后一个diff命令将不返回任何内容.

如果存在与模式不匹配的更改,则最后一个diff将突出显示这些更改.


您可以结合上述所有步骤,避免创建两个额外的文件,如下所示:

diff <(git diff -G "your pattern") <(git diff)  # works with other diff tools too
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,我看不到任何明显的问题(除了奇怪的输出格式),所以我接受它.谢谢!我仍然认为应该有更好的方法来做到这一点. (3认同)

Von*_*onC 10

不再需要grep!

在 Git 2.30(2021 年第一季度)中,“ git diffman命令系列学会了“ -I<regex>”选项,以忽略更改行都与给定模式匹配的大块头

请参阅Micha 的commit 296d4a9commit ec7967c(2020 年 10 月 20 日)?饼?( kempniu)
(由Junio C gitsterHamano合并-- --commit 1ae0949,2020 年 11 月 2 日)

diff: 添加-I<regex>忽略匹配更改

签字人:Micha?饼?

添加一个新的 diff 选项,该选项允许忽略所有行(已更改、已删除和已添加)与给定正则表达式匹配的更改。
这类似于独立实用程序中的-I/--ignore-matching-lines选项,diff可用于例如忽略仅影响代码注释的更改或在包含大量自动应用修改(例如树范围的字符串替换)的提交中查找不相关的更改。

-G/-S和新-I选项之间的区别在于后者基于每次更改过滤输出。

使用 'ignore' 字段xdchange_t将更改标记为忽略与否。
由于 使用相同的字段--ignore-blank-lines,因此相同的大块发射规则适用于--ignore-blank-lines-I
这两个选项也可以在同一个git调用中一起使用(它们相互补充)。

重命名xdl_mark_ignorable()xdl_mark_ignorable_lines(),以表明它在逻辑上是 的“兄弟”xdl_mark_ignorable_regex()而不是其“父”。

diff-options现在包括在其手册页中

-I<regex>

--ignore-matching-lines=<regex>

忽略所有行匹配的更改<regex>
可以多次指定此选项。

例子

git diff --ignore-blank-lines -I"ten.*e" -I"^[124-9]"
Run Code Online (Sandbox Code Playgroud)

diff -I<regexp>Git 2.31(2021 年第一季度)已更正“ ”中的一个小内存泄漏。

请参阅Ævar Arnfjörð Bjarmason ( ) 的commit c45dc9ccommit e900d49(2021 年 2 月 11 日(由Junio C Hamano合并-- --提交 45df6c4 中,2021 年 2 月 22 日)avar
gitster

diff: 从 regcomp() 上插入内存泄漏 {log,diff} -I

签字人:Ævar Arnfjörð Bjarmason

固定在内存泄漏296d4a9(“ diff:添加-I忽略匹配的变化”,二○二○年十月二十○日,GIT中v2.30.0-RC0 -合并中列出批#3)通过释放它分配的存储器中新引入的diff_free()

这种内存泄漏是在296d4a9中有意引入的,请参阅有关它的先前迭代讨论

当时释放内存有点乏味,但由于它不再是新引入的diff_free()让我们使用它。

让我们保留模式diff_free_file()并添加 a diff_free_ignore_regex(),即使(不像"diff_free_file")我们不需要在其他地方调用它。
我认为这将使代码更具可读性,而不是逐渐积累一个巨大的diff_free()函数,int i在不相关的代码之间共享“ ”等。


Ben*_*kin 7

使用git difftool运行实际diff.

例如:https://github.com/cben/kubernetes-discovery-samples/commit/b1e946434e73d8d1650c887f7d49b46dcbd835a6
我创建运行一个脚本diff我想(在这里我保持的方式curl --verbose输出的回购,导致无聊的每一次改变我重新运行卷曲):

diff --recursive --unified=1 --color \
     --ignore-matching-lines=serverAddress \
     --ignore-matching-lines='^\*  subject:' \
     --ignore-matching-lines='^\*  start date:' \
     --ignore-matching-lines='^\*  expire date:' \
     --ignore-matching-lines='^\*  issuer:' \
     --ignore-matching-lines='^< Date:' \
     --ignore-matching-lines='^< Content-Length:' \
     --ignore-matching-lines='--:--:--' \
     --ignore-matching-lines='{ \[[0-9]* bytes data\]' \
     "$@"
Run Code Online (Sandbox Code Playgroud)

而现在我可以运行git difftool --dir-diff --extcmd=path/to/above/script.sh并只看到有趣的变化.

关于GNU diff -Iaka的一个重要警告--ignore-matching-lines:这只是阻止这些行创建一个"有趣"的块,但是当这些更改出现在同一块中并且有其他未被忽略的更改时,它仍然会显示它们.我--unified=1上面用了通过减少块来减少这种影响(每次更改上下只有1个上下文行).