43

我对 git 中受版本控制的大量文件进行了一次简单的更改,我希望能够检查是否没有其他更改滑入这个大型提交。

变化都是形式

-                       "main()",
+                       OOMPH_CURRENT_FUNCTION,

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

git diff 的 -G 和 -S 选项非常接近——它们会找到与字符串或正则表达式匹配的更改。

有没有好的方法来做到这一点?

迄今为止的尝试

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

git diff -G '^((?!OOMPH_CURRENT_FUNCTION).)*$'

但这只是返回错误消息

fatal: invalid log-grep regex: Invalid preceding regular expression

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

我还注意到标准的 unix diff 具有 -I 选项来“忽略行都匹配 RE 的更改”。但是我找不到用 unix diff 工具替换 git 自己的 diff 的正确方法。

4

4 回答 4

24

尝试以下操作:

$ git diff > full_diff.txt
$ git diff -G "your pattern" > matching_diff.txt

然后,您可以像这样比较两者:

$ diff matching_diff.txt full_diff.txt

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

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


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

diff <(git diff -G "your pattern") <(git diff)  # works with other diff tools too
于 2013-04-09T10:10:01.210 回答
18

不再需要 grep!

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

请参阅Michał Kępień ( ) 的提交 296d4a9提交 ec7967c(2020 年 10 月 20 日(由Junio C Hamano 合并 -- --提交 1ae0949中,2020 年 11 月 2 日)kempniu
gitster

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

签字人:Michał Kępień

添加一个新的 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]"

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

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

diff: 堵住 regcomp() 的内存泄漏{log,diff} -I

签字人:Ævar Arnfjörð Bjarmason

通过释放引入的. diff_diff_free()

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

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

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

于 2020-11-09T20:14:41.873 回答
12

使用git difftool运行一个真正的diff.

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

#!/bin/bash
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\]' \
     "$@"

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

关于 GNU diff -Iaka的一个重要警告--ignore-matching-lines:这只是防止此类行使块“有趣”,但是当这些更改与其他未忽略的更改出现在同一块中时,它仍会显示它们。我在--unified=1上面使用通过使块更小来减少这种影响(每次更改上方和下方只有 1 个上下文行)。

于 2018-07-08T13:35:12.923 回答
0

我认为我使用管道和grep. 我有两个文件需要检查不包括@@and的差异g:,所以我这样做了(从这里这里这里借用:

$ git diff -U0 --color-words --no-index file1.tex file2.tex | grep -v -e "@@" -e "g:"

这似乎起到了作用。颜色仍然存在。

所以我假设你可以采用更简单的git diff命令/输出并做同样的事情。我喜欢这个的是它不需要制作新文件或重定向(管道除外)。

于 2019-06-29T02:46:11.953 回答